[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

"svn log" can error silently

From: Karl Fogel <kfogel_at_newton.ch.collab.net>
Date: 2002-07-20 03:20:50 CEST

Congratulations to Brane -- his name is the first non-ascii UTF-8 data
ever in our log messages.

Guess how I know? :-)

Turns out that if i18n conversion is broken for you, as it is
currently for me, "svn log" can die in

   subversion/clients/cmdline/log-cmd.c:log_message_receiver

on one of these lines

  [...]
  SVN_ERR (svn_utf_cstring_from_utf8 (&author_native, author, pool));
  SVN_ERR (svn_utf_cstring_from_utf8 (&date_native, date, pool));
  SVN_ERR (svn_utf_cstring_from_utf8 (&msg_native, msg, pool));
  [...]

That's all fine and expected; the problem is that the error is
silently lost, and "svn log" exits with no output. Recall that
log_message_receiver is invoked as an anonymous callback from

   subversion/libsvn_ra_dav/log.c:log_end_element

The code there looks like this:

  [...]
  case ELEM_log_item:
    {
      svn_error_t *err = (*(lb->receiver))(lb->receiver_baton,
                                           lb->changed_paths,
                                           lb->revision,
                                           lb->author,
                                           lb->date,
                                           lb->msg,
                                           lb->subpool);
      
      reset_log_item (lb);
      
      if (err)
        {
          lb->err = err; /* ### Wrap an existing error, if any? */
          return NE_XML_INVALID; /* ### Any other way to express an err? */
        }
    }
    break;
  [...]

I haven't traced back further than that, but presumably the response
parser as a whole should notice that its callback, log_end_element,
returned non-zero and somehow signal an error up to its caller. And I
mean, we *do* stash the original error into lb->err, just as though
someone's going to use it someday... :-).

I have to run right now, posting this here in case anyone wants to
take a look.

-K

P.S. Oh, as for why i18n is broken on my RedHat Linux box: basically,
  we don't know yet. It worked before the apr_xlate stuff moved to
  apr-util, now it doesn't. iconv_open() always fails, not sure why.
  Possibly some bogus iconv library is shadowing the good one in my
  libc, just like that Solaris box we were talking about on the dev
  list? It doesn't seem to matter if I configure shared or static.
  Configuration of apr-util reports that it finds iconv:

     checking for iconv in -liconv... no
     checking for iconv... yes
     checking for type of inbuf parameter to iconv... char **
     checking for iconv.h... yes

  and everything builds fine, it's purely a run-time problem. In
  apr_xlate_open, the call to iconv_(_open) looks like this in gdb:
  iconv_open (tocode=0x80e6fda "UTF-8", fromcode=0x80e735b "ISO8859-1")
  ...and it fails, returning -1, causing apr_xlate_open to return
  APR_EINVAL. Well, what the heck, below is my apr-util configure
  output, and apr-util/config.log, in case anyone sees an obvious
  problem.

--------------------8-<-------cut-here---------8-<-----------------------

configure: Apache Portable Runtime Utility (APRUTIL) library configuration
checking for APR-util... reconfig
configuring package in apr-util now
checking for working mkdir -p... yes
checking for APR... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for executable suffix...
checking for object suffix... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking how to run the C preprocessor... gcc -E
checking for ldap support...
checking for gdbm.h... yes
checking for gdbm_open in -lgdbm... yes
checking for db4/db.h... no
checking for db.h... no
checking for db3/db.h... no
checking for db.h... (cached) no
checking for db2/db.h... no
checking for db.h... (cached) no
checking for db1/db.h... yes
checking for dbopen in -ldb1... yes
checking for Berkeley DB... found db1
checking for default DBM... sdbm (default)
  setting APRUTIL_EXPORT_LIBS to "-lgdbm"
  setting APRUTIL_LIBS to "-lgdbm"
  adding "-ldb1" to APRUTIL_EXPORT_LIBS
  adding "-ldb1" to APRUTIL_LIBS
checking for Expat in /usr... no
checking for Expat in /usr/local... yes
  adding "-lexpat" to APRUTIL_EXPORT_LIBS
  setting APRUTIL_INCLUDES to "-I/usr/local/include"
  setting APRUTIL_LDFLAGS to "-L/usr/local/lib"
  adding "/usr/local/lib/libexpat.la" to APRUTIL_LIBS
