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

[PATCH] Do not use gettextize and i18n round 2 Re: I18n: The gettext proposal

From: Justin Erenkrantz <justin_at_erenkrantz.com>
Date: 2004-03-30 11:49:16 CEST

--On Tuesday, March 30, 2004 12:55 AM -0300 Nicolás Lichtmaier
<nick@reloco.com.ar> wrote:

> Hi, I propose to use gettext for i18n.

This would add a new build and run-time dependency that I think we have to be
very careful about handling. I really wish this could be made optional rather
than being a mandatory requirement. As an aside, we would have to disable
static linking if we import gettext as LGPL forbids any static binaries
created with LGPL functionality. (Hmm, we'd have to do the same for neon -
are we?)

The biggest problem is that GNU gettext expects us to be using automake, which
isn't going to be used. I think the best course of action is to just discard
everything that gettextize does and write our own configure checks and
Makefile. This should have the added bonus of allowing us to work against
non-GNU gettext and with non-GNU makes.

Regarding the patch you posted earlier:

* svn:ignores: This change can go away with some tweaking to remove the
'dependency' on aclocal.m4; however, we'd have to compensate in autogen.sh by
copying all of the 'right' files over.

* Makefile.in: With the exception of the i18n targets, these changes are
entirely bogus. DEFS and the LOCALEDIR are most certainly not options that
should be passed to the compiler, but rather to the preprocessor. The
makefile should not have targets for configure, config.status, etc. (I have a
hunch you are going to try to get us to use automake.)

* configure.in: I see no reason why gettext needs us to define PACKAGE or
VERSION.

* po/Makefile.in.in: We're not using automake, so we need to construct our own
customized Makefile.in.

* po/ChangeLog: we don't use a ChangeLog file; please remove.

* subversion/*.c: We do not protect includes of svn_private_config.h as it is
always available (even on Win32). You are also using the incorrect syntax (<>
vs "") and including it in the wrong place out-of-order (should not be at the
top of the file) - see our other files for the 'right' place to include it.

* subversion/clients/cmdline/main.c: The signal thing isn't relevant.

>From a build system perspective, I think actually our best approach here is
going to be to toss GNU gettext's awful m4 and Makefile.in.in files (which
don't work on non-GNU makes) and roll our own detection code to support
gettext. GNU xgettext probably would still be best for creating the .po
files as it supports the --keyword flag, but Solaris's msgfmt can still
read those. (We'd check in the .po files, so that there isn't a dependency
on the developers to have a 'sane' xgettext.)

So, in an effort to put my word where my mouth is, the following patch
addresses these issues with your patch and builds for me on Solaris without
GNU gettext. This probably still needs work to bring in libintl for GNU
gettext though.

% ./svn
Type 'svn help' for usage.
% LC_ALL=C ./svn
Type 'svn help' for usage.
% LC_ALL=fr ./svn
Typo me 'svn' help' for na-na-na usage.

I don't have the 'es' locale installed, so I tweaked it to be 'fr' for me with
the non-sensical help message. -- justin

* Makefile.in: Add localedir, MSGFMT, PACKAGE_NAME, PACKAGE_VERSION substs from
  configure; add in build-i18n and install-i18n targets
  [installs to right location for Solaris; no clue about GNU gettext]
* configure.in: Remove old placeholder for GNU gettext and move down to a
  more sensible location; add in i18n config section which enables NLS iff
  msgfmt is found; export SVN_LOCALE_DIR properly escaped so main.c can use;
  if i18n enabled, add in build-i18n and install-i18n targets
  [the double eval is funny, but there isn't a clean way to fully expand here.
   There are some M4 macros in apr or httpd for this though.]
* subversion/clients/cmdline/main.c: Include svn_private_config.h, _()-escape
  some strings
  (main): call setlocale, bindtextdomain, and textdomain to initialize gettext
* subversion/libsvn_wc/relocate.c, subversion/libsvn_wc/entries.c
  subversion/libsvn_wc/copy.c, subversion/libsvn_wc/lock.c
  subversion/libsvn_wc/translate.c,
  subversion/clients/cmdline/props.c, subversion/clients/cmdline/mkdir-cmd.c
  subversion/clients/cmdline/blame-cmd.c, subversion/clients/cmdline/log-cmd.c
  subversion/clients/cmdline/delete-cmd.c, subversion/clients/cmdline/notify.c
  subversion/clients/cmdline/export-cmd.c,
  subversion/clients/cmdline/info-cmd.c: Include "svn_private_config.h" and
  _()-escape strings which we can handle via xgettext and i18n. [From
  Nicolás's earlier patch with correct include's though.]
* subversion/libsvn_subr/opt.c (svn_opt_print_help): Add _() to the 'default'
  case when there are no arguments.
* po/es.po: Delta against Nicolás's earlier es.po file which adds the default
  help string with a pointless translation.

Index: Makefile.in
===================================================================
--- Makefile.in (revision 9230)
+++ Makefile.in (working copy)
@@ -57,6 +57,7 @@
 infodir = @infodir@
 datadir = @datadir@
 docdir = @docdir@
+localedir = @localedir@

 # where to install libsvn_swig_*
 swig_py_libdir = @libdir@
@@ -78,7 +79,10 @@
 TEXI2DVI = texi2dvi
 DVIPS = dvips
 DVIPDF = dvipdf
+MSGFMT = @MSGFMT@

+PACKAGE_NAME=@PACKAGE_NAME@
+PACKAGE_VERSION=@PACKAGE_VERSION@

 CC = @CC@
 CXX = @CXX@
@@ -511,3 +515,17 @@
           echo "$(INSTALL_DATA) $$file $(DESTDIR)$(infodir)/$$inst"; \
           $(INSTALL_DATA) $$file $(DESTDIR)$(infodir)/$$inst; \
         done
+
+ALL_LINGUAS=@ALL_LINGUAS@
+build-i18n:
+ @list='$(ALL_LINGUAS)'; \
+ for i in $$list; do \
+ $(MSGFMT) -o po/$$i.mo $(srcdir)/po/$$i.po; \
+ done
+
+install-i18n:
+ $(MKDIR) $(DESTDIR)$(localedir)
+ @list='$(ALL_LINGUAS)'; \
+ for i in $$list; do \
+ $(INSTALL_DATA) po/$$i.mo
$(DESTDIR)$(localedir)/$$i/LC_MESSAGES/$(PACKAGE_NAME).mo; \
+ done
Index: configure.in
===================================================================
--- configure.in (revision 9230)
+++ configure.in (working copy)
@@ -73,11 +73,6 @@
 dnl (We can add custom defines by creating ./acconfig.h if we wish.)
 AC_CONFIG_HEADER(svn_private_config.h)

-dnl Todo: we're English-only now, but GNU Gettext eventually?
-dnl Set of available languages.
-dnl ALL_LINGUAS="de fr es ko nl no pl pt sl sv"
-dnl I volunteer for this ^^ translation :-) -xbc
-
 dnl Check for programs ---------------------

 dnl Look for a C compiler (before anything can set CFLAGS)
@@ -255,7 +250,43 @@
 SVN_LIB_BERKELEY_DB($SVN_FS_WANT_DB_MAJOR, $SVN_FS_WANT_DB_MINOR,
                     $SVN_FS_WANT_DB_PATCH, [db4 db])

+dnl I18n -------------------

+localedir='${datadir}/locale'
+localedir="${localedir}/subversion-${svn_version}"
+AC_SUBST(localedir)
+
+dnl Set of available languages.
+dnl ALL_LINGUAS="de fr es ko nl no pl pt sl sv"
+dnl I volunteer for this ^^ translation :-) -xbc
+ALL_LINGUAS="es"
+AC_SUBST(ALL_LINGUAS)
+
+USE_NLS="no"
+AC_PATH_PROG(MSGFMT, msgfmt, none)
+if test "$MSGFMT" != "none"; then
+ AC_DEFINE(ENABLE_NLS, 1,
+ [Define to 1 if translation of program messages to the user's
+ native language is requested.])
+ dnl Must expand twice at least to get prefix expanded!
+ svn_localedir="`eval echo ${localedir}`"
+ svn_localedir="`eval echo ${svn_localedir}`"
+ AC_DEFINE_UNQUOTED(SVN_LOCALE_DIR, "${svn_localedir}",
+ [Defined to be the path to the installed locale dirs])
+ USE_NLS="yes"
+fi
+
+AH_BOTTOM(
+#define N_(x) (x)
+#ifdef ENABLE_NLS
+#include <locale.h>
+#include <libintl.h>
+#define _(x) dgettext(PACKAGE_NAME, x)
+#else
+#define _(x) (x)
+#endif
+)
+
 # Only add *_APACHE_RULE if we also have db, since mod_dav_svn depends on it.
 INSTALL_STATIC_RULES="install-bin install-docs"
 INSTALL_RULES="install-base-lib install-lib install-include install-static"
@@ -274,6 +305,11 @@
   INSTALL_RULES="`echo $INSTALL_RULES | sed 's/install-lib/install-dav-lib
install-lib/'`"
 fi

+if test "$USE_NLS" = "yes"; then
+ BUILD_RULES="$BUILD_RULES build-i18n"
+ INSTALL_RULES="$INSTALL_RULES install-i18n"
+fi
+
 AC_SUBST(BUILD_RULES)
 AC_SUBST(INSTALL_STATIC_RULES)
 AC_SUBST(INSTALL_RULES)
Index: subversion/libsvn_wc/relocate.c
===================================================================
--- subversion/libsvn_wc/relocate.c (revision 9230)
+++ subversion/libsvn_wc/relocate.c (working copy)
@@ -30,6 +31,8 @@
 #include "entries.h"
 #include "props.h"

+#include "svn_private_config.h"
+
 
 svn_error_t *
 svn_wc_relocate (const char *path,
@@ -62,7 +65,7 @@
         return svn_error_create (SVN_ERR_ENTRY_NOT_FOUND, NULL, NULL);
       if (! entry->url)
         return svn_error_createf (SVN_ERR_ENTRY_MISSING_URL, NULL,
- "Entry '%s' has no URL", path);
+ _("Entry '%s' has no URL"), path);

       if (! strncmp (entry->url, from, from_len))
         {
Index: subversion/libsvn_wc/entries.c
===================================================================
--- subversion/libsvn_wc/entries.c (revision 9230)
+++ subversion/libsvn_wc/entries.c (working copy)
@@ -35,6 +36,8 @@
 #include "adm_ops.h"
 #include "entries.h"

+#include "svn_private_config.h"
+
 
 /** Overview **/

