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

[PATCH] Support both BDB 4.0 and 4.1

From: Branko Čibej <brane_at_xbc.nu>
Date: 2002-10-21 02:02:59 CEST

Just a heads-up,

I took Justin's patch and forced it to support both BDB 4.0.x and 4.1.x.
I also uploaded a Win32 binary of BDB 4.1.24, if anyone would like to
test this on Windows -- although note that you'll have to change the
.dsp files to link with libdb41.lib instead of libdb40.lib.

I think we shouldn't announce support for DBD 4.1 just yet; I'm
attaching this patch in the hope that people will test it on Unix boxes.
I'm testing it on Windows right now (with both BDB versions), and will
commit once some Unix test reports come in.

Oh yes, the log message:

Added support for building with both Berkeley DB 4.0.14 and 4.1.24.
Based on this patch by Justin Erenkrantz <jerenkrantz@apache.org>:

    http://subversion.tigris.org/servlets/ReadMsg?list=dev&msgNo=22004

[ in subversion/libsvn_fs ]
* bdb/bdb_compat.h: New header. Definitions for BDB 4.0/4.1 compatibility.

* bdb/changes-table.c, bdb/copies-table.c, bdb/nodes-table.c, bdb/reps-table.c,
  bdb/rev-table.c, bdb/strings-table.c, bdb/txn-table.c:
Include bdb_compat.h instead of db.h. In calls to DB->open, wrap the
environment and transaction parameter in SVN_BDB_OPEN_PARAMS. Pass the
SVN_BDB_AUTO_COMMIT flag to DB->open and DB->put wherever the transaction
is NULL. Check the BDB version before each call to db_create.

* bdb/changes-table.h, bdb/dbt.c, bdb/dbt.h, bdb/nodes-table.h,
  bdb/strings-table.h, bdb/rev-table.h: Include bdb_compat.h instead of db.h.

* fs.c: Include bdb/bdb_compat.h.
(check_db_version): New function.
(check_already_open): Extract version check into check_db_version.
(svn_fs_create_berkeley, svn_fs_open_berkeley): Call check_db_version.
(cleanup_fs_db, cleanup_fs): Make usage of DB_INCOMPLETE conditional.

-- 
Brane Čibej   <brane_at_xbc.nu>   http://www.xbc.nu/brane/

cd c:/Home/brane/src/svn/repo/
svn diff
Index: subversion/libsvn_fs/bdb/reps-table.c
===================================================================
--- subversion/libsvn_fs/bdb/reps-table.c
+++ subversion/libsvn_fs/bdb/reps-table.c 2002-10-20 23:35:35.000000000 +0200
@@ -15,7 +15,7 @@
  * ====================================================================
  */
 
-#include <db.h>
+#include "bdb_compat.h"
 #include "svn_fs.h"
 #include "../fs.h"
 #include "../util/fs_skels.h"
@@ -35,11 +35,14 @@
                          DB_ENV *env,
                          int create)
 {
+ int open_flags = (create ? (DB_CREATE | DB_EXCL) : 0);
   DB *reps;
 
+ DB_ERR (svn_bdb__check_version());
   DB_ERR (db_create (&reps, env, 0));
- DB_ERR (reps->open (reps, "representations", 0, DB_BTREE,
- create ? (DB_CREATE | DB_EXCL) : 0,
+ DB_ERR (reps->open (SVN_BDB_OPEN_PARAMS(reps, NULL),
+ "representations", 0, DB_BTREE,
+ open_flags | SVN_BDB_AUTO_COMMIT,
                       0666));
 
   /* Create the `next-key' table entry. */
@@ -51,7 +54,7 @@
             (reps, 0,
              svn_fs__str_to_dbt (&key, (char *) svn_fs__next_key_key),
              svn_fs__str_to_dbt (&value, (char *) "0"),
- 0));
+ SVN_BDB_AUTO_COMMIT));
   }
 
   *reps_p = reps;
Index: subversion/libsvn_fs/bdb/txn-table.c
===================================================================
--- subversion/libsvn_fs/bdb/txn-table.c
+++ subversion/libsvn_fs/bdb/txn-table.c 2002-10-20 23:36:16.000000000 +0200
@@ -16,8 +16,8 @@
  */
 
 #include <string.h>