checking for iconv in -liconv... no
checking for iconv... yes
checking for type of inbuf parameter to iconv... char **
checking for iconv.h... yes
  adding "/home/kfogel/src/subversion/apr/libapr.la" to APRUTIL_LIBS
  adding "-lm" to APRUTIL_LIBS
  adding "-lcrypt" to APRUTIL_LIBS
  adding "-lnsl" to APRUTIL_LIBS
  adding "-lresolv" to APRUTIL_LIBS
  adding "-ldl" to APRUTIL_LIBS
configure: creating ./config.status
config.status: creating export_vars.sh
config.status: creating apu-config
config.status: creating include/private/apu_select_dbm.h
config.status: creating include/apr_ldap.h
config.status: creating include/apu.h
config.status: creating Makefile
config.status: creating buckets/Makefile
config.status: creating crypto/Makefile
config.status: creating dbm/Makefile
config.status: creating dbm/sdbm/Makefile
config.status: creating encoding/Makefile
config.status: creating hooks/Makefile
config.status: creating ldap/Makefile
config.status: creating uri/Makefile
config.status: creating xml/Makefile
config.status: creating misc/Makefile
config.status: creating strmatch/Makefile
config.status: creating xlate/Makefile
config.status: creating test/Makefile
config.status: creating include/private/apu_config.h
config.status: include/private/apu_config.h is unchanged
apr-util configured properly
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for executable suffix...
checking for object suffix... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking whether ln -s works... yes
configuring libtool now
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for ld used by GCC... /usr/bin/ld
checking if the linker (/usr/bin/ld) is GNU ld... yes
checking for /usr/bin/ld option to reload object files... -r
checking for BSD-compatible nm... /usr/bin/nm -B
checking how to recognise dependant libraries... pass_all
checking command to parse /usr/bin/nm -B output... ok
checking how to run the C preprocessor... gcc -E
checking for dlfcn.h... yes
checking for ranlib... ranlib
checking for strip... strip
checking for objdir... .libs
checking for gcc option to produce PIC... -fPIC
checking if gcc PIC flag -fPIC works... yes
checking if gcc static flag -static works... yes
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.lo... yes
checking if gcc supports -fno-rtti -fno-exceptions... yes
checking whether the linker (/usr/bin/ld) supports shared libraries... yes
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking dynamic linker characteristics... GNU/Linux ld.so
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... no
checking whether to build static libraries... yes
creating libtool

--------------------8-<-------cut-here---------8-<-----------------------

apr-util/config.log:

This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by configure, which was
generated by GNU Autoconf 2.52. Invocation command line was

  $ /home/kfogel/src/subversion/apr-util/configure --enable-maintainer-mode --disable-shared --cache-file=/dev/null --srcdir=/home/kfogel/src/subversion/apr-util --with-apr=../apr

## ---------- ##
## Platform. ##
## ---------- ##

hostname = gauss
uname -m = i686
uname -r = 2.2.16-22
uname -s = Linux
uname -v = #1 Tue Aug 22 16:49:06 EDT 2000

/usr/bin/uname -p = unknown
/bin/uname -X = unknown

/bin/arch = i686
/usr/bin/arch -k = unknown
/usr/convex/getsysinfo = unknown
hostinfo = unknown
/bin/machine = unknown
/usr/bin/oslevel = unknown
/bin/universe = unknown

PATH = .:/usr/local/postgres/bin:.:/home/kfogel/bin:/usr/local/jdk/bin:/usr/local/bin:/usr/bin/X11:/bin:/usr/bin:/usr/local/netscape:/sbin:/usr/sbin:/usr/local/java/bin:/usr/ucb:/usr/etc:/usr/gnusoft/bin:/usr/public/bin:/usr/games:/usr/local/gallery/bin:/NextDeveloper/bin:/usr/local/postgres/bin:/usr/X11R6/bin:/usr/openwin/bin

## ------------ ##
## Core tests. ##
## ------------ ##