@@ -114,7 +117,7 @@
                           SVN_WC__ENTRIES_TOPLEVEL);

   SVN_ERR_W (svn_io_file_write_full (f, accum->data, accum->len, NULL, pool),
- apr_psprintf (pool, "Error writing entries file for '%s'",
path));
+ apr_psprintf (pool, _("Error writing entries file for '%s'"),
path));

   /* Now we have a `entries' file with exactly one entry, an entry
      for this dir. Close the file and sync it up. */
@@ -215,7 +218,7 @@
         else
           return svn_error_createf
             (SVN_ERR_NODE_UNKNOWN_KIND, NULL,
- "Entry '%s' has invalid node kind",
+ _("Entry '%s' has invalid node kind"),
              (name ? name : SVN_WC_ENTRY_THIS_DIR));
         *modify_flags |= SVN_WC__ENTRY_MODIFY_KIND;
       }
@@ -240,7 +243,7 @@
         else
           return svn_error_createf
             (SVN_ERR_ENTRY_ATTRIBUTE_INVALID, NULL,
- "Entry '%s' has invalid '%s' value",
+ _("Entry '%s' has invalid '%s' value"),
              (name ? name : SVN_WC_ENTRY_THIS_DIR),
              SVN_WC__ENTRY_ATTR_SCHEDULE);

@@ -290,7 +293,7 @@
         else
           return svn_error_createf
             (SVN_ERR_ENTRY_ATTRIBUTE_INVALID, NULL,
- "Entry '%s' has invalid '%s' value",
+ _("Entry '%s' has invalid '%s' value"),
              (name ? name : SVN_WC_ENTRY_THIS_DIR),
              SVN_WC__ENTRY_ATTR_COPIED);

@@ -330,7 +333,7 @@
         else
           return svn_error_createf
             (SVN_ERR_ENTRY_ATTRIBUTE_INVALID, NULL,
- "Entry '%s' has invalid '%s' value",
+ _("Entry '%s' has invalid '%s' value"),
              (name ? name : SVN_WC_ENTRY_THIS_DIR),
              SVN_WC__ENTRY_ATTR_DELETED);