-#include <db.h>
 #include <assert.h>
+#include "bdb_compat.h"
 
 #include "svn_pools.h"
 #include "txn-table.h"
@@ -43,11 +43,14 @@
                                  DB_ENV *env,
                                  int create)
 {
+ int open_flags = (create ? (DB_CREATE | DB_EXCL) : 0);
   DB *txns;
 
+ DB_ERR (svn_bdb__check_version());
   DB_ERR (db_create (&txns, env, 0));
- DB_ERR (txns->open (txns, "transactions", 0, DB_BTREE,
- create ? (DB_CREATE | DB_EXCL) : 0,
+ DB_ERR (txns->open (SVN_BDB_OPEN_PARAMS(txns, NULL),
+ "transactions", 0, DB_BTREE,
+ open_flags | SVN_BDB_AUTO_COMMIT,
                       0666));
 
   /* Create the `next-id' table entry. */
@@ -59,7 +62,7 @@
                        svn_fs__str_to_dbt (&key,
                                            (char *) svn_fs__next_key_key),
                        svn_fs__str_to_dbt (&value, (char *) "0"),
- 0));
+ SVN_BDB_AUTO_COMMIT));
   }
 
   *transactions_p = txns;
Index: subversion/libsvn_fs/bdb/bdb_compat.h
===================================================================
--- subversion/libsvn_fs/bdb/bdb_compat.h
+++ subversion/libsvn_fs/bdb/bdb_compat.h 2002-10-21 01:25:53.000000000 +0200
@@ -0,0 +1,81 @@
+/* svn_bdb_compat.h --- Compatibility wrapper for different BDB versions.
+ *
+ * ====================================================================
+ * Copyright (c) 2000-2002 CollabNet. All rights reserved.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at http://subversion.tigris.org/license-1.html.
+ * If newer versions of this license are posted there, you may use a
+ * newer version instead, at your option.
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals. For exact contribution history, see the revision
+ * history and logs, available at http://subversion.tigris.org/.
+ * ====================================================================
+ */
+
+#ifndef SVN_LIBSVN_FS_BDB_COMPAT_H
+#define SVN_LIBSVN_FS_BDB_COMPAT_H
+
+#include <db.h>
+
+/* BDB 4.1 introduced the DB_AUTO_COMMIT flag. Older versions can just
+ use 0 instead. */
+#ifdef DB_AUTO_COMMIT
+#define SVN_BDB_AUTO_COMMIT (DB_AUTO_COMMIT)
+#else
+#define SVN_BDB_AUTO_COMMIT (0)
+#endif
+
+/* DB_INCOMPLETE is obsolete in BDB 4.1. */
+#ifdef DB_INCOMPLETE
+#define SVN_BDB_HAS_DB_INCOMPLETE 1
+#else
+#define SVN_BDB_HAS_DB_INCOMPLETE 0
+#endif
+
+/* In BDB 4.1, DB->open takes a transaction parameter. We'll ignore it
+ when building with 4.0. */
+#if (DB_VERSION_MAJOR > 4) \
+ || (DB_VERSION_MAJOR == 4) && (DB_VERSION_MINOR >= 1)
+#define SVN_BDB_OPEN_PARAMS(env,txn) (env), (txn)
+#else
+#define SVN_BDB_OPEN_PARAMS(env,txn) (env)
+#endif
+
+
+/* Before calling db_create, we must check that the version of the BDB
+ libraries we're linking with is the same as the one we compiled
+ against, because the DB->open call is not binary compatible between
+ BDB 4.0 and 4.1. */
+static int svn_bdb__check_version (void)
+{
+ static const int compiled_major = DB_VERSION_MAJOR;
+ static const int compiled_minor = DB_VERSION_MINOR;
+ int linked_major, linked_minor;
+ db_version(&linked_major, &linked_minor, NULL);
+ if (compiled_major != linked_major
+ || compiled_minor != linked_minor)
+ return DB_OLD_VERSION;
+ return 0;
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_LIBSVN_FS_BDB_COMPAT_H */
+
+
+/*
+ * local variables:
+ * eval: (load-file "../../../tools/dev/svn-dev.el")
+ * end:
+ */
Index: subversion/libsvn_fs/bdb/changes-table.h
===================================================================
--- subversion/libsvn_fs/bdb/changes-table.h
+++ subversion/libsvn_fs/bdb/changes-table.h 2002-10-20 23:34:27.000000000 +0200
@@ -18,7 +18,7 @@
 #ifndef SVN_LIBSVN_FS_CHANGES_TABLE_H
 #define SVN_LIBSVN_FS_CHANGES_TABLE_H
 
-#include "db.h"
+#include "bdb_compat.h"
 #include "svn_io.h"
 #include "svn_fs.h"
 #include "../trail.h"
Index: subversion/libsvn_fs/bdb/nodes-table.h
===================================================================
--- subversion/libsvn_fs/bdb/nodes-table.h
+++ subversion/libsvn_fs/bdb/nodes-table.h 2002-10-20 23:35:29.000000000 +0200
@@ -18,7 +18,7 @@
 #ifndef SVN_LIBSVN_FS_NODES_TABLE_H
 #define SVN_LIBSVN_FS_NODES_TABLE_H
 
-#include <db.h>
+#include "bdb_compat.h"
 #include "svn_fs.h"
 #include "../trail.h"
 
Index: subversion/libsvn_fs/bdb/reps-table.h
===================================================================
--- subversion/libsvn_fs/bdb/reps-table.h
+++ subversion/libsvn_fs/bdb/reps-table.h 2002-10-20 23:35:41.000000000 +0200
@@ -18,7 +18,7 @@
 #ifndef SVN_LIBSVN_FS_REPS_TABLE_H
 #define SVN_LIBSVN_FS_REPS_TABLE_H
 
-#include <db.h>
+#include "bdb_compat.h"
 #include "svn_io.h"
 #include "svn_fs.h"
 #include "../fs.h"
Index: subversion/libsvn_fs/bdb/copies-table.c
===================================================================
--- subversion/libsvn_fs/bdb/copies-table.c
+++ subversion/libsvn_fs/bdb/copies-table.c 2002-10-21 00:26:18.000000000 +0200
@@ -17,7 +17,7 @@
 
 #include <string.h>
 
-#include <db.h>
+#include "bdb_compat.h"
 #include "../fs.h"
 #include "../err.h"
 #include "../key-gen.h"
@@ -35,11 +35,14 @@
                            DB_ENV *env,
                            int create)
 {
+ int open_flags = (create ? (DB_CREATE | DB_EXCL) : 0);
   DB *copies;
 
+ DB_ERR (svn_bdb__check_version());
   DB_ERR (db_create (&copies, env, 0));
- DB_ERR (copies->open (copies, "copies", 0, DB_BTREE,
- create ? (DB_CREATE | DB_EXCL) : 0,
+ DB_ERR (copies->open (SVN_BDB_OPEN_PARAMS(copies, NULL),
+ "copies", 0, DB_BTREE,
+ open_flags | SVN_BDB_AUTO_COMMIT,
                         0666));
 
   /* Create the initial `next-id' table entry. */
@@ -50,7 +53,7 @@
                          svn_fs__str_to_dbt (&key,
                                              (char *) svn_fs__next_key_key),
                          svn_fs__str_to_dbt (&value, (char *) "0"),
- 0));
+ SVN_BDB_AUTO_COMMIT));
   }
 
   *copies_p = copies;