configure:929: PATH=".;."; conftest.sh
/home/kfogel/src/subversion/apr-util/configure: conftest.sh: command not found
configure:932: $? = 127
configure:1021: checking for working mkdir -p
configure:1037: result: yes
configure:1060: checking for APR
configure:1126: result: yes
configure:1189: checking for gcc
configure:1204: found /usr/bin/gcc
configure:1212: result: gcc
configure:1440: checking for C compiler version
configure:1443: gcc --version </dev/null >&5
2.96
configure:1446: $? = 0
configure:1448: gcc -v </dev/null >&5
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.0)
configure:1451: $? = 0
configure:1453: gcc -V </dev/null >&5
gcc: argument to `-V' is missing
configure:1456: $? = 1
configure:1476: checking for C compiler default output
configure:1479: gcc conftest.c >&5
configure:1482: $? = 0
configure:1511: result: a.out
configure:1516: checking whether the C compiler works
configure:1522: ./a.out
configure:1525: $? = 0
configure:1540: result: yes
configure:1547: checking whether we are cross compiling
configure:1549: result: no
configure:1552: checking for executable suffix
configure:1554: gcc -o conftest conftest.c >&5
configure:1557: $? = 0
configure:1579: result:
configure:1585: checking for object suffix
configure:1603: gcc -c conftest.c >&5
configure:1606: $? = 0
configure:1625: result: o
configure:1629: checking whether we are using the GNU C compiler
configure:1650: gcc -c conftest.c >&5
configure:1653: $? = 0
configure:1656: test -s conftest.o
configure:1659: $? = 0
configure:1671: result: yes
configure:1677: checking whether gcc accepts -g
configure:1695: gcc -c -g conftest.c >&5
configure:1698: $? = 0
configure:1701: test -s conftest.o
configure:1704: $? = 0
configure:1714: result: yes
configure:1741: gcc -c -g -O2 conftest.c >&5
conftest.c:2: parse error before `me'
configure:1744: $? = 1
configure: failed program was:
#ifndef __cplusplus
  choke me
#endif
configure:1847: checking how to run the C preprocessor
configure:1873: gcc -E conftest.c
configure:1879: $? = 0
configure:1906: gcc -E conftest.c
configure:1903:28: ac_nonexistent.h: No such file or directory
configure:1912: $? = 1
configure: failed program was:
#line 1902 "configure"
#include "confdefs.h"
#include <ac_nonexistent.h>
configure:1949: result: gcc -E
configure:1964: gcc -E conftest.c
configure:1970: $? = 0
configure:1997: gcc -E conftest.c
configure:1994:28: ac_nonexistent.h: No such file or directory
configure:2003: $? = 1
configure: failed program was:
#line 1993 "configure"
#include "confdefs.h"
#include <ac_nonexistent.h>
configure:4493: checking for gdbm.h
configure:4503: gcc -E conftest.c
configure:4509: $? = 0
configure:4528: result: yes
configure:4531: checking for gdbm_open in -lgdbm
configure:4558: gcc -o conftest -g -O2 conftest.c -lgdbm >&5
configure:4561: $? = 0
configure:4564: test -s conftest
configure:4567: $? = 0
configure:4578: result: yes
configure:5776: checking for db4/db.h
configure:5786: gcc -E conftest.c
configure:5783:20: db4/db.h: No such file or directory
configure:5792: $? = 1
configure: failed program was:
#line 5782 "configure"
#include "confdefs.h"
#include <db4/db.h>
configure:5811: result: no
configure:5934: checking for db.h
configure:5944: gcc -E conftest.c
configure:5941:16: db.h: No such file or directory
configure:5950: $? = 1
configure: failed program was:
#line 5940 "configure"
#include "confdefs.h"
#include <db.h>
configure:5969: result: no
configure:6096: checking for db3/db.h
configure:6106: gcc -E conftest.c
configure:6103:20: db3/db.h: No such file or directory
configure:6112: $? = 1
configure: failed program was:
#line 6102 "configure"
#include "confdefs.h"
#include <db3/db.h>
configure:6131: result: no
configure:6195: checking for db.h
configure:6230: result: no
configure:6297: checking for db2/db.h
configure:6307: gcc -E conftest.c
configure:6304:20: db2/db.h: No such file or directory
configure:6313: $? = 1
configure: failed program was:
#line 6303 "configure"
#include "confdefs.h"
#include <db2/db.h>
configure:6332: result: no
configure:6396: checking for db.h
configure:6431: result: no
configure:6498: checking for db1/db.h
configure:6508: gcc -E conftest.c
configure:6514: $? = 0
configure:6533: result: yes
configure:6537: checking for dbopen in -ldb1
configure:6564: gcc -o conftest -g -O2 conftest.c -ldb1 >&5
configure:6567: $? = 0
configure:6570: test -s conftest
configure:6573: $? = 0
configure:6584: result: yes
configure:6861: checking for Berkeley DB
configure:6865: result: found db1
configure:8033: checking for default DBM
configure:8035: result: sdbm (default)
configure:8226: checking for Expat in /usr
configure:8293: result: no
configure:8226: checking for Expat in /usr/local
configure:8290: result: yes
configure:8683: checking for iconv in -liconv
configure:8710: gcc -o conftest -g -O2 conftest.c -liconv >&5
/usr/bin/ld: cannot find -liconv
collect2: ld returned 1 exit status
configure:8713: $? = 1
configure: failed program was:
#line 8691 "configure"
#include "confdefs.h"