@@ -357,7 +360,7 @@
         else
           return svn_error_createf
             (SVN_ERR_ENTRY_ATTRIBUTE_INVALID, NULL,
- "Entry '%s' has invalid '%s' value",
+ _("Entry '%s' has invalid '%s' value"),
              (name ? name : SVN_WC_ENTRY_THIS_DIR),
              SVN_WC__ENTRY_ATTR_ABSENT);

@@ -384,7 +387,7 @@
         else
           return svn_error_createf
             (SVN_ERR_ENTRY_ATTRIBUTE_INVALID, NULL,
- "Entry '%s' has invalid '%s' value",
+ _("Entry '%s' has invalid '%s' value"),
              (name ? name : SVN_WC_ENTRY_THIS_DIR),
              SVN_WC__ENTRY_ATTR_INCOMPLETE);

@@ -565,17 +568,17 @@
   if (! default_entry)
     return svn_error_create (SVN_ERR_ENTRY_NOT_FOUND,
                              NULL,
- "Missing default entry");
+ _("Missing default entry"));

   if (default_entry->revision == SVN_INVALID_REVNUM)
     return svn_error_create (SVN_ERR_ENTRY_MISSING_REVISION,
                              NULL,
- "Default entry has no revision number");
+ _("Default entry has no revision number"));

   if (! default_entry->url)
     return svn_error_create (SVN_ERR_ENTRY_MISSING_URL,
                              NULL,
- "Default entry is missing URL");
+ _("Default entry is missing URL"));

   /* Then use it to fill in missing information in other entries. */
@@ -663,7 +666,7 @@
     SVN_ERR_W (svn_xml_parse (svn_parser, buf, bytes_read,
                               err && APR_STATUS_IS_EOF(err->apr_err)),
                apr_psprintf (pool,
- "XML parser failed in '%s'",
+ _("XML parser failed in '%s'"),
                              svn_wc_adm_access_path (adm_access)));
   } while (! err);

@@ -752,7 +755,7 @@
   if (! default_entry)
     return svn_error_createf
       (SVN_ERR_WC_CORRUPT, NULL,
- "Corrupt working copy: '%s' has no default entry", path);
+ _("Corrupt working copy: '%s' has no default entry"), path);

   /* Validate DEFAULT_ENTRY's current schedule. */
   switch (default_entry->schedule)
@@ -768,7 +771,7 @@
       /* This is an invalid state */
       return svn_error_createf
         (SVN_ERR_WC_CORRUPT, NULL,
- "Corrupt working copy: directory '%s' has an invalid schedule",
+ _("Corrupt working copy: directory '%s' has an invalid schedule"),
          path);
     }

@@ -802,8 +805,8 @@
           /* This is an invalid state */
           return svn_error_createf
             (SVN_ERR_WC_CORRUPT, NULL,
- "Corrupt working copy: "
- "'%s' in directory '%s' has an invalid schedule",
+ _("Corrupt working copy: "
+ "'%s' in directory '%s' has an invalid schedule"),
              name, path);
         }

@@ -811,24 +814,24 @@
           && (this_entry->schedule != svn_wc_schedule_add))
         return svn_error_createf
           (SVN_ERR_WC_CORRUPT, NULL,
- "Corrupt working copy: '%s' in directory '%s' (which is scheduled "
- "for addition) is not itself scheduled for addition",
+ _("Corrupt working copy: '%s' in directory '%s' (which is
scheduled "
+ "for addition) is not itself scheduled for addition"),
            name, path);

       if ((default_entry->schedule == svn_wc_schedule_delete)
           && (this_entry->schedule != svn_wc_schedule_delete))
         return svn_error_createf
           (SVN_ERR_WC_CORRUPT, NULL,
- "Corrupt working copy: '%s' in directory '%s' (which is scheduled "
- "for deletion) is not itself scheduled for deletion",
+ _("Corrupt working copy: '%s' in directory '%s' (which is
scheduled "
+ "for deletion) is not itself scheduled for deletion"),
            name, path);

       if ((default_entry->schedule == svn_wc_schedule_replace)
           && (this_entry->schedule == svn_wc_schedule_normal))
         return svn_error_createf
           (SVN_ERR_WC_CORRUPT, NULL,
- "Corrupt working copy: '%s' in directory '%s' (which is scheduled "
- "for replacement) has in invalid schedule",
+ _("Corrupt working copy: '%s' in directory '%s' (which is
scheduled "
+ "for replacement) has in invalid schedule"),
            name, path);
     }