Index: subversion/libsvn_fs/bdb/dbt.c
===================================================================
--- subversion/libsvn_fs/bdb/dbt.c
+++ subversion/libsvn_fs/bdb/dbt.c 2002-10-20 23:35:06.000000000 +0200
@@ -18,7 +18,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <apr_pools.h>
-#include <db.h>
+#include "bdb_compat.h"
 #include "dbt.h"
 
 
Index: subversion/libsvn_fs/bdb/strings-table.c
===================================================================
--- subversion/libsvn_fs/bdb/strings-table.c
+++ subversion/libsvn_fs/bdb/strings-table.c 2002-10-21 00:27:36.000000000 +0200
@@ -15,7 +15,7 @@
  * ====================================================================
  */
 
-#include <db.h>
+#include "bdb_compat.h"
 #include "svn_fs.h"
 #include "svn_pools.h"
 #include "../fs.h"
@@ -33,17 +33,20 @@
                             DB_ENV *env,
                             int create)
 {
+ int open_flags = (create ? (DB_CREATE | DB_EXCL) : 0);
   DB *strings;
 
+ DB_ERR (svn_bdb__check_version());
   DB_ERR (db_create (&strings, env, 0));
 
   /* Enable duplicate keys. This allows the data to be spread out across
      multiple records. Note: this must occur before ->open(). */
   DB_ERR (strings->set_flags (strings, DB_DUP));
 
- DB_ERR (strings->open (strings, "strings", 0, DB_BTREE,
- create ? (DB_CREATE | DB_EXCL) : 0,
- 0666));
+ DB_ERR (strings->open (SVN_BDB_OPEN_PARAMS(strings, NULL),
+ "strings", 0, DB_BTREE,
+ open_flags | SVN_BDB_AUTO_COMMIT,
+ 0666));
 
   if (create)
   {
@@ -54,7 +57,7 @@
             (strings, 0,
              svn_fs__str_to_dbt (&key, (char *) svn_fs__next_key_key),
              svn_fs__str_to_dbt (&value, (char *) "0"),
- 0));
+ SVN_BDB_AUTO_COMMIT));
   }
   
   *strings_p = strings;