/* Override any gcc2 internal prototype to avoid an error. */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
   builtin and then its argument prototype would still apply. */
char iconv ();
int
main ()
{
iconv ();
  ;
  return 0;
}
configure:8730: result: no
configure:8744: checking for iconv
configure:8781: gcc -o conftest -g -O2 conftest.c >&5
configure:8784: $? = 0
configure:8787: test -s conftest
configure:8790: $? = 0
configure:8800: result: yes
configure:8814: checking for type of inbuf parameter to iconv
configure:8861: result: char **
configure:8869: checking for iconv.h
configure:8879: gcc -E conftest.c
configure:8885: $? = 0
configure:8904: result: yes
configure:9063: creating ./config.status

## ----------------------- ##
## Running config.status. ##
## ----------------------- ##

This file was extended by config.status 2.52, executed with
  CONFIG_FILES =
  CONFIG_HEADERS =
  CONFIG_LINKS =
  CONFIG_COMMANDS =
> ./config.status
on gauss

config.status:9532: creating export_vars.sh
config.status:9532: creating apu-config
config.status:9532: creating include/private/apu_select_dbm.h
config.status:9532: creating include/apr_ldap.h
config.status:9532: creating include/apu.h
config.status:9532: creating Makefile
config.status:9532: creating buckets/Makefile
config.status:9532: creating crypto/Makefile
config.status:9532: creating dbm/Makefile
config.status:9532: creating dbm/sdbm/Makefile
config.status:9532: creating encoding/Makefile
config.status:9532: creating hooks/Makefile
config.status:9532: creating ldap/Makefile
config.status:9532: creating uri/Makefile
config.status:9532: creating xml/Makefile
config.status:9532: creating misc/Makefile
config.status:9532: creating strmatch/Makefile
config.status:9532: creating xlate/Makefile
config.status:9532: creating test/Makefile
config.status:9623: creating include/private/apu_config.h
config.status:9764: include/private/apu_config.h is unchanged

## ----------------- ##
## Cache variables. ##
## ----------------- ##

ac_cv_c_compiler_gnu=yes
ac_cv_env_CC_set=
ac_cv_env_CC_value=
ac_cv_env_CFLAGS_set=
ac_cv_env_CFLAGS_value=
ac_cv_env_CPPFLAGS_set=
ac_cv_env_CPPFLAGS_value=
ac_cv_env_CPP_set=
ac_cv_env_CPP_value=
ac_cv_env_LDFLAGS_set=
ac_cv_env_LDFLAGS_value=
ac_cv_env_build_alias_set=
ac_cv_env_build_alias_value=
ac_cv_env_host_alias_set=
ac_cv_env_host_alias_value=
ac_cv_env_target_alias_set=
ac_cv_env_target_alias_value=
ac_cv_func_iconv=yes
ac_cv_header_db1_db_h=yes
ac_cv_header_db2_db_h=no
ac_cv_header_db3_db_h=no
ac_cv_header_db4_db_h=no
ac_cv_header_db_h=no
ac_cv_header_gdbm_h=yes
ac_cv_header_iconv_h=yes
ac_cv_lib_db1_dbopen=yes
ac_cv_lib_gdbm_gdbm_open=yes
ac_cv_lib_iconv_iconv=no
ac_cv_mkdir_p=yes
ac_cv_objext=o
ac_cv_prog_CPP='gcc -E'
ac_cv_prog_ac_ct_CC=gcc
ac_cv_prog_cc_g=yes

## ------------ ##
## confdefs.h. ##
## ------------ ##

#define HAVE_ICONV 1
#define HAVE_ICONV_H 1

configure: exit 0

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Jul 20 03:33:15 2002

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.