@@ -1106,7 +1109,7 @@
   /* If there is no "this dir" entry, something is wrong. */
   if (! this_dir)
     return svn_error_createf (SVN_ERR_ENTRY_NOT_FOUND, NULL,
- "No default entry in directory '%s'",
+ _("No default entry in directory '%s'"),
                               svn_wc_adm_access_path (adm_access));

   /* Open entries file for writing. It's important we don't use APR_EXCL
@@ -1159,7 +1162,7 @@
   SVN_ERR_W (svn_io_file_write_full (outfile, bigstr->data,
                                      bigstr->len, NULL, pool),
              apr_psprintf (pool,
- "Error writing to '%s'",
+ _("Error writing to '%s'"),
                            svn_wc_adm_access_path (adm_access)));

   err = svn_wc__close_adm_file (outfile,
@@ -1371,7 +1374,7 @@
       else
         return
           svn_error_createf (SVN_ERR_WC_SCHEDULE_CONFLICT, NULL,
- "'%s' is not under version control",
+ _("'%s' is not under version control"),
                              name);
     }

@@ -1398,14 +1401,14 @@
       if (*schedule == svn_wc_schedule_add)
         return
           svn_error_createf (SVN_ERR_WC_SCHEDULE_CONFLICT, NULL,
- "Can't add '%s' to deleted directory; "
- "try undeleting its parent directory first",
+ _("Can't add '%s' to deleted directory; "
+ "try undeleting its parent directory first"),
                              name);
       if (*schedule == svn_wc_schedule_replace)
         return
           svn_error_createf (SVN_ERR_WC_SCHEDULE_CONFLICT, NULL,
- "Can't replace '%s' in deleted directory; "
- "try undeleting its parent directory first",
+ _("Can't replace '%s' in deleted directory; "
+ "try undeleting its parent directory first"),
                              name);
     }

@@ -1413,7 +1416,7 @@
     {
       return svn_error_createf
         (SVN_ERR_WC_SCHEDULE_CONFLICT, NULL,
- "'%s' is marked as absent, so it cannot be scheduled for addition",
+ _("'%s' is marked as absent, so it cannot be scheduled for
addition"),
          name);
     }

@@ -1442,7 +1445,7 @@
             return
               svn_error_createf
               (SVN_ERR_WC_SCHEDULE_CONFLICT, NULL,
- "Entry '%s' is already under version control", name);
+ _("Entry '%s' is already under version control"), name);
         }
       break;

@@ -1534,7 +1537,7 @@
       return
         svn_error_createf
         (SVN_ERR_WC_SCHEDULE_CONFLICT, NULL,
- "Entry '%s' has illegal schedule", name);
+ _("Entry '%s' has illegal schedule"), name);
     }
   return SVN_NO_ERROR;
 }
@@ -1650,7 +1653,7 @@
   entry = apr_hash_get (entries, name, APR_HASH_KEY_STRING);
   if (! entry)
     return svn_error_createf (SVN_ERR_ENTRY_NOT_FOUND, NULL,
- "No such entry: '%s'", name);
+ _("No such entry: '%s'"), name);

   if (new_url != NULL
       && (! entry->url || strcmp (new_url, entry->url)))
@@ -1716,7 +1719,7 @@
                             APR_HASH_KEY_STRING);
   if (! dot_entry)
     return svn_error_createf (SVN_ERR_ENTRY_NOT_FOUND, NULL,
- "Directory '%s' has no THIS_DIR entry",
+ _("Directory '%s' has no THIS_DIR entry"),
                               dirpath);

   SVN_ERR (walk_callbacks->found_entry (dirpath, dot_entry, walk_baton,
pool));
@@ -1773,7 +1776,7 @@

   if (! entry)
     return svn_error_createf (SVN_ERR_UNVERSIONED_RESOURCE, NULL,
- "'%s' is not under version control", path);
+ _("'%s' is not under version control"), path);

   if (entry->kind == svn_node_file)
     return walk_callbacks->found_entry (path, entry, walk_baton, pool);
@@ -1784,7 +1787,7 @@

   else
     return svn_error_createf (SVN_ERR_NODE_UNKNOWN_KIND, NULL,
- "'%s' has an unrecognized node kind", path);
+ _("'%s' has an unrecognized node kind"), path);
 }

@@ -1819,6 +1822,6 @@
     }
   else
     return svn_error_createf (SVN_ERR_WC_PATH_FOUND, NULL,
- "Unexpectedly found '%s': "
- "path is marked 'missing'", path);
+ _("Unexpectedly found '%s': "
+ "path is marked 'missing'"), path);
 }
Index: subversion/libsvn_wc/copy.c
===================================================================
--- subversion/libsvn_wc/copy.c (revision 9230)
+++ subversion/libsvn_wc/copy.c (working copy)
@@ -33,6 +34,8 @@
 #include "adm_files.h"
 #include "props.h"

+#include "svn_private_config.h"
+
 
 /*** Code. ***/

@@ -142,7 +145,7 @@
   SVN_ERR (svn_io_check_path (dst_path, &dst_kind, pool));
   if (dst_kind != svn_node_none)
     return svn_error_createf (SVN_ERR_ENTRY_EXISTS, NULL,
- "'%s' already exists and is in the way",
+ _("'%s' already exists and is in the way"),
                               dst_path);

   /* Even if DST_PATH doesn't exist it may still be a versioned file; it
@@ -154,12 +157,12 @@
     {
       if (dst_entry->schedule == svn_wc_schedule_delete)
         return svn_error_createf (SVN_ERR_ENTRY_EXISTS, NULL,
- "'%s' is scheduled for deletion; it must"
- " be committed before being overwritten",
+ _("'%s' is scheduled for deletion; it must"
+ " be committed before being overwritten"),
                                   dst_path);
       else
         return svn_error_createf (SVN_ERR_ENTRY_EXISTS, NULL,
- "There is already a versioned item '%s'",
+ _("There is already a versioned item '%s'"),
                                   dst_path);
     }

@@ -170,15 +173,15 @@
   if (! src_entry)
     return svn_error_createf
       (SVN_ERR_UNVERSIONED_RESOURCE, NULL,
- "Cannot copy or move '%s': it's not under version control",
+ _("Cannot copy or move '%s': it's not under version control"),
        src_path);
   if ((src_entry->schedule == svn_wc_schedule_add)
       || (! src_entry->url)
       || (src_entry->copied))
     return svn_error_createf
       (SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- "Cannot copy or move '%s': it's not in the repository yet; "
- "try committing first",
+ _("Cannot copy or move '%s': it's not in the repository yet; "
+ "try committing first"),
        src_path);

   /* Now, make an actual copy of the working file. */
@@ -286,14 +289,14 @@
   if (! src_entry)
     return svn_error_createf
       (SVN_ERR_ENTRY_NOT_FOUND, NULL,
- "'%s' is not under version control", src_path);
+ _("'%s' is not under version control"), src_path);
   if ((src_entry->schedule == svn_wc_schedule_add)
       || (! src_entry->url)
       || (src_entry->copied))
     return svn_error_createf
       (SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- "Not allowed to copy or move '%s': it is not in the repository yet; "
- "try committing first",
+ _("Not allowed to copy or move '%s': it is not in the repository yet; "
+ "try committing first"),
        src_path);

   /* Recursively copy the whole directory over. This gets us all
Index: subversion/libsvn_wc/lock.c
===================================================================
--- subversion/libsvn_wc/lock.c (revision 9230)
+++ subversion/libsvn_wc/lock.c (working copy)
@@ -28,6 +28,8 @@
 #include "adm_files.h"
 #include "questions.h"

+#include "svn_private_config.h"
+
 

 struct svn_wc_adm_access_t
@@ -153,7 +155,7 @@
     }

   return svn_error_createf (SVN_ERR_WC_LOCKED, NULL,
- "Working copy '%s' locked",
+ _("Working copy '%s' locked"),
                             svn_path_local_style (adm_access->path, pool));
 }

@@ -273,7 +275,7 @@
         {
           return svn_error_createf
             (SVN_ERR_WC_BAD_PATH, NULL,
- "Path '%s' ends in '%s', which is unsupported for this
operation",
+ _("Path '%s' ends in '%s', which is unsupported for this
operation"),
              svn_path_local_style (path, pool), base_name);
         }

@@ -350,7 +352,7 @@
            locked: if it's not locked call svn_wc_adm_open, if it is locked
            call svn_wc_adm_retrieve. */
         return svn_error_createf (SVN_ERR_WC_LOCKED, NULL,
- "Working copy '%s' locked",
+ _("Working copy '%s' locked"),
                                   path);
     }

