subversion-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From i...@apache.org
Subject svn commit: r1628216 [1/2] - in /subversion/branches/remove-log-addressing: ./ build/ notes/ subversion/include/ subversion/include/private/ subversion/libsvn_client/ subversion/libsvn_fs_base/ subversion/libsvn_fs_fs/ subversion/libsvn_fs_x/ subversio...
Date Mon, 29 Sep 2014 16:45:22 GMT
Author: ivan
Date: Mon Sep 29 16:45:21 2014
New Revision: 1628216

URL: http://svn.apache.org/r1628216
Log:
On remove-log-addressing branch: Merge changes from trunk.

Modified:
    subversion/branches/remove-log-addressing/   (props changed)
    subversion/branches/remove-log-addressing/autogen.sh
    subversion/branches/remove-log-addressing/build/buildcheck.sh
    subversion/branches/remove-log-addressing/notes/   (props changed)
    subversion/branches/remove-log-addressing/notes/knobs
    subversion/branches/remove-log-addressing/subversion/include/private/svn_dep_compat.h
    subversion/branches/remove-log-addressing/subversion/include/svn_error_codes.h
    subversion/branches/remove-log-addressing/subversion/include/svn_fs.h
    subversion/branches/remove-log-addressing/subversion/libsvn_client/relocate.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_base/fs.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/cached_data.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs_fs.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs_fs.h
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/index.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/index.h
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/structure-indexes
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/transaction.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/   (props changed)
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/cached_data.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/index.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/noderevs.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/transaction.c
    subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/verify.c
    subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/blame.c
    subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/commit.c
    subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/get_lock.c
    subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/lock.c
    subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/log.c
    subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/merge.c
    subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/ra_serf.h
    subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/xml.c
    subversion/branches/remove-log-addressing/subversion/libsvn_repos/repos.c
    subversion/branches/remove-log-addressing/subversion/svnfsfs/stats-cmd.c
    subversion/branches/remove-log-addressing/subversion/tests/libsvn_fs/fs-test.c
    subversion/branches/remove-log-addressing/tools/client-side/svn-vendor.py
    subversion/branches/remove-log-addressing/tools/dev/fsfs-access-map.c

Propchange: subversion/branches/remove-log-addressing/
------------------------------------------------------------------------------
  Merged /subversion/trunk:r1626259-1628178

Modified: subversion/branches/remove-log-addressing/autogen.sh
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/autogen.sh?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/autogen.sh (original)
+++ subversion/branches/remove-log-addressing/autogen.sh Mon Sep 29 16:45:21 2014
@@ -59,7 +59,8 @@ done
 # ### APR's libtool. deferring to a second round of change...
 #
 
-libtoolize="`./build/PrintPath glibtoolize libtoolize libtoolize15`"
+# Much like APR except we do not prefer libtool 1 over libtool 2.
+libtoolize="`./build/PrintPath glibtoolize libtoolize glibtoolize1 libtoolize15 libtoolize14`"
 lt_major_version=`$libtoolize --version 2>/dev/null | sed -e 's/^[^0-9]*//' -e 's/\..*//' -e '/^$/d' -e 1q`
 
 if [ "x$libtoolize" = "x" ]; then

Modified: subversion/branches/remove-log-addressing/build/buildcheck.sh
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/build/buildcheck.sh?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/build/buildcheck.sh (original)
+++ subversion/branches/remove-log-addressing/build/buildcheck.sh Mon Sep 29 16:45:21 2014
@@ -97,14 +97,15 @@ else
   esac
 fi
 
-libtool=${LIBTOOL:-`./build/PrintPath glibtool libtool libtool15`}
+# Much like APR except we do not prefer libtool 1 over libtool 2.
+libtoolize=${LIBTOOLIZE:-`./build/PrintPath glibtoolize libtoolize glibtoolize1 libtoolize15 libtoolize14`}
 # Extract the libtool version number: everything from the first number in
 # the version text until a hyphen or space.