Index: subversion/libsvn_fs/bdb/dbt.h
===================================================================
--- subversion/libsvn_fs/bdb/dbt.h
+++ subversion/libsvn_fs/bdb/dbt.h 2002-10-20 23:35:16.000000000 +0200
@@ -19,7 +19,7 @@
 #define SVN_LIBSVN_FS_DBT_H
 
 #include <apr_pools.h>
-#include <db.h>
+#include "bdb_compat.h"
 
 #include "svn_fs.h"
 #include "../util/skel.h"
Index: subversion/libsvn_fs/bdb/rev-table.c
===================================================================
--- subversion/libsvn_fs/bdb/rev-table.c
+++ subversion/libsvn_fs/bdb/rev-table.c 2002-10-21 00:27:18.000000000 +0200
@@ -15,7 +15,7 @@
  * ====================================================================
  */
 
-#include <db.h>
+#include "bdb_compat.h"
 #include "svn_fs.h"
 #include "../fs.h"
 #include "../err.h"
@@ -31,11 +31,14 @@
                                   DB_ENV *env,
                                   int create)
 {
+ int open_flags = (create ? (DB_CREATE | DB_EXCL) : 0);
   DB *revisions;
 
+ DB_ERR (svn_bdb__check_version());
   DB_ERR (db_create (&revisions, env, 0));
- DB_ERR (revisions->open (revisions, "revisions", 0, DB_RECNO,
- create ? (DB_CREATE | DB_EXCL) : 0,
+ DB_ERR (revisions->open (SVN_BDB_OPEN_PARAMS(revisions, NULL),
+ "revisions", 0, DB_RECNO,
+ open_flags | SVN_BDB_AUTO_COMMIT,
                            0666));
 
   *revisions_p = revisions;
Index: subversion/libsvn_fs/bdb/strings-table.h
===================================================================
--- subversion/libsvn_fs/bdb/strings-table.h
+++ subversion/libsvn_fs/bdb/strings-table.h 2002-10-20 23:36:07.000000000 +0200
@@ -18,7 +18,7 @@
 #ifndef SVN_LIBSVN_FS_STRINGS_TABLE_H
 #define SVN_LIBSVN_FS_STRINGS_TABLE_H
 
-#include <db.h>
+#include "bdb_compat.h"
 #include "svn_io.h"
 #include "svn_fs.h"
 #include "../trail.h"
Index: subversion/libsvn_fs/bdb/rev-table.h
===================================================================
--- subversion/libsvn_fs/bdb/rev-table.h
+++ subversion/libsvn_fs/bdb/rev-table.h 2002-10-20 23:35:55.000000000 +0200
@@ -18,7 +18,7 @@
 #ifndef SVN_LIBSVN_FS_REV_TABLE_H
 #define SVN_LIBSVN_FS_REV_TABLE_H
 
-#include <db.h>
+#include "bdb_compat.h"
 #include "svn_fs.h"
 
 #include "../fs.h"
Index: subversion/libsvn_fs/bdb/changes-table.c
===================================================================
--- subversion/libsvn_fs/bdb/changes-table.c
+++ subversion/libsvn_fs/bdb/changes-table.c 2002-10-21 00:28:30.000000000 +0200
@@ -15,7 +15,7 @@
  * ====================================================================
  */
 
-#include <db.h>
+#include "bdb_compat.h"
 
 #include <apr_hash.h>
 #include <apr_tables.h>
@@ -39,16 +39,19 @@
                             DB_ENV *env,
                             int create)
 {
+ int open_flags = (create ? (DB_CREATE | DB_EXCL) : 0);
   DB *changes;
 
+ DB_ERR (svn_bdb__check_version());
   DB_ERR (db_create (&changes, env, 0));
 
   /* Enable duplicate keys. This allows us to store the changes
      one-per-row. Note: this must occur before ->open(). */
   DB_ERR (changes->set_flags (changes, DB_DUP));
 
- DB_ERR (changes->open (changes, "changes", 0, DB_BTREE,
- create ? (DB_CREATE | DB_EXCL) : 0,
+ DB_ERR (changes->open (SVN_BDB_OPEN_PARAMS(changes, NULL),
+ "changes", 0, DB_BTREE,
+ open_flags | SVN_BDB_AUTO_COMMIT,
                          0666));
 
   *changes_p = changes;
Index: subversion/libsvn_fs/bdb/nodes-table.c
===================================================================
--- subversion/libsvn_fs/bdb/nodes-table.c
+++ subversion/libsvn_fs/bdb/nodes-table.c 2002-10-21 00:26:48.000000000 +0200
@@ -17,7 +17,7 @@
 
 #include <string.h>
 #include <assert.h>
-#include <db.h>
+#include "bdb_compat.h"
 
 #include "svn_fs.h"
 
@@ -41,11 +41,14 @@
                           DB_ENV *env,
                           int create)
 {
+ int open_flags = (create ? (DB_CREATE | DB_EXCL) : 0);
   DB *nodes;
 
+ DB_ERR (svn_bdb__check_version());
   DB_ERR (db_create (&nodes, env, 0));
- DB_ERR (nodes->open (nodes, "nodes", 0, DB_BTREE,
- create ? (DB_CREATE | DB_EXCL) : 0,
+ DB_ERR (nodes->open (SVN_BDB_OPEN_PARAMS(nodes, NULL),
+ "nodes", 0, DB_BTREE,
+ open_flags | SVN_BDB_AUTO_COMMIT,
                        0666));
 
   /* Create the `next-id' table entry (use '1' because '0' is
@@ -58,7 +61,7 @@
                         svn_fs__str_to_dbt (&key,
                                             (char *) svn_fs__next_key_key),
                         svn_fs__str_to_dbt (&value, (char *) "1"),
- 0));
+ SVN_BDB_AUTO_COMMIT));
   }
 
   *nodes_p = nodes;
Index: subversion/libsvn_fs/fs.c
===================================================================
--- subversion/libsvn_fs/fs.c
+++ subversion/libsvn_fs/fs.c 2002-10-21 01:15:52.000000000 +0200
@@ -34,6 +34,7 @@
 #include "dag.h"
 #include "svn_private_config.h"
 
+#include "bdb/bdb_compat.h"
 #include "bdb/nodes-table.h"
 #include "bdb/rev-table.h"
 #include "bdb/txn-table.h"
@@ -45,28 +46,49 @@
 
 /* Checking for return values, and reporting errors. */
 
-
-/* If FS is already open, then return an SVN_ERR_FS_ALREADY_OPEN
- error. Otherwise, return zero. */
+/* Check that we're using the right Berkeley DB version. */
+/* FIXME: This check should be abstracted into the DB back-end layer. */
 static svn_error_t *
-check_already_open (svn_fs_t *fs)
+check_bdb_version (apr_pool_t *pool)
 {
+ static const int compiled_major = DB_VERSION_MAJOR;
+ static const int compiled_minor = DB_VERSION_MINOR;
+ static const int compiled_patch = DB_VERSION_PATCH;
   int major, minor, patch;
 
- /* ### check_already_open() doesn't truly have the right semantic for
- ### this, but it is called by both create_berkeley and open_berkeley,
- ### so it happens to be a low-cost point. probably should be
- ### refactored to go elsewhere. note that svn_fs_new() doesn't return
- ### an error, so it isn't quite suitable. */
   db_version (&major, &minor, &patch);
+
+ /* First, check that we're using a reasonably correct of Berkeley DB. */
   if ((major < SVN_FS_WANT_DB_MAJOR)
       || (major == SVN_FS_WANT_DB_MAJOR && minor < SVN_FS_WANT_DB_MINOR)
       || (major == SVN_FS_WANT_DB_MAJOR && minor == SVN_FS_WANT_DB_MINOR
           && patch < SVN_FS_WANT_DB_PATCH))
- return svn_error_createf (SVN_ERR_FS_GENERAL, 0, 0, fs->pool,
- "bad database version: %d.%d.%d",
+ return svn_error_createf (SVN_ERR_FS_GENERAL, 0, 0, pool,
+ "bad database version: got %d.%d.%d,"
+ " should be at least %d.%d.%d",
+ major, minor, patch,
+ SVN_FS_WANT_DB_MAJOR,
+ SVN_FS_WANT_DB_MINOR,
+ SVN_FS_WANT_DB_PATCH);
+
+ /* Now, check that the version we're running against is the same as
+ the one we compiled with. */
+ if (major != compiled_major || minor != compiled_minor)
+ return svn_error_createf (SVN_ERR_FS_GENERAL, 0, 0, pool,
+ "bad database version:"
+ " compiled with %d.%d.%d,"
+ " running against %d.%d.%d",
+ compiled_major, compiled_minor, compiled_patch,
                               major, minor, patch);
+ return SVN_NO_ERROR;
+}
 
+
+/* If FS is already open, then return an SVN_ERR_FS_ALREADY_OPEN
+ error. Otherwise, return zero. */
+static svn_error_t *
+check_already_open (svn_fs_t *fs)
+{
   if (fs->env)
     return svn_error_create (SVN_ERR_FS_ALREADY_OPEN, 0, 0, fs->pool,
                              "filesystem object already open");
@@ -104,6 +126,7 @@
       *db_ptr = 0;
       db_err = db->close (db, 0);
 
+#if SVN_BDB_HAS_DB_INCOMPLETE
       /* We can ignore DB_INCOMPLETE on db->close and db->sync; it
        * just means someone else was using the db at the same time
        * we were. See the Berkeley documentation at:
@@ -112,6 +135,7 @@
        */
       if (db_err == DB_INCOMPLETE)
         db_err = 0;
+#endif /* SVN_BDB_HAS_DB_INCOMPLETE */
 
       SVN_ERR (DB_WRAP (fs, msg, db_err));
     }
@@ -141,11 +165,13 @@
   {
     int db_err = env->txn_checkpoint (env, 0, 0, 0);
 
+#if SVN_BDB_HAS_DB_INCOMPLETE
     while (db_err == DB_INCOMPLETE)
       {
         apr_sleep (APR_USEC_PER_SEC * 1);
         db_err = env->txn_checkpoint (env, 0, 0, 0);
       }
+#endif /* SVN_BDB_HAS_DB_INCOMPLETE */
 
     /* If the environment was not (properly) opened, then txn_checkpoint
        will typically return EINVAL. Ignore this case.
@@ -383,6 +409,7 @@
   svn_error_t *svn_err;
   const char *path_native;
 
+ SVN_ERR (check_bdb_version (fs->pool));
   SVN_ERR (check_already_open (fs));
 
   /* Initialize the fs's path. */
@@ -519,6 +546,7 @@
   svn_error_t *svn_err;
   const char *path_native;
 
+ SVN_ERR (check_bdb_version (fs->pool));
   SVN_ERR (check_already_open (fs));
 
   /* Initialize paths. */

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Mon Oct 21 02:03:47 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.