@@ -368,7 +370,7 @@
           /* Should we attempt to distinguish certain errors? */
           svn_error_clear (err);
           return svn_error_createf (SVN_ERR_WC_NOT_DIRECTORY, NULL,
- "'%s' is not a working copy",
+ _("'%s' is not a working copy"),
                                     svn_path_local_style (path, pool));
         }

@@ -593,7 +595,7 @@
         {
           svn_error_clear (err);
           return svn_error_createf (SVN_ERR_WC_NOT_DIRECTORY, NULL,
- "'%s' is not a working copy",
+ _("'%s' is not a working copy"),
                                     svn_path_local_style (path, pool));
         }
       else
@@ -641,7 +643,7 @@
      for NULL batons. */
   if (! *adm_access)
     return svn_error_createf (SVN_ERR_WC_NOT_LOCKED, NULL,
- "Working copy '%s' not locked",
+ _("Working copy '%s' not locked"),
                               path);

   return SVN_NO_ERROR;
@@ -835,14 +837,14 @@
           SVN_ERR (svn_wc_locked (&locked, adm_access->path,
adm_access->pool));
           if (! locked)
             return svn_error_createf (SVN_ERR_WC_NOT_LOCKED, NULL,
- "Write-lock stolen in '%s'",
+ _("Write-lock stolen in '%s'"),
                                       adm_access->path);
         }
     }
   else
     {
       return svn_error_createf (SVN_ERR_WC_NOT_LOCKED, NULL,
- "No write-lock in '%s'", adm_access->path);
+ _("No write-lock in '%s'"),
adm_access->path);
     }

   return SVN_NO_ERROR;
@@ -862,7 +864,7 @@
     *locked = FALSE;
   else
     return svn_error_createf (SVN_ERR_WC_LOCKED, NULL,
- "Lock file '%s' is not a regular file",
+ _("Lock file '%s' is not a regular file"),
                               lockfile);

   return SVN_NO_ERROR;
Index: subversion/libsvn_wc/translate.c
===================================================================
--- subversion/libsvn_wc/translate.c (revision 9230)
+++ subversion/libsvn_wc/translate.c (working copy)
@@ -45,6 +46,7 @@
 #include "adm_files.h"
 #include "translate.h"

+#include "svn_private_config.h"

 svn_error_t *
 svn_wc_translated_file (const char **xlated_p,
@@ -122,7 +124,7 @@
         {
           return svn_error_createf
             (SVN_ERR_IO_UNKNOWN_EOL, NULL,
- "'%s' has unknown value for svn:eol-style property",
+ _("'%s' has unknown value for svn:eol-style property"),
              vfile);
         }

Index: subversion/libsvn_subr/opt.c
===================================================================
--- subversion/libsvn_subr/opt.c (revision 9230)
+++ subversion/libsvn_subr/opt.c (working copy)
@@ -36,6 +36,8 @@
 #include "svn_utf.h"
 #include "svn_time.h"

+#include "svn_private_config.h"
+
 
 /*** Code. ***/

@@ -735,7 +737,7 @@
                                 pool,
                                 stdout);
   else /* unknown option or cmd */
- fprintf (stderr, "Type '%s help' for usage.\n", pgm_name);
+ fprintf (stderr, _("Type '%s help' for usage.\n"), pgm_name);

   return SVN_NO_ERROR;
 }
Index: subversion/clients/cmdline/props.c
===================================================================
--- subversion/clients/cmdline/props.c (revision 9230)
+++ subversion/clients/cmdline/props.c (working copy)
@@ -33,6 +33,7 @@
 #include "svn_subst.h"
 #include "cl.h"

+#include "svn_private_config.h"

 

@@ -41,8 +42,8 @@
 {
   return svn_error_create
     (SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- "Must specify revision explicitly when operating on a "
- "revision property");
+ _("Must specify revision explicitly when operating on a "
+ "revision property"));
 }

Index: subversion/clients/cmdline/mkdir-cmd.c
===================================================================
--- subversion/clients/cmdline/mkdir-cmd.c (revision 9230)
+++ subversion/clients/cmdline/mkdir-cmd.c (working copy)
@@ -31,6 +31,7 @@
 #include "svn_error.h"
 #include "cl.h"

+#include "svn_private_config.h"

 
 /*** Code. ***/
@@ -70,7 +71,7 @@
     {
       if (err->apr_err == APR_EEXIST)
         return svn_error_quick_wrap
- (err, "Try 'svn add' or 'svn add --non-recursive' instead?");
+ (err, _("Try 'svn add' or 'svn add --non-recursive' instead?"));
       else
         return err;
     }
Index: subversion/clients/cmdline/blame-cmd.c
===================================================================
--- subversion/clients/cmdline/blame-cmd.c (revision 9230)
+++ subversion/clients/cmdline/blame-cmd.c (working copy)
@@ -25,6 +26,8 @@
 #include "svn_time.h"
 #include "cl.h"