-lt_pversion=`$libtool --version 2>/dev/null |
+lt_pversion=`$libtoolize --version 2>/dev/null |
   sed -e 's/^[^0-9]*//' -e 's/[- ].*//' -e '/^$/d' |
   sed -e 1q`
 if test -z "$lt_pversion"; then
-  echo "buildcheck: libtool not found."
+  echo "buildcheck: libtoolize not found."
   echo "            You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
   exit 1
 fi

Propchange: subversion/branches/remove-log-addressing/notes/
------------------------------------------------------------------------------
  Merged /subversion/trunk/notes:r1620575-1628178

Modified: subversion/branches/remove-log-addressing/notes/knobs
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/notes/knobs?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/notes/knobs (original)
+++ subversion/branches/remove-log-addressing/notes/knobs Mon Sep 29 16:45:21 2014
@@ -55,6 +55,7 @@ SVN_SQLITE_MIN_VERSION_NUMBER
 SVN_SQLITE_MIN_VERSION
 SVN_SERF_NO_LOGGING
 SVN_ALLOW_SHORT_INTS
+SVN_ALLOW_NON_8_BIT_CHARS
 
 2.3 Debugging Support
 
@@ -290,6 +291,18 @@ SVN_I_LIKE_LATENCY_SO_IGNORE_HTTPV2
   Default:   not defined
   Suggested: not defined (to ensure correct behaviour)
 
+4.12 SVN_ALLOW_NON_8_BIT_CHARS
+
+  Scope:     global
+  Purpose:   Disables the size check for the 'char' type.  We assume char
+             has exactly 8 bits.  Other values may break the code reading,
+             interpreting and writing repository files.  Defining this option
+             will allow SVN to be compiled even if the size check would fail
+             for some reason.
+  Range:     definedness
+  Default:   not defined
+  Suggested: not defined (to ensure correct behaviour)
+
 
 5 Defines controlling debug support
 ==================================

Modified: subversion/branches/remove-log-addressing/subversion/include/private/svn_dep_compat.h
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/include/private/svn_dep_compat.h?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/include/private/svn_dep_compat.h (original)
+++ subversion/branches/remove-log-addressing/subversion/include/private/svn_dep_compat.h Mon Sep 29 16:45:21 2014
@@ -47,6 +47,19 @@ extern "C" {
 #endif
 
 /**
+ * We assume that 'char' is 8 bits wide.  The critical interfaces are
+ * our repository formats and RA encodings.  E.g. a 32 bit wide char may
+ * mess up UTF8 parsing, how we interpret size values etc.
+ *
+ * @since New in 1.9.
+ */
+#if    defined(CHAR_BIT) \
+    && !defined(SVN_ALLOW_NON_8_BIT_CHARS) \
+    && (CHAR_BIT != 8)
+#error char is not 8 bits and may break Subversion. Define SVN_ALLOW_NON_8_BIT_CHARS to skip this check.
+#endif
+
+/**
  * Work around a platform dependency issue. apr_thread_rwlock_trywrlock()
  * will make APR_STATUS_IS_EBUSY() return TRUE if the lock could not be
  * acquired under Unix. Under Windows, this will not work. So, provide

Modified: subversion/branches/remove-log-addressing/subversion/include/svn_error_codes.h
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/include/svn_error_codes.h?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/include/svn_error_codes.h (original)
+++ subversion/branches/remove-log-addressing/subversion/include/svn_error_codes.h Mon Sep 29 16:45:21 2014
@@ -817,17 +817,17 @@ SVN_ERROR_START
              "Malformed transaction ID string.")
 
   /** @since New in 1.9. */
-  SVN_ERRDEF(SVN_ERR_FS_ITEM_INDEX_CORRUPTION,
+  SVN_ERRDEF(SVN_ERR_FS_INDEX_CORRUPTION,
              SVN_ERR_FS_CATEGORY_START + 54,
              "Corrupt index file.")
 
   /** @since New in 1.9. */
-  SVN_ERRDEF(SVN_ERR_FS_ITEM_INDEX_REVISION,
+  SVN_ERRDEF(SVN_ERR_FS_INDEX_REVISION,
              SVN_ERR_FS_CATEGORY_START + 55,
              "Revision not covered by index.")
 
   /** @since New in 1.9. */
-  SVN_ERRDEF(SVN_ERR_FS_ITEM_INDEX_OVERFLOW,
+  SVN_ERRDEF(SVN_ERR_FS_INDEX_OVERFLOW,
              SVN_ERR_FS_CATEGORY_START + 56,
              "Item index too large for this revision.")
 
@@ -837,7 +837,7 @@ SVN_ERROR_START
              "Container index out of range.")
 
   /** @since New in 1.9. */
-  SVN_ERRDEF(SVN_ERR_FS_ITEM_INDEX_INCONSISTENT,
+  SVN_ERRDEF(SVN_ERR_FS_INDEX_INCONSISTENT,
              SVN_ERR_FS_CATEGORY_START + 58,
              "Index files are inconsistent.")
 

Modified: subversion/branches/remove-log-addressing/subversion/include/svn_fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/include/svn_fs.h?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/include/svn_fs.h (original)
+++ subversion/branches/remove-log-addressing/subversion/include/svn_fs.h Mon Sep 29 16:45:21 2014
@@ -113,6 +113,9 @@ typedef struct svn_fs_t svn_fs_t;
 /** String with a decimal representation of the FSFS format shard size.
  * Zero ("0") means that a repository with linear layout should be created.
  *
+ * This option will only be used during the creation of new repositories
+ * and is otherwise ignored.
+ *
  * @since New in 1.9.
  */
 #define SVN_FS_CONFIG_FSFS_SHARD_SIZE           "fsfs-shard-size"

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_client/relocate.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_client/relocate.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_client/relocate.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_client/relocate.c Mon Sep 29 16:45:21 2014
@@ -127,85 +127,6 @@ validator_func(void *baton,
   return SVN_NO_ERROR;
 }
 
-
-/* Examing the array of svn_wc_external_item2_t's EXT_DESC (parsed
-   from the svn:externals property set on LOCAL_ABSPATH) and determine
-   if the external working copies described by such should be
-   relocated as a side-effect of the relocation of their parent
-   working copy (from OLD_PARENT_REPOS_ROOT_URL to
-   NEW_PARENT_REPOS_ROOT_URL).  If so, attempt said relocation.  */
-static svn_error_t *
-relocate_externals(const char *local_abspath,
-                   apr_array_header_t *ext_desc,
-                   const char *old_parent_repos_root_url,
-                   const char *new_parent_repos_root_url,
-                   svn_client_ctx_t *ctx,
-                   apr_pool_t *scratch_pool)
-{
-  apr_pool_t *iterpool;
-  int i;
-
-  /* Parse an externals definition into an array of external items. */
-
-  iterpool = svn_pool_create(scratch_pool);
-
-  for (i = 0; i < ext_desc->nelts; i++)
-    {
-      svn_wc_external_item2_t *ext_item =
-        APR_ARRAY_IDX(ext_desc, i, svn_wc_external_item2_t *);
-      const char *target_repos_root_url;
-      const char *target_abspath;
-      svn_error_t *err;
-
-      svn_pool_clear(iterpool);
-
-      /* If this external isn't pulled in via a relative URL, ignore
-         it.  There's no sense in relocating a working copy only to
-         have the next 'svn update' try to point it back to another
-         location. */
-      if (! ((strncmp("../", ext_item->url, 3) == 0) ||
-             (strncmp("^/", ext_item->url, 2) == 0)))
-        continue;
-
-      /* If the external working copy's not-yet-relocated repos root
-         URL matches the primary working copy's pre-relocated
-         repository root URL, try to relocate that external, too.
-         You might wonder why this check is needed, given that we're
-         already limiting ourselves to externals pulled via URLs
-         relative to their primary working copy.  Well, it's because
-         you can use "../" to "crawl up" above one repository's URL
-         space and down into another one.  */
-      SVN_ERR(svn_dirent_get_absolute(&target_abspath,
-                                      svn_dirent_join(local_abspath,
-                                                      ext_item->target_dir,
-                                                      iterpool),
-                                      iterpool));
-      err = svn_client_get_repos_root(&target_repos_root_url, NULL /* uuid */,
-                                      target_abspath, ctx, iterpool, iterpool);
-
-      /* Ignore externals that aren't present in the working copy.
-       * This can happen if an external is deleted from disk accidentally,
-       * or if an external is configured on a locally added directory. */
-      if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
-        {
-          svn_error_clear(err);
-          continue;
-        }
-      else
-        SVN_ERR(err);
-
-      if (strcmp(target_repos_root_url, old_parent_repos_root_url) == 0)
-        SVN_ERR(svn_client_relocate2(target_abspath,
-                                     old_parent_repos_root_url,
-                                     new_parent_repos_root_url,
-                                     FALSE, ctx, iterpool));
-    }
-
-  svn_pool_destroy(iterpool);
-
-  return SVN_NO_ERROR;
-}
-
 svn_error_t *
 svn_client_relocate2(const char *wcroot_dir,
                      const char *from_prefix,
@@ -256,10 +177,9 @@ svn_client_relocate2(const char *wcroot_
 
 
   /* Relocate externals, too (if any). */
-  SVN_ERR(svn_wc__externals_gather_definitions(&externals_hash, NULL,
-                                               ctx->wc_ctx, local_abspath,
-                                               svn_depth_infinity,
-                                               pool, pool));
+  SVN_ERR(svn_wc__externals_defined_below(&externals_hash,
+                                          ctx->wc_ctx, local_abspath,
+                                          pool, pool));
   if (! apr_hash_count(externals_hash))
     return SVN_NO_ERROR;
 
@@ -269,18 +189,39 @@ svn_client_relocate2(const char *wcroot_
        hi != NULL;
        hi = apr_hash_next(hi))
     {
+      svn_node_kind_t kind;
       const char *this_abspath = apr_hash_this_key(hi);
-      const char *value = apr_hash_this_val(hi);
-      apr_array_header_t *ext_desc;
 
       svn_pool_clear(iterpool);
 
-      SVN_ERR(svn_wc_parse_externals_description3(&ext_desc, this_abspath,
-                                                  value, FALSE,
-                                                  iterpool));
-      if (ext_desc->nelts)
-        SVN_ERR(relocate_externals(this_abspath, ext_desc, old_repos_root_url,
-                                   new_repos_root_url, ctx, iterpool));
+      SVN_ERR(svn_wc__read_external_info(&kind, NULL, NULL, NULL, NULL,
+                                         ctx->wc_ctx,
+                                         local_abspath, this_abspath,
+                                         FALSE, iterpool, iterpool));
+
+      if (kind == svn_node_dir)
+        {
+          const char *this_repos_root_url;
+          svn_error_t *err;
+
+          err = svn_client_get_repos_root(&this_repos_root_url, NULL /* uuid */,
+                                          this_abspath, ctx, iterpool, iterpool);
+
+          /* Ignore externals that aren't present in the working copy.
+           * This can happen if an external is deleted from disk accidentally,
+           * or if an external is configured on a locally added directory. */
+          if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+            {
+              svn_error_clear(err);
+              continue;
+            }
+          SVN_ERR(err);
+
+          if (strcmp(old_repos_root_url, this_repos_root_url) == 0)
+            SVN_ERR(svn_client_relocate2(this_abspath, from_prefix, to_prefix,
+                                         FALSE /* ignore_externals */,
+                                         ctx, iterpool));
+        }
     }
 
   svn_pool_destroy(iterpool);

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_base/fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_base/fs.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_base/fs.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_base/fs.c Mon Sep 29 16:45:21 2014
@@ -1084,7 +1084,7 @@ svn_fs_base__clean_logs(const char *live
 
   {  /* Process unused logs from live area */
     int idx;
-    apr_pool_t *sub_pool = svn_pool_create(pool);
+    apr_pool_t *subpool = svn_pool_create(pool);
 
     /* Process log files. */
     for (idx = 0; idx < logfiles->nelts; idx++)
@@ -1093,9 +1093,9 @@ svn_fs_base__clean_logs(const char *live
         const char *live_log_path;
         const char *backup_log_path;
 
-        svn_pool_clear(sub_pool);
-        live_log_path = svn_dirent_join(live_path, log_file, sub_pool);
-        backup_log_path = svn_dirent_join(backup_path, log_file, sub_pool);
+        svn_pool_clear(subpool);
+        live_log_path = svn_dirent_join(live_path, log_file, subpool);
+        backup_log_path = svn_dirent_join(backup_path, log_file, subpool);
 
         { /* Compare files. No point in using MD5 and wasting CPU cycles as we
              got full copies of both logs */
@@ -1112,17 +1112,17 @@ svn_fs_base__clean_logs(const char *live
             SVN_ERR(svn_io_files_contents_same_p(&files_match,
                                                  live_log_path,
                                                  backup_log_path,
-                                                 sub_pool));
+                                                 subpool));
 
           /* If log files do not match, go to the next log file. */
           if (!files_match)
             continue;
         }
 
-        SVN_ERR(svn_io_remove_file2(live_log_path, FALSE, sub_pool));
+        SVN_ERR(svn_io_remove_file2(live_log_path, FALSE, subpool));
       }
 
-    svn_pool_destroy(sub_pool);
+    svn_pool_destroy(subpool);
   }
 
   return SVN_NO_ERROR;

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/cached_data.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/cached_data.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/cached_data.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/cached_data.c Mon Sep 29 16:45:21 2014
@@ -63,7 +63,7 @@ dbg_log_access(svn_fs_t *fs,
                svn_revnum_t revision,
                apr_uint64_t item_index,
                void *item,
-               int item_type,
+               apr_uint32_t item_type,
                apr_pool_t *scratch_pool)
 {
   /* no-op if this macro is not defined */
@@ -869,7 +869,7 @@ svn_fs_fs__rep_chain_length(int *chain_l
   svn_revnum_t shard_size = ffd->max_files_per_dir
                           ? ffd->max_files_per_dir
                           : 1;
-  apr_pool_t *sub_pool = svn_pool_create(scratch_pool);
+  apr_pool_t *subpool = svn_pool_create(scratch_pool);
   apr_pool_t *iterpool = svn_pool_create(scratch_pool);
   svn_boolean_t is_delta = FALSE;
   int count = 0;
@@ -905,7 +905,7 @@ svn_fs_fs__rep_chain_length(int *chain_l
                                     &file_hint,
                                     &base_rep,
                                     fs,
-                                    sub_pool,
+                                    subpool,
                                     iterpool));
 
       base_rep.revision = header->base_revision;
@@ -914,18 +914,28 @@ svn_fs_fs__rep_chain_length(int *chain_l
       svn_fs_fs__id_txn_reset(&base_rep.txn_id);
       is_delta = header->type == svn_fs_fs__rep_delta;
 
+      /* Clear it the SUBPOOL once in a while.  Doing it too frequently
+       * renders the FILE_HINT ineffective.  Doing too infrequently, may
+       * leave us with too many open file handles.
+       *
+       * Note that this is mostly about efficiency, with larger values
+       * being more efficient, and any non-zero value is legal here.  When
+       * reading deltified contents, we may keep 10s of rev files open at
+       * the same time and the system has to cope with that.  Thus, the
+       * limit of 16 chosen below is in the same ballpark.
+       */
       ++count;
       if (count % 16 == 0)
         {
           file_hint = NULL;
-          svn_pool_clear(sub_pool);
+          svn_pool_clear(subpool);
         }
     }
   while (is_delta && base_rep.revision);
 
   *chain_length = count;
   *shard_count = shards;
-  svn_pool_destroy(sub_pool);
+  svn_pool_destroy(subpool);
   svn_pool_destroy(iterpool);
 
   return SVN_NO_ERROR;

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs.c Mon Sep 29 16:45:21 2014
@@ -495,7 +495,7 @@ fs_delete_fs(const char *path,
              apr_pool_t *pool)
 {
   /* Remove everything. */
-  return svn_io_remove_dir2(path, FALSE, NULL, NULL, pool);
+  return svn_error_trace(svn_io_remove_dir2(path, FALSE, NULL, NULL, pool));
 }
 
 static const svn_version_t *

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs_fs.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs_fs.c Mon Sep 29 16:45:21 2014
@@ -934,21 +934,31 @@ read_uuid(svn_fs_t *fs,
 }
 
 svn_error_t *
-svn_fs_fs__open(svn_fs_t *fs, const char *path, apr_pool_t *pool)
+svn_fs_fs__read_format_file(svn_fs_t *fs, apr_pool_t *scratch_pool)
 {
   fs_fs_data_t *ffd = fs->fsap_data;
   int format, max_files_per_dir;
 
-  fs->path = apr_pstrdup(fs->pool, path);
-
-  /* Read the FS format number. */
+  /* Read info from format file. */
   SVN_ERR(read_format(&format, &max_files_per_dir,
-                      path_format(fs, pool), pool));
+                      path_format(fs, scratch_pool), scratch_pool));
 
-  /* Now we've got a format number no matter what. */
+  /* Now that we've got *all* info, store / update values in FFD. */
   ffd->format = format;
   ffd->max_files_per_dir = max_files_per_dir;
 
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__open(svn_fs_t *fs, const char *path, apr_pool_t *pool)
+{
+  fs_fs_data_t *ffd = fs->fsap_data;
+  fs->path = apr_pstrdup(fs->pool, path);
+
+  /* Read the FS format file. */
+  SVN_ERR(svn_fs_fs__read_format_file(fs, pool));
+
   /* Read in and cache the repository uuid. */
   SVN_ERR(read_uuid(fs, pool));
 

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs_fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs_fs.h?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs_fs.h (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/fs_fs.h Mon Sep 29 16:45:21 2014
@@ -25,6 +25,11 @@
 
 #include "fs.h"
 
+/* Read the 'format' file of fsfs filesystem FS and store its info in FS.
+ * Use SCRATCH_POOL for temporary allocations. */
+svn_error_t *
+svn_fs_fs__read_format_file(svn_fs_t *fs, apr_pool_t *scratch_pool);
+
 /* Open the fsfs filesystem pointed to by PATH and associate it with
    filesystem object FS.  Use POOL for temporary allocations.
 

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/index.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/index.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/index.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/index.c Mon Sep 29 16:45:21 2014
@@ -47,7 +47,7 @@ svn_fs_fs__item_offset(apr_off_t *absolu
                        svn_revnum_t revision,
                        const svn_fs_fs__id_part_t *txn_id,
                        apr_uint64_t item_index,
-                       apr_pool_t *pool)
+                       apr_pool_t *scratch_pool)
 {
   svn_error_t *err = SVN_NO_ERROR;
   if (txn_id)
@@ -59,7 +59,8 @@ svn_fs_fs__item_offset(apr_off_t *absolu
     {
       /* pack file with physical addressing */
       apr_off_t rev_offset;
-      SVN_ERR(svn_fs_fs__get_packed_offset(&rev_offset, fs, revision, pool));
+      SVN_ERR(svn_fs_fs__get_packed_offset(&rev_offset, fs, revision,
+                                           scratch_pool));
       *absolute_position = rev_offset + item_index;
     }
   else

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/index.h
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/index.h?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/index.h (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/index.h Mon Sep 29 16:45:21 2014
@@ -57,7 +57,7 @@
  * If that is not available anymore (neither in cache nor on disk), re-open
  * the rev / pack file and retry to open the index file.  For anything but
  * committed log addressed revisions, REV_FILE may be NULL.
- * Use POOL for allocations.
+ * Use SCRATCH_POOL for temporary allocations.
  */
 svn_error_t *
 svn_fs_fs__item_offset(apr_off_t *absolute_position,
@@ -66,6 +66,6 @@ svn_fs_fs__item_offset(apr_off_t *absolu
                        svn_revnum_t revision,
                        const svn_fs_fs__id_part_t *txn_id,
                        apr_uint64_t item_index,
-                       apr_pool_t *pool);
+                       apr_pool_t *scratch_pool);
 
 #endif

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/structure-indexes
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/structure-indexes?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/structure-indexes (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/structure-indexes Mon Sep 29 16:45:21 2014
@@ -80,6 +80,14 @@ Most data is unsigned by nature but will
 signed integers.
 
 
+Encoding in proto-index files
+-----------------------------
+
+These have a much simpler encoding.  Throughout the files, all records have
+the same length (but different between L2P and P2L).  All records contain
+unsigned 64 bit integers only, stored in little endian byte order.
+
+
 Log-to-phys index
 =================
 
@@ -190,7 +198,7 @@ at the beginning of the file is optional
   ...
   <eof>         /* end of file. */
 
-All entries are pairs of 64 bit unsigned integers in machine endianess.
+All entries are pairs of 64 bit unsigned integers in little endian order.
 
 
 Phys-to-log index
@@ -293,7 +301,18 @@ Proto index file format
 -----------------------
 
 The index will be created from a proto index file containing simple
-instances of the in-memory representation of svn_fs_fs__p2l_entry_t.
+instances of svn_fs_fs__p2l_entry_t with the following element order:
+
+  item offset               as uint64
+  item size                 as uint64
+  item type                 as uint64
+  modified FNV1a checksum   as uint64
+  revision                  as uint64, with SVN_INVALID_REVNUM mapped to 0
+                                       and revisions >= 0 stored as rev+1
+  item index                as uint64
+
+All values are stored in little endian order.
+
 Page table and header information, except start revision and page size,
 can easily be derived from that information.
 

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/transaction.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/transaction.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_fs/transaction.c Mon Sep 29 16:45:21 2014
@@ -2267,7 +2267,7 @@ write_container_rep(representation_t *re
                     collection_writer_t writer,
                     svn_fs_t *fs,
                     apr_hash_t *reps_hash,
-                    int item_type,
+                    apr_uint32_t item_type,
                     svn_revnum_t final_revision,
                     apr_pool_t *scratch_pool)
 {
@@ -2345,7 +2345,7 @@ write_container_delta_rep(representation
                           svn_fs_t *fs,
                           node_revision_t *noderev,
                           apr_hash_t *reps_hash,
-                          int item_type,
+                          apr_uint32_t item_type,
                           svn_revnum_t final_revision,
                           apr_pool_t *scratch_pool)
 {
@@ -2642,8 +2642,8 @@ write_final_rev(const svn_fs_id_t **new_
           noderev->data_rep->revision = rev;
 
           /* See issue 3845.  Some unknown mechanism caused the
-              protorev file to get truncated, so check for that
-              here.  */
+             protorev file to get truncated, so check for that
+             here.  */
           if (noderev->data_rep->item_index + noderev->data_rep->size
               > initial_offset)
             return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
@@ -2657,7 +2657,7 @@ write_final_rev(const svn_fs_id_t **new_
   if (noderev->prop_rep && is_txn_rep(noderev->prop_rep))
     {
       apr_hash_t *proplist;
-      int item_type = noderev->kind == svn_node_dir
+      apr_uint32_t item_type = noderev->kind == svn_node_dir
                     ? SVN_FS_FS__ITEM_TYPE_DIR_PROPS
                     : SVN_FS_FS__ITEM_TYPE_FILE_PROPS;
       SVN_ERR(svn_fs_fs__get_proplist(&proplist, fs, noderev, pool));
@@ -3034,6 +3034,22 @@ commit_body(void *baton, apr_pool_t *poo
   apr_hash_t *changed_paths;
   svn_stringbuf_t *trailer;
 
+  /* Re-Read the current repository format.  All our repo upgrade and
+     config evaluation strategies are such that existing information in
+     FS and FFD remains valid.
+
+     Although we don't recommend upgrading hot repositories, people may
+     still do it and we must make sure to either handle them gracefully
+     or to error out.
+
+     Committing pre-format 3 txns will fail after upgrade to format 3+
+     because the proto-rev cannot be found; no further action needed.
+     Upgrades from pre-f7 to f7+ means a potential change in addressing
+     mode for the final rev.  We must be sure to detect that cause because
+     the failure would only manifest once the new revision got committed.
+   */
+  SVN_ERR(svn_fs_fs__read_format_file(cb->fs, pool));
+
   /* Read the current youngest revision and, possibly, the next available
      node id and copy id (for old format filesystems).  Update the cached
      value for the youngest revision, because we have just checked it. */

Propchange: subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/
------------------------------------------------------------------------------
  Merged /subversion/trunk/subversion/libsvn_fs_x:r1626220-1628178

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/cached_data.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/cached_data.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/cached_data.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/cached_data.c Mon Sep 29 16:45:21 2014
@@ -772,13 +772,18 @@ svn_fs_x__rep_chain_length(int *chain_le
   svn_revnum_t shard_size = ffd->max_files_per_dir
                           ? ffd->max_files_per_dir
                           : 1;
-  apr_pool_t *sub_pool = svn_pool_create(pool);
   svn_boolean_t is_delta = FALSE;
   int count = 0;
   int shards = 1;
   svn_revnum_t revision = svn_fs_x__get_revnum(rep->id.change_set);
   svn_revnum_t last_shard = revision / shard_size;
-  
+
+  /* Note that this iteration pool will be used in a non-standard way.
+   * To reuse open file handles between iterations (e.g. while within the
+   * same pack file), we only clear this pool once in a while instead of
+   * at the start of each iteration. */
+  apr_pool_t *iterpool = svn_pool_create(pool);
+
   /* Check whether the length of the deltification chain is acceptable.
    * Otherwise, shared reps may form a non-skipping delta chain in
    * extreme cases. */
@@ -806,7 +811,7 @@ svn_fs_x__rep_chain_length(int *chain_le
                                     &file_hint,
                                     &base_rep,
                                     fs,
-                                    sub_pool));
+                                    iterpool));
 
       base_rep.id.change_set
         = svn_fs_x__change_set_by_rev(header->base_revision);
@@ -814,18 +819,28 @@ svn_fs_x__rep_chain_length(int *chain_le
       base_rep.size = header->base_length;
       is_delta = header->type == svn_fs_x__rep_delta;
 
+      /* Clear it the ITERPOOL once in a while.  Doing it too frequently
+       * renders the FILE_HINT ineffective.  Doing too infrequently, may
+       * leave us with too many open file handles.
+       *
+       * Note that this is mostly about efficiency, with larger values
+       * being more efficient, and any non-zero value is legal here.  When
+       * reading deltified contents, we may keep 10s of rev files open at
+       * the same time and the system has to cope with that.  Thus, the
+       * limit of 16 chosen below is in the same ballpark.
+       */
       ++count;
       if (count % 16 == 0)
         {
           file_hint = NULL;
-          svn_pool_clear(sub_pool);
+          svn_pool_clear(iterpool);
         }
     }
   while (is_delta && base_rep.id.change_set);
 
   *chain_length = count;
   *shard_count = shards;
-  svn_pool_destroy(sub_pool);
+  svn_pool_destroy(iterpool);
 
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/index.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/index.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/index.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/index.c Mon Sep 29 16:45:21 2014
@@ -292,7 +292,7 @@ packed_stream_read(packed_number_stream_
           /* let's catch corrupted data early.  It would surely cause
            * havoc further down the line. */
           if SVN__PREDICT_FALSE(shift > 8 * sizeof(value))
-            return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_CORRUPTION, NULL,
+            return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
                                      _("Corrupt index: number too large"));
        }
     }
@@ -718,7 +718,7 @@ svn_fs_x__l2p_index_create(svn_fs_t *fs,
   /* Paranoia check that makes later casting to int32 safe.
    * The current implementation is limited to 2G entries per page. */
   if (ffd->l2p_page_size > APR_INT32_MAX)
-    return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_OVERFLOW , NULL,
+    return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
                             _("L2P index page size  %s" 
                               " exceeds current limit of 2G entries"),
                             apr_psprintf(local_pool, "%" APR_UINT64_T_FMT,
@@ -781,7 +781,7 @@ svn_fs_x__l2p_index_create(svn_fs_t *fs,
           l2p_page_entry_t page_entry = { 0 };
 
           if (proto_entry.item_index > APR_INT32_MAX)
-            return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_OVERFLOW , NULL,
+            return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
                                     _("Item index %s too large "
                                       "in l2p proto index for revision %ld"),
                                     apr_psprintf(local_pool,
@@ -808,7 +808,7 @@ svn_fs_x__l2p_index_create(svn_fs_t *fs,
   /* Paranoia check that makes later casting to int32 safe.
    * The current implementation is limited to 2G pages per index. */
   if (page_counts->nelts > APR_INT32_MAX)
-    return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_OVERFLOW , NULL,
+    return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
                             _("L2P index page count  %d"
                               " exceeds current limit of 2G pages"),
                             page_counts->nelts);
@@ -915,7 +915,7 @@ l2p_header_copy(l2p_page_info_baton_t *b
   /* revision offset within the index file */
   apr_size_t rel_revision = baton->revision - header->first_revision;
   if (rel_revision >= header->revision_count)
-    return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_REVISION , NULL,
+    return svn_error_createf(SVN_ERR_FS_INDEX_REVISION , NULL,
                              _("Revision %ld not covered by item index"),
                              baton->revision);
 
@@ -941,7 +941,7 @@ l2p_header_copy(l2p_page_info_baton_t *b
       max_item_index =   (apr_uint64_t)header->page_size
                        * (last_entry - first_entry);
       if (baton->item_index >= max_item_index)
-        return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_OVERFLOW , NULL,
+        return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
                                 _("Item index %s exceeds l2p limit "
                                   "of %s for revision %ld"),
                                 apr_psprintf(scratch_pool,
@@ -1070,7 +1070,7 @@ get_l2p_header_body(l2p_header_t **heade
 
   if (result->first_revision > revision
       || result->first_revision + result->revision_count <= revision)
-    return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_CORRUPTION, NULL,
+    return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION, NULL,
                       _("Corrupt L2P index for r%ld only covers r%ld:%ld"),
                       revision, result->first_revision,
                       result->first_revision + result->revision_count);
@@ -1292,7 +1292,7 @@ l2p_page_get_offset(l2p_page_baton_t *ba
 {
   /* overflow check */
   if (page->entry_count <= baton->page_offset)
-    return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_OVERFLOW , NULL,
+    return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
                              _("Item index %s too large in"
                                " revision %ld"),
                              apr_psprintf(pool, "%" APR_UINT64_T_FMT,
@@ -1843,7 +1843,7 @@ svn_fs_x__p2l_index_create(svn_fs_t *fs,
      = svn_spillbuf__create(0x10000, 0x1000000, local_pool);
 
   /* for loop temps ... */
-  apr_pool_t *iter_pool = svn_pool_create(pool);
+  apr_pool_t *iterpool = svn_pool_create(pool);
 
   /* start at the beginning of the source file */
   SVN_ERR(svn_io_file_open(&proto_index, proto_file_name,
@@ -1861,20 +1861,20 @@ svn_fs_x__p2l_index_create(svn_fs_t *fs,
       svn_revnum_t last_revision = revision;
       apr_uint64_t last_number = 0;
 
-      svn_pool_clear(iter_pool);
+      svn_pool_clear(iterpool);
 
       /* (attempt to) read the next entry from the source */
       SVN_ERR(svn_io_file_read_full2(proto_index, &entry, sizeof(entry),
-                                     &read, &eof, iter_pool));
+                                     &read, &eof, iterpool));
       SVN_ERR_ASSERT(eof || read == sizeof(entry));
 
       if (entry.item_count && !eof)
         {
           to_read = entry.item_count * sizeof(*entry.items);
-          entry.items = apr_palloc(iter_pool, to_read);
+          entry.items = apr_palloc(iterpool, to_read);
 
           SVN_ERR(svn_io_file_read_full2(proto_index, entry.items, to_read,
-                                         &read, &eof, iter_pool));
+                                         &read, &eof, iterpool));
           SVN_ERR_ASSERT(eof || read == to_read);
         }
 
@@ -1884,7 +1884,7 @@ svn_fs_x__p2l_index_create(svn_fs_t *fs,
           apr_size_t entry_size;
           to_read = sizeof(entry_size);
           SVN_ERR(svn_io_file_read_full2(proto_index, &entry_size, to_read,
-                                         &read, &eof, iter_pool));
+                                         &read, &eof, iterpool));
           SVN_ERR_ASSERT(eof || read == to_read);
         }
 
@@ -1925,20 +1925,20 @@ svn_fs_x__p2l_index_create(svn_fs_t *fs,
         {
           SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
                                       encode_uint(encoded, entry.offset),
-                                      iter_pool));
+                                      iterpool));
           last_revision = revision;
         }
 
       /* write simple item / container entry */
       SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
                                   encode_uint(encoded, entry.size),
-                                  iter_pool));
+                                  iterpool));
       SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
                                   encode_uint(encoded, entry.type + entry.item_count * 16),
-                                  iter_pool));
+                                  iterpool));
       SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
                                   encode_uint(encoded, entry.fnv1_checksum),
-                                  iter_pool));
+                                  iterpool));
 
       /* container contents (only one for non-container items) */
       for (sub_item = 0; sub_item < entry.item_count; ++sub_item)
@@ -1948,7 +1948,7 @@ svn_fs_x__p2l_index_create(svn_fs_t *fs,
           apr_int64_t diff = item_rev - last_revision;
           SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
                                       encode_int(encoded, diff),
-                                      iter_pool));
+                                      iterpool));
           last_revision = item_rev;
         }
 
@@ -1957,7 +1957,7 @@ svn_fs_x__p2l_index_create(svn_fs_t *fs,
           apr_int64_t diff = entry.items[sub_item].number - last_number;
           SVN_ERR(svn_spillbuf__write(buffer, (const char *)encoded,
                                       encode_int(encoded, diff),
-                                      iter_pool));
+                                      iterpool));
           last_number = entry.items[sub_item].number;
         }
 
@@ -2007,7 +2007,7 @@ svn_fs_x__p2l_index_create(svn_fs_t *fs,
   SVN_ERR(svn_io_file_close(index_file, local_pool));
   SVN_ERR(svn_io_set_file_read_only(file_name, FALSE, local_pool));
 
-  svn_pool_destroy(iter_pool);
+  svn_pool_destroy(iterpool);
   svn_pool_destroy(local_pool);
 
   return SVN_NO_ERROR;
@@ -2438,7 +2438,7 @@ get_p2l_keys(p2l_page_info_baton_t *page
   if (page_info.page_count <= page_info.page_no)
     {
       SVN_ERR(packed_stream_close(*stream));
-      return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_OVERFLOW , NULL,
+      return svn_error_createf(SVN_ERR_FS_INDEX_OVERFLOW , NULL,
                                _("Offset %s too large in revision %ld"),
                                apr_off_t_toa(pool, offset), revision);
     }

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/noderevs.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/noderevs.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/noderevs.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/noderevs.c Mon Sep 29 16:45:21 2014
@@ -60,8 +60,6 @@ typedef struct binary_id_t
 } binary_id_t;
 
 /* Our internal representation of an representation.
- * We simply omit the uniquifier, which allows us to share instances of
- * binary_representation_t and uniquify them in a shared_representation_t.
  */
 typedef struct binary_representation_t
 {

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/transaction.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/transaction.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/transaction.c Mon Sep 29 16:45:21 2014
@@ -649,7 +649,7 @@ auto_truncate_proto_rev(svn_fs_t *fs,
   if (indexed_length < actual_length)
     SVN_ERR(svn_io_file_trunc(proto_rev, indexed_length, pool));
   else if (indexed_length > actual_length)
-    return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_INCONSISTENT,
+    return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
                              NULL,
                              _("p2l proto index offset %s beyond proto"
                                "rev file size %s for TXN %s"),

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/verify.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/verify.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/verify.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_fs_x/verify.c Mon Sep 29 16:45:21 2014
@@ -181,7 +181,7 @@ compare_l2p_to_p2l_index(svn_fs_t *fs,
                                             offset, sub_item, iterpool));
 
           if (p2l_item == NULL)
-            return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_INCONSISTENT,
+            return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
                                      NULL,
                                      _("p2l index entry not found for "
                                        "PHYS o%s:s%ld returned by "
@@ -190,7 +190,7 @@ compare_l2p_to_p2l_index(svn_fs_t *fs,
                                      (long)sub_item, revision, (long)k);
 
           if (!svn_fs_x__id_part_eq(&l2p_item, p2l_item))
-            return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_INCONSISTENT,
+            return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
                                      NULL,
                                      _("p2l index info LOG r%ld:i%ld"
                                        " does not match "
@@ -247,7 +247,7 @@ compare_p2l_to_l2p_index(svn_fs_t *fs,
       SVN_ERR(svn_fs_x__p2l_index_lookup(&entries, fs, start, offset,
                                          ffd->p2l_page_size, iterpool));
       if (entries->nelts == 0)
-        return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_CORRUPTION,
+        return svn_error_createf(SVN_ERR_FS_INDEX_CORRUPTION,
                                  NULL,
                                  _("p2l does not cover offset %s"
                                    " for revision %ld"),
@@ -277,7 +277,7 @@ compare_p2l_to_l2p_index(svn_fs_t *fs,
                                             p2l_item, iterpool));
 
               if (sub_item != k || l2p_offset != entry->offset)
-                return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_INCONSISTENT,
+                return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
                                          NULL,
                                          _("l2p index entry PHYS o%s:s%ld "
                                            "does not match p2l index value "
@@ -478,7 +478,7 @@ compare_p2l_to_rev(svn_fs_t *fs,
   SVN_ERR(svn_fs_x__p2l_get_max_offset(&max_offset, fs, start, pool));
 
   if (offset != max_offset)
-    return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_INCONSISTENT, NULL,
+    return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT, NULL,
                              _("File size of %s for revision r%ld does "
                                "not match p2l index size of %s"),
                              apr_off_t_toa(pool, offset), start,
@@ -515,7 +515,7 @@ compare_p2l_to_rev(svn_fs_t *fs,
 
           /* p2l index must cover all rev / pack file offsets exactly once */
           if (entry->offset != offset)
-            return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_INCONSISTENT,
+            return svn_error_createf(SVN_ERR_FS_INDEX_INCONSISTENT,
                                      NULL,
                                      _("p2l index entry for revision r%ld"
                                        " is non-contiguous between offsets "

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/blame.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/blame.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/blame.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/blame.c Mon Sep 29 16:45:21 2014
@@ -302,9 +302,8 @@ create_file_revs_body(serf_bucket_t **bo
 
   if (blame_ctx->include_merged_revisions)
     {
-      svn_ra_serf__add_tag_buckets(buckets,
-                                   "S:include-merged-revisions", NULL,
-                                   alloc);
+      svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+                                         "S:include-merged-revisions", SVN_VA_NULL);
     }
 
   svn_ra_serf__add_tag_buckets(buckets,

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/commit.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/commit.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/commit.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/commit.c Mon Sep 29 16:45:21 2014
@@ -226,7 +226,8 @@ create_checkout_body(serf_bucket_t **bkt
 
   svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:href");
   svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:activity-set");
-  svn_ra_serf__add_tag_buckets(body_bkt, "D:apply-to-version", NULL, alloc);
+  svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+                                     "D:apply-to-version", SVN_VA_NULL);
   svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:checkout");
 
   *bkt = body_bkt;

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/get_lock.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/get_lock.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/get_lock.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/get_lock.c Mon Sep 29 16:45:21 2014
@@ -243,7 +243,8 @@ create_getlock_body(serf_bucket_t **body
                                     "xmlns", "DAV:",
                                     SVN_VA_NULL);
   svn_ra_serf__add_open_tag_buckets(buckets, alloc, "prop", SVN_VA_NULL);
-  svn_ra_serf__add_tag_buckets(buckets, "lockdiscovery", NULL, alloc);
+  svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+                                     "lockdiscovery", SVN_VA_NULL);
   svn_ra_serf__add_close_tag_buckets(buckets, alloc, "prop");
   svn_ra_serf__add_close_tag_buckets(buckets, alloc, "propfind");
 

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/lock.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/lock.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/lock.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/lock.c Mon Sep 29 16:45:21 2014
@@ -412,11 +412,11 @@ create_lock_body(serf_bucket_t **body_bk
                                     SVN_VA_NULL);
 
   svn_ra_serf__add_open_tag_buckets(buckets, alloc, "lockscope", SVN_VA_NULL);
-  svn_ra_serf__add_tag_buckets(buckets, "exclusive", NULL, alloc);
+  svn_ra_serf__add_empty_tag_buckets(buckets, alloc, "exclusive", SVN_VA_NULL);
   svn_ra_serf__add_close_tag_buckets(buckets, alloc, "lockscope");
 
   svn_ra_serf__add_open_tag_buckets(buckets, alloc, "locktype", SVN_VA_NULL);
-  svn_ra_serf__add_tag_buckets(buckets, "write", NULL, alloc);
+  svn_ra_serf__add_empty_tag_buckets(buckets, alloc, "write", SVN_VA_NULL);
   svn_ra_serf__add_close_tag_buckets(buckets, alloc, "locktype");
 
   if (ctx->lock->comment)

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/log.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/log.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/log.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/log.c Mon Sep 29 16:45:21 2014
@@ -442,23 +442,22 @@ create_log_body(serf_bucket_t **body_bkt
 
   if (log_ctx->changed_paths)
     {
-      svn_ra_serf__add_tag_buckets(buckets,
-                                   "S:discover-changed-paths", NULL,
-                                   alloc);
+      svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+                                         "S:discover-changed-paths",
+                                         SVN_VA_NULL);
     }
 
   if (log_ctx->strict_node_history)
     {
-      svn_ra_serf__add_tag_buckets(buckets,
-                                   "S:strict-node-history", NULL,
-                                   alloc);
+      svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+                                         "S:strict-node-history", SVN_VA_NULL);
     }
 
   if (log_ctx->include_merged_revisions)
     {
-      svn_ra_serf__add_tag_buckets(buckets,
-                                   "S:include-merged-revisions", NULL,
-                                   alloc);
+      svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+                                         "S:include-merged-revisions",
+                                         SVN_VA_NULL);
     }
 
   if (log_ctx->revprops)
@@ -473,16 +472,14 @@ create_log_body(serf_bucket_t **body_bkt
         }
       if (log_ctx->revprops->nelts == 0)
         {
-          svn_ra_serf__add_tag_buckets(buckets,
-                                       "S:no-revprops", NULL,
-                                       alloc);
+          svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+                                             "S:no-revprops", SVN_VA_NULL);
         }
     }
   else
     {
-      svn_ra_serf__add_tag_buckets(buckets,
-                                   "S:all-revprops", NULL,
-                                   alloc);
+      svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+                                         "S:all-revprops", SVN_VA_NULL);
     }
 
   if (log_ctx->paths)
@@ -497,9 +494,8 @@ create_log_body(serf_bucket_t **body_bkt
         }
     }
 
-  svn_ra_serf__add_tag_buckets(buckets,
-                               "S:encode-binary-props", NULL,
-                               alloc);
+  svn_ra_serf__add_empty_tag_buckets(buckets, alloc,
+                                     "S:encode-binary-props", SVN_VA_NULL);
 
   svn_ra_serf__add_close_tag_buckets(buckets, alloc,
                                      "S:log-report");

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/merge.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/merge.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/merge.c Mon Sep 29 16:45:21 2014
@@ -358,15 +358,22 @@ create_merge_body(serf_bucket_t **bkt,
   svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:href");
   svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:source");
 
-  svn_ra_serf__add_tag_buckets(body_bkt, "D:no-auto-merge", NULL, alloc);
-  svn_ra_serf__add_tag_buckets(body_bkt, "D:no-checkout", NULL, alloc);
+  svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+                                     "D:no-auto-merge", SVN_VA_NULL);
+  svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+                                     "D:no-checkout", SVN_VA_NULL);
 
   svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, "D:prop", SVN_VA_NULL);
-  svn_ra_serf__add_tag_buckets(body_bkt, "D:checked-in", NULL, alloc);
-  svn_ra_serf__add_tag_buckets(body_bkt, "D:" SVN_DAV__VERSION_NAME, NULL, alloc);
-  svn_ra_serf__add_tag_buckets(body_bkt, "D:resourcetype", NULL, alloc);
-  svn_ra_serf__add_tag_buckets(body_bkt, "D:" SVN_DAV__CREATIONDATE, NULL, alloc);
-  svn_ra_serf__add_tag_buckets(body_bkt, "D:creator-displayname", NULL, alloc);
+  svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+                                     "D:checked-in", SVN_VA_NULL);
+  svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+                                     "D:" SVN_DAV__VERSION_NAME, SVN_VA_NULL);
+  svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+                                     "D:resourcetype", SVN_VA_NULL);
+  svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+                                     "D:" SVN_DAV__CREATIONDATE, SVN_VA_NULL);
+  svn_ra_serf__add_empty_tag_buckets(body_bkt, alloc,
+                                     "D:creator-displayname", SVN_VA_NULL);
   svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:prop");
 
   merge_lock_token_list(ctx->lock_tokens, NULL, body_bkt, alloc, pool);

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/ra_serf.h
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/ra_serf.h?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/ra_serf.h (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/ra_serf.h Mon Sep 29 16:45:21 2014
@@ -892,6 +892,16 @@ svn_ra_serf__add_close_tag_buckets(serf_
                                    serf_bucket_alloc_t *bkt_alloc,
                                    const char *tag);
 
+/* Add the appropriate serf buckets to AGG_BUCKET representing the XML
+ * open tag with name TAG, and then immediately closes the tag using the />
+ * notation
+ */
+void
+svn_ra_serf__add_empty_tag_buckets(serf_bucket_t *agg_bucket,
+                                   serf_bucket_alloc_t *bkt_alloc,
+                                   const char *tag,
+                                   ...) SVN_NEEDS_SENTINEL_NULL;
+
 /*
  * Add the appropriate serf buckets to AGG_BUCKET with xml-escaped
  * version of DATA.

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/xml.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/xml.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/xml.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_ra_serf/xml.c Mon Sep 29 16:45:21 2014
@@ -324,6 +324,49 @@ svn_ra_serf__add_open_tag_buckets(serf_b
 }
 
 void
+svn_ra_serf__add_empty_tag_buckets(serf_bucket_t *agg_bucket,
+                                   serf_bucket_alloc_t *bkt_alloc,
+                                   const char *tag, ...)
+{
+  va_list ap;
+  const char *key;
+  serf_bucket_t *tmp;
+
+  tmp = SERF_BUCKET_SIMPLE_STRING_LEN("<", 1, bkt_alloc);
+  serf_bucket_aggregate_append(agg_bucket, tmp);
+
+  tmp = SERF_BUCKET_SIMPLE_STRING(tag, bkt_alloc);
+  serf_bucket_aggregate_append(agg_bucket, tmp);
+
+  va_start(ap, tag);
+  while ((key = va_arg(ap, char *)) != NULL)
+    {
+      const char *val = va_arg(ap, const char *);
+      if (val)
+        {
+          tmp = SERF_BUCKET_SIMPLE_STRING_LEN(" ", 1, bkt_alloc);
+          serf_bucket_aggregate_append(agg_bucket, tmp);
+
+          tmp = SERF_BUCKET_SIMPLE_STRING(key, bkt_alloc);
+          serf_bucket_aggregate_append(agg_bucket, tmp);
+
+          tmp = SERF_BUCKET_SIMPLE_STRING_LEN("=\"", 2, bkt_alloc);
+          serf_bucket_aggregate_append(agg_bucket, tmp);
+
+          tmp = SERF_BUCKET_SIMPLE_STRING(val, bkt_alloc);
+          serf_bucket_aggregate_append(agg_bucket, tmp);
+
+          tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\"", 1, bkt_alloc);
+          serf_bucket_aggregate_append(agg_bucket, tmp);
+        }
+    }
+  va_end(ap);
+
+  tmp = SERF_BUCKET_SIMPLE_STRING_LEN("/>", 2, bkt_alloc);
+  serf_bucket_aggregate_append(agg_bucket, tmp);
+}
+
+void
 svn_ra_serf__add_close_tag_buckets(serf_bucket_t *agg_bucket,
                                    serf_bucket_alloc_t *bkt_alloc,
                                    const char *tag)

Modified: subversion/branches/remove-log-addressing/subversion/libsvn_repos/repos.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/libsvn_repos/repos.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/libsvn_repos/repos.c (original)
+++ subversion/branches/remove-log-addressing/subversion/libsvn_repos/repos.c Mon Sep 29 16:45:21 2014
@@ -1690,7 +1690,7 @@ svn_repos_delete(const char *path,
   SVN_ERR(svn_fs_delete_fs(db_path, pool));
 
   /* ...then blow away everything else.  */
-  return svn_io_remove_dir2(path, FALSE, NULL, NULL, pool);
+  return svn_error_trace(svn_io_remove_dir2(path, FALSE, NULL, NULL, pool));
 }
 
 

Modified: subversion/branches/remove-log-addressing/subversion/svnfsfs/stats-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/svnfsfs/stats-cmd.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/svnfsfs/stats-cmd.c (original)
+++ subversion/branches/remove-log-addressing/subversion/svnfsfs/stats-cmd.c Mon Sep 29 16:45:21 2014
@@ -1383,7 +1383,7 @@ read_revisions(fs_t **fs,
                                             FALSE, pool, pool));
 
   /* read all packed revs */
- for ( revision = 0
+  for ( revision = 0
       ; revision < (*fs)->min_unpacked_rev
       ; revision += (*fs)->shard_size)
     {

Modified: subversion/branches/remove-log-addressing/subversion/tests/libsvn_fs/fs-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/remove-log-addressing/subversion/tests/libsvn_fs/fs-test.c?rev=1628216&r1=1628215&r2=1628216&view=diff
==============================================================================
--- subversion/branches/remove-log-addressing/subversion/tests/libsvn_fs/fs-test.c (original)
+++ subversion/branches/remove-log-addressing/subversion/tests/libsvn_fs/fs-test.c Mon Sep 29 16:45:21 2014
@@ -5403,6 +5403,56 @@ reopen_modify(const svn_test_opts_t *opt
 #endif
 }
 
+static svn_error_t *
+upgrade_while_committing(const svn_test_opts_t *opts,
+                         apr_pool_t *pool)
+{
+  svn_fs_t *fs;
+  svn_revnum_t head_rev = 0;
+  svn_fs_root_t *root;
+  svn_fs_txn_t *txn;
+  const char *fs_path;
+  apr_hash_t *fs_config = apr_hash_make(pool);
+
+  /* Bail (with success) on known-untestable scenarios */
+  if (strcmp(opts->fs_type, "fsfs") != 0)
+    return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+                            "this will test FSFS repositories only");
+
+  if (opts->server_minor_version && (opts->server_minor_version < 6))
+    return svn_error_create(SVN_ERR_TEST_SKIPPED, NULL,
+                            "pre-1.6 SVN doesn't support FSFS packing");
+
+  /* Create test repository with greek tree. */
+  fs_path = "test-upgrade-while-committing";
+
+  svn_hash_sets(fs_config, SVN_FS_CONFIG_COMPATIBLE_VERSION, "1.7");
+  svn_hash_sets(fs_config, SVN_FS_CONFIG_FSFS_SHARD_SIZE, "2");
+  SVN_ERR(svn_test__create_fs2(&fs, fs_path, opts, fs_config, pool));
+
+  SVN_ERR(svn_fs_open(&fs, fs_path, NULL, pool));
+  SVN_ERR(svn_fs_begin_txn(&txn, fs, head_rev, pool));
+  SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+  SVN_ERR(svn_test__create_greek_tree(root, pool));
+  SVN_ERR(test_commit_txn(&head_rev, txn, NULL, pool));
+
+  /* Upgrade filesystem, but keep existing svn_fs_t object. */
+  SVN_ERR(svn_fs_upgrade(fs_path, pool));
+
+  /* Create txn with changes. */
+  SVN_ERR(svn_fs_begin_txn(&txn, fs, head_rev, pool));
+  SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+  SVN_ERR(svn_fs_make_dir(root, "/foo", pool));
+
+  /* Commit txn. */
+  SVN_ERR(test_commit_txn(&head_rev, txn, NULL, pool));
+
+  /* Verify filesystem content. */
+  SVN_ERR(svn_fs_verify(fs_path, NULL, 0, SVN_INVALID_REVNUM, NULL, NULL,
+                        NULL, NULL, pool));
+
+  return SVN_NO_ERROR;
+}
 
 /* ------------------------------------------------------------------------ */
 
@@ -5501,6 +5551,8 @@ static struct svn_test_descriptor_t test
     SVN_TEST_OPTS_WIMP(reopen_modify,
                        "test reopen and modify txn",
                        "txn_dir_cache fail in FSFS"),
+    SVN_TEST_OPTS_PASS(upgrade_while_committing,
+                       "upgrade while committing"),
     SVN_TEST_NULL
   };
 



Mime
View raw message