+#include "svn_private_config.h"
+
 typedef struct
 {
   svn_cl__opt_state_t *opt_state;
@@ -137,7 +140,7 @@
         {
           if (err->apr_err == SVN_ERR_CLIENT_IS_BINARY_FILE)
             {
- printf ("Skipping binary file: '%s'\n", target);
+ printf (_("Skipping binary file: '%s'\n"), target);
               svn_error_clear (err);
             }
           else
Index: subversion/clients/cmdline/log-cmd.c
===================================================================
--- subversion/clients/cmdline/log-cmd.c (revision 9230)
+++ subversion/clients/cmdline/log-cmd.c (working copy)
@@ -39,6 +39,8 @@
 #include "svn_subst.h"
 #include "cl.h"

+#include "svn_private_config.h"
+
 
 /*** Code. ***/

@@ -203,7 +205,7 @@
      for more on the fallback fuzzy conversions below. */

   if (author == NULL)
- author = "(no author)";
+ author = _("(no author)");

   err = svn_cmdline_cstring_from_utf8 (&author_stdout, author, pool);
   if (err && (APR_STATUS_IS_EINVAL (err->apr_err)))
@@ -225,7 +227,7 @@
       SVN_ERR (svn_cmdline_cstring_from_utf8 (&date_stdout, date_utf8, pool));
     }
   else
- date_stdout = "(no date)";
+ date_stdout = _("(no date)");

   if (! lb->omit_log_message)
     {
Index: subversion/clients/cmdline/delete-cmd.c
===================================================================
--- subversion/clients/cmdline/delete-cmd.c (revision 9230)
+++ subversion/clients/cmdline/delete-cmd.c (working copy)
@@ -31,6 +31,7 @@
 #include "svn_pools.h"
 #include "cl.h"

+#include "svn_private_config.h"

 
 /*** Code. ***/
@@ -45,7 +46,7 @@
       /* Should this svn_error_compose a new error number? Probably not,
          the error hasn't changed. */
       err = svn_error_quick_wrap (err,
- "Use --force to override this restriction"
);
+ _("Use --force to override this
restriction") );
     }

   return err;
Index: subversion/clients/cmdline/notify.c
===================================================================
--- subversion/clients/cmdline/notify.c (revision 9230)
+++ subversion/clients/cmdline/notify.c (working copy)
@@ -32,6 +32,8 @@
 #include "svn_pools.h"
 #include "cl.h"

+#include "svn_private_config.h"
+
 
 /* Baton for notify and friends. */
 struct notify_baton
@@ -66,7 +68,7 @@
   err = svn_cmdline_path_local_style_from_utf8 (&path_stdout, path, nb->pool);
   if (err)
     {
- printf ("WARNING: error decoding UTF-8 for ?\n");
+ printf (_("WARNING: error decoding UTF-8 for ?\n"));
       svn_pool_clear (nb->pool);
       svn_error_clear (err);
       return;
@@ -75,9 +77,9 @@
     {
     case svn_wc_notify_skip:
       if (content_state == svn_wc_notify_state_missing)
- printf ("Skipped missing target: '%s'\n", path_stdout);
+ printf (_("Skipped missing target: '%s'\n"), path_stdout);
       else
- printf ("Skipped '%s'\n", path_stdout);
+ printf (_("Skipped '%s'\n"), path_stdout);
       break;

     case svn_wc_notify_update_delete:
@@ -91,19 +93,19 @@
       break;

     case svn_wc_notify_restore:
- printf ("Restored '%s'\n", path_stdout);
+ printf (_("Restored '%s'\n"), path_stdout);
       break;

     case svn_wc_notify_revert:
- printf ("Reverted '%s'\n", path_stdout);
+ printf (_("Reverted '%s'\n"), path_stdout);
       break;

     case svn_wc_notify_failed_revert:
- printf ("Failed to revert '%s' -- try updating instead.\n",
path_stdout);
+ printf (_("Failed to revert '%s' -- try updating instead.\n"),
path_stdout);
       break;

     case svn_wc_notify_resolved:
- printf ("Resolved conflicted state of '%s'\n", path_stdout);
+ printf (_("Resolved conflicted state of '%s'\n"), path_stdout);
       break;

     case svn_wc_notify_add:
@@ -162,7 +164,7 @@
     case svn_wc_notify_update_external:
       /* Currently this is used for checkouts and switches too. If we
          want different output, we'll have to add new actions. */
- printf ("\nFetching external item into '%s'\n", path_stdout);
+ printf (_("\nFetching external item into '%s'\n"), path_stdout);

       /* Remember that we're now "inside" an externals definition. */
       nb->in_external = TRUE;
@@ -197,8 +199,7 @@
             else /* no revision */
               {
                 if (nb->is_export)
- printf ("%sxport complete.\n",
- nb->in_external ? "External e" : "E");
+ printf (nb->in_external ? _("External export complete.\n")
: _("Export complete.\n"));
                 else if (nb->is_checkout)
                   printf ("%sheckout complete.\n",
                           nb->in_external ? "External c" : "C");
@@ -214,7 +215,7 @@
       break;

     case svn_wc_notify_status_external:
- printf ("\nPerforming status on external item at '%s'\n", path_stdout);
+ printf (_("\nPerforming status on external item at '%s'\n"),
path_stdout);
       break;

     case svn_wc_notify_status_completed:
@@ -223,7 +224,7 @@
       break;

     case svn_wc_notify_commit_modified:
- printf ("Sending %s\n", path_stdout);
+ printf (_("Sending %s\n"), path_stdout);
       break;

     case svn_wc_notify_commit_added:
@@ -238,13 +239,13 @@
       break;

     case svn_wc_notify_commit_replaced:
- printf ("Replacing %s\n", path_stdout);
+ printf (_("Replacing %s\n"), path_stdout);
       break;

     case svn_wc_notify_commit_postfix_txdelta:
       if (! nb->sent_first_txdelta)
         {
- printf ("Transmitting file data ");
+ printf (_("Transmitting file data "));
           nb->sent_first_txdelta = TRUE;
         }

Index: subversion/clients/cmdline/export-cmd.c
===================================================================
--- subversion/clients/cmdline/export-cmd.c (revision 9230)
+++ subversion/clients/cmdline/export-cmd.c (working copy)
@@ -29,6 +29,8 @@
 #include "svn_path.h"
 #include "cl.h"

+#include "svn_private_config.h"
+
 
 /*** Code. ***/

@@ -73,8 +75,8 @@
                            opt_state->force, ctx, pool);
   if (err && err->apr_err == SVN_ERR_WC_OBSTRUCTED_UPDATE &&
!opt_state->force)
     SVN_ERR_W (err,
- "Destination directory exists; please remove "
- "the directory or use --force to overwrite");
+ _("Destination directory exists; please remove "
+ "the directory or use --force to overwrite"));
   else
     SVN_ERR (err);

Index: subversion/clients/cmdline/main.c
===================================================================
--- subversion/clients/cmdline/main.c (revision 9230)
+++ subversion/clients/cmdline/main.c (working copy)
@@ -47,6 +47,8 @@
 #include "svn_auth.h"
 #include "cl.h"

+#include "svn_private_config.h"
+
 
 /*** Option Processing ***/

@@ -629,7 +631,7 @@
 svn_cl__check_cancel (void *baton)
 {
   if (cancelled)
- return svn_error_create (SVN_ERR_CANCELLED, NULL, "Caught signal");
+ return svn_error_create (SVN_ERR_CANCELLED, NULL, _("Caught signal"));
   else
     return SVN_NO_ERROR;
 }
@@ -656,6 +658,10 @@
   svn_cl__cmd_baton_t command_baton;
   svn_auth_baton_t *ab;
   svn_config_t *cfg;
+
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE_NAME, SVN_LOCALE_DIR);
+ textdomain (PACKAGE_NAME);

   /* Initialize the app. */
   if (svn_cmdline_init ("svn", stderr) != EXIT_SUCCESS)
@@ -720,8 +726,8 @@
           {
             err = svn_error_create
               (SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- "Multiple revision arguments encountered; "
- "try '-r M:N' instead of '-r M -r N'");
+ _("Multiple revision arguments encountered; "
+ "try '-r M:N' instead of '-r M -r N'"));
             svn_handle_error (err, stderr, FALSE);
             svn_error_clear (err);
             svn_pool_destroy (pool);
@@ -735,7 +741,7 @@
             if (! err)
               err = svn_error_createf
                 (SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- "Syntax error in revision argument '%s'",
+ _("Syntax error in revision argument '%s'"),
                  utf8_opt_arg);
             svn_handle_error (err, stderr, FALSE);
             svn_error_clear (err);
@@ -909,8 +915,8 @@
         if (opt_state.no_autoprops)
           {
             err = svn_error_create (SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
- "--auto-props and --no-auto-props are "
- "mutually exclusive");
+ _("--auto-props and --no-auto-props are "
+ "mutually exclusive"));
             svn_handle_error (err, stderr, FALSE);
             svn_error_clear (err);
             svn_pool_destroy (pool);
@@ -922,8 +928,8 @@
         if (opt_state.autoprops)
           {
             err = svn_error_create (SVN_ERR_CL_MUTUALLY_EXCLUSIVE_ARGS, NULL,
- "--auto-props and --no-auto-props are "
- "mutually exclusive");
+ _("--auto-props and --no-auto-props are "
+ "mutually exclusive"));
             svn_handle_error (err, stderr, FALSE);
             svn_error_clear (err);
             svn_pool_destroy (pool);
@@ -970,7 +976,7 @@
     {
       if (os->ind >= os->argc)
         {
- fprintf (stderr, "subcommand argument required\n");
+ fprintf (stderr, _("subcommand argument required\n"));
           svn_cl__help (NULL, NULL, pool);
           svn_pool_destroy (pool);
           return EXIT_FAILURE;
@@ -982,7 +988,7 @@
                                                          first_arg);
           if (subcommand == NULL)
             {
- fprintf (stderr, "unknown command: '%s'\n", first_arg);
+ fprintf (stderr, _("unknown command: '%s'\n"), first_arg);
               svn_cl__help (NULL, NULL, pool);
               svn_pool_destroy (pool);
               return EXIT_FAILURE;
@@ -1009,8 +1015,8 @@
             svn_opt_get_option_from_code (opt_id, svn_cl__options);
           svn_opt_format_option (&optstr, badopt, FALSE, pool);
           fprintf (stderr,
- "subcommand '%s' doesn't accept option '%s'\n"
- "Type 'svn help %s' for usage.\n",
+ _("subcommand '%s' doesn't accept option '%s'\n"
+ "Type 'svn help %s' for usage.\n"),
                    subcommand->name, optstr, subcommand->name);
           svn_pool_destroy (pool);
           return EXIT_FAILURE;
@@ -1043,8 +1049,8 @@
             {
               err = svn_error_create
(SVN_ERR_CL_LOG_MESSAGE_IS_VERSIONED_FILE,
                                       NULL,
- "Log message file is a versioned file; "
- "use '--force-log' to override");
+ _("Log message file is a versioned
file; "
+ "use '--force-log' to override"));
               svn_handle_error (err, stderr, FALSE);
               svn_error_clear (err);
               svn_pool_destroy (pool);
@@ -1063,9 +1069,9 @@
                         APR_FINFO_MIN, pool) == APR_SUCCESS)
             {
               err = svn_error_create (SVN_ERR_CL_LOG_MESSAGE_IS_PATHNAME,
NULL,
- "The log message is a pathname "
+ _("The log message is a pathname "
                                       "(was -F intended?); use '--force-log' "
- "to override");
+ "to override"));
               svn_handle_error (err, stderr, FALSE);
               svn_error_clear (err);
               svn_pool_destroy (pool);
@@ -1274,8 +1278,8 @@
       for (tmp_err = err; tmp_err; tmp_err = tmp_err->child)
         if (tmp_err->apr_err == SVN_ERR_WC_LOCKED)
           {
- fputs ("svn: run 'svn cleanup' to remove locks"
- " (type 'svn help cleanup' for details)\n", stderr);
+ fputs (_("svn: run 'svn cleanup' to remove locks"
+ " (type 'svn help cleanup' for details)\n"), stderr);
             break;
           }

Index: subversion/clients/cmdline/info-cmd.c
===================================================================
--- subversion/clients/cmdline/info-cmd.c (revision 9230)
+++ subversion/clients/cmdline/info-cmd.c (working copy)
@@ -31,6 +31,8 @@
 #include "svn_time.h"
 #include "cl.h"

+#include "svn_private_config.h"
+
 
 /*** Code. ***/

@@ -59,7 +61,7 @@

   /* Get a non-UTF8 version of the target. */
   SVN_ERR (svn_cmdline_path_local_style_from_utf8 (&name_stdout, target,
pool));
- printf ("Path: %s\n", name_stdout);
+ printf (_("Path: %s\n"), name_stdout);

   /* Note: we have to be paranoid about checking that these are
      valid, since svn_wc_entry() doesn't fill them in if they
@@ -69,25 +71,25 @@
     {
       SVN_ERR (svn_cmdline_cstring_from_utf8 (&name_stdout,
                                               entry->name, pool));
- printf ("Name: %s\n", name_stdout);
+ printf (_("Name: %s\n"), name_stdout);
     }

   if (entry->url)
     {
       SVN_ERR (svn_cmdline_cstring_from_utf8 (&name_stdout, entry->url,
pool));
- printf ("URL: %s\n", name_stdout);
+ printf (_("URL: %s\n"), name_stdout);
     }

   if (entry->repos)
     {
       SVN_ERR (svn_cmdline_cstring_from_utf8 (&name_stdout,
                                               entry->repos, pool));
- printf ("Repository: %s\n", name_stdout);
+ printf (_("Repository: %s\n"), name_stdout);
     }

   if (entry->uuid)
     {
- printf ("Repository UUID: %s\n", entry->uuid);
+ printf (_("Repository UUID: %s\n"), entry->uuid);
     }

   if (SVN_IS_VALID_REVNUM (entry->revision))
@@ -96,7 +98,7 @@
   switch (entry->kind)
     {
     case svn_node_file:
- printf ("Node Kind: file\n");
+ printf (_("Node Kind: file\n"));
       {
         const char *dir_name;
         svn_path_split (target, &dir_name, NULL, pool);
@@ -106,37 +108,37 @@
       break;

     case svn_node_dir:
- printf ("Node Kind: directory\n");
+ printf (_("Node Kind: directory\n"));
       SVN_ERR (svn_wc_conflicted_p (&text_conflict, &props_conflict,
                                     target, entry, pool));
       break;

     case svn_node_none:
- printf ("Node Kind: none\n");
+ printf (_("Node Kind: none\n"));
       break;

     case svn_node_unknown:
     default:
- printf ("Node Kind: unknown\n");
+ printf (_("Node Kind: unknown\n"));
       break;
     }

   switch (entry->schedule)
     {
     case svn_wc_schedule_normal:
- printf ("Schedule: normal\n");
+ printf (_("Schedule: normal\n"));
       break;

     case svn_wc_schedule_add:
- printf ("Schedule: add\n");
+ printf (_("Schedule: add\n"));
       break;

     case svn_wc_schedule_delete:
- printf ("Schedule: delete\n");
+ printf (_("Schedule: delete\n"));
       break;

     case svn_wc_schedule_replace:
- printf ("Schedule: replace\n");
+ printf (_("Schedule: replace\n"));
       break;

     default:
@@ -150,7 +152,7 @@
           SVN_ERR (svn_cmdline_cstring_from_utf8 (&name_stdout,
                                                   entry->copyfrom_url,
                                                   pool));
- printf ("Copied From URL: %s\n", name_stdout);
+ printf (_("Copied From URL: %s\n"), name_stdout);
         }

       if (SVN_IS_VALID_REVNUM (entry->copyfrom_rev))
@@ -162,7 +164,7 @@
     {
       SVN_ERR (svn_cmdline_cstring_from_utf8 (&name_stdout,
                                               entry->cmt_author, pool));
- printf ("Last Changed Author: %s\n", name_stdout);
+ printf (_("Last Changed Author: %s\n"), name_stdout);
     }

   if (SVN_IS_VALID_REVNUM (entry->cmt_rev))
@@ -170,49 +172,49 @@

   if (entry->cmt_date)
     SVN_ERR (svn_cl__info_print_time (entry->cmt_date,
- "Last Changed Date", pool));
+ _("Last Changed Date"), pool));

   if (entry->text_time)
     SVN_ERR (svn_cl__info_print_time (entry->text_time,
- "Text Last Updated", pool));
+ _("Text Last Updated"), pool));

   if (entry->prop_time)
     SVN_ERR (svn_cl__info_print_time (entry->prop_time,
- "Properties Last Updated", pool));
+ _("Properties Last Updated"), pool));

   if (entry->checksum)
     {
       SVN_ERR (svn_cmdline_cstring_from_utf8 (&name_stdout,
                                               entry->checksum, pool));
- printf ("Checksum: %s\n", name_stdout);
+ printf (_("Checksum: %s\n"), name_stdout);
     }

   if (text_conflict && entry->conflict_old)
     {
       SVN_ERR (svn_cmdline_path_local_style_from_utf8
                (&name_stdout, entry->conflict_old, pool));
- printf ("Conflict Previous Base File: %s\n", name_stdout);
+ printf (_("Conflict Previous Base File: %s\n"), name_stdout);
     }

   if (text_conflict && entry->conflict_wrk)
     {
       SVN_ERR (svn_cmdline_path_local_style_from_utf8
                (&name_stdout, entry->conflict_wrk, pool));
- printf ("Conflict Previous Working File: %s\n", name_stdout);
+ printf (_("Conflict Previous Working File: %s\n"), name_stdout);
     }

   if (text_conflict && entry->conflict_new)
     {
       SVN_ERR (svn_cmdline_path_local_style_from_utf8
                (&name_stdout, entry->conflict_new, pool));
- printf ("Conflict Current Base File: %s\n", name_stdout);
+ printf (_("Conflict Current Base File: %s\n"), name_stdout);
     }

   if (props_conflict && entry->prejfile)
     {
       SVN_ERR (svn_cmdline_path_local_style_from_utf8
                (&name_stdout, entry->prejfile, pool));
- printf ("Conflict Properties File: %s\n", name_stdout);
+ printf (_("Conflict Properties File: %s\n"), name_stdout);
     }

   /* Print extra newline separator. */
@@ -289,7 +291,7 @@
           SVN_ERR (svn_cmdline_path_local_style_from_utf8
                    (&target_stdout, target, subpool));

- printf ("%s: (Not a versioned resource)\n\n", target_stdout);
+ printf (_("%s: (Not a versioned resource)\n\n"), target_stdout);
           continue;
         }

--- po/es.po Tue Mar 30 01:38:39 2004
+++ po/es.po Tue Mar 30 01:16:34 2004
@@ -502,3 +502,6 @@
 #, c-format
 msgid "'%s' has unknown value for svn:eol-style property"
 msgstr "'%s' tiene un valor desconocido para la propiedad svn:eol-style"
+
+msgid "Type '%s help' for usage.\n"
+msgstr "Typo me '%s' help' for na-na-na usage.\n"

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Tue Mar 30 11:50:40 2004

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.