You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2014/12/27 17:53:08 UTC

svn commit: r1648068 - in /subversion/branches/fsx-id/subversion/libsvn_fs_x: changes.c fs.h low_level.c temp_serializer.c transaction.c transaction.h tree.c

Author: stefan2
Date: Sat Dec 27 16:53:08 2014
New Revision: 1648068

URL: http://svn.apache.org/r1648068
Log:
On the fsx-id branch:  Instead wrapping svn_fs_path_change2_t in FSX'
change_t, expand its elements into change_t.  That way, we can replace
the svn_fs_id_t instance in it later.

Most of the code churn is due to the fact that there is one structure
level less now.

* subversion/libsvn_fs_x/fs.h
  (change_t): Expand the INFO sub-struct into this one.

* subversion/libsvn_fs_x/temp_serializer.c
  (serialize_change,
   deserialize_change): Remove INFO intermediary.

* subversion/libsvn_fs_x/changes.c
  (append_change,
   svn_fs_x__changes_get_list,
   svn_fs_x__changes_get_list_func): Use the CHANGE directly instead of
                                     the former INFO sub-structure.

* subversion/libsvn_fs_x/low_level.c
  (read_change,
   write_change_entry): Ditto.
  (svn_fs_x__write_changes): The hash now contains full change_t.

* subversion/libsvn_fs_x/transaction.h
  (svn_fs_x__paths_changed): Remove. The functionality has been moved
                             to tree.c

* subversion/libsvn_fs_x/transaction.c
  (path_change_dup): Duplicate a full change_t now.
  (fold_change): The hashes now contain full change_t, including the name.
                 There's no intermediate INFO struct level anymore. 
  (process_changes): There's no intermediate INFO struct level anymore.
  (svn_fs_x__paths_changed): Remove here. See x_paths_changed in tree.c
  (svn_fs_x__add_change,
   verify_locks): The hashes now contain full change_t.

* subversion/libsvn_fs_x/tree.c
  (construct_fs_path_change): New utility function converting our internal
                              change_t into the FS API level equivalent.
  (x_paths_changed): Convert changed paths lists from using change_t to
                     svn_fs_path_change2_t and the internal hash or array
                     to a hash as required by the API.

Modified:
    subversion/branches/fsx-id/subversion/libsvn_fs_x/changes.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h
    subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h
    subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/changes.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/changes.c?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/changes.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/changes.c Sat Dec 27 16:53:08 2014
@@ -139,20 +139,30 @@ append_change(svn_fs_x__changes_t *chang
 {
   binary_change_t binary_change = { 0 };
   svn_boolean_t is_txn_id;
-  svn_fs_path_change2_t *info;
 
   /* CHANGE must be sufficiently complete */
   SVN_ERR_ASSERT(change);
   SVN_ERR_ASSERT(change->path.data);
 
+  /* Relevant parts of the revision ID of the change. */
+  if (change->node_rev_id)
+    {
+      binary_change.node_id = *svn_fs_x__id_node_id(change->node_rev_id);
+      binary_change.noderev_id = *svn_fs_x__id_noderev_id(change->node_rev_id);
+    }
+  else
+    {
+      binary_change.noderev_id.number = 0;
+      binary_change.noderev_id.change_set = SVN_FS_X__INVALID_CHANGE_SET;
+    }
+
   /* define the kind of change and what specific information is present */
-  info = &change->info;
-  is_txn_id = info->node_rev_id && svn_fs_x__id_is_txn(info->node_rev_id);
-  binary_change.flags = (info->text_mod ? CHANGE_TEXT_MOD : 0)
-                      | (info->prop_mod ? CHANGE_PROP_MOD : 0)
+  is_txn_id = change->node_rev_id && svn_fs_x__id_is_txn(change->node_rev_id);
+  binary_change.flags = (change->text_mod ? CHANGE_TEXT_MOD : 0)
+                      | (change->prop_mod ? CHANGE_PROP_MOD : 0)
                       | (is_txn_id ? CHANGE_TXN_NODE : 0)
-                      | ((int)info->change_kind << CHANGE_KIND_SHIFT)
-                      | ((int)info->node_kind << CHANGE_NODE_SHIFT);
+                      | ((int)change->change_kind << CHANGE_KIND_SHIFT)
+                      | ((int)change->node_kind << CHANGE_NODE_SHIFT);
 
   /* Path of the change. */
   binary_change.path
@@ -161,12 +171,12 @@ append_change(svn_fs_x__changes_t *chang
                                          change->path.len);
 
   /* copy-from information, if presence is indicated by FLAGS */
-  if (SVN_IS_VALID_REVNUM(info->copyfrom_rev))
+  if (SVN_IS_VALID_REVNUM(change->copyfrom_rev))
     {
-      binary_change.copyfrom_rev = info->copyfrom_rev;
+      binary_change.copyfrom_rev = change->copyfrom_rev;
       binary_change.copyfrom_path
         = svn_fs_x__string_table_builder_add(changes->builder,
-                                             info->copyfrom_path,
+                                             change->copyfrom_path,
                                              0);
     }
   else
@@ -175,18 +185,6 @@ append_change(svn_fs_x__changes_t *chang
       binary_change.copyfrom_path = 0;
     }
 
-  /* Relevant parts of the revision ID of the change. */
-  if (info->node_rev_id)
-    {
-      binary_change.node_id = *svn_fs_x__id_node_id(info->node_rev_id);
-      binary_change.noderev_id = *svn_fs_x__id_noderev_id(info->node_rev_id);
-    }
-  else
-    {
-      binary_change.noderev_id.number = 0;
-      binary_change.noderev_id.change_set = SVN_FS_X__INVALID_CHANGE_SET;
-    }
-
   APR_ARRAY_PUSH(changes->changes, binary_change_t) = binary_change;
 
   return SVN_NO_ERROR;
@@ -265,28 +263,27 @@ svn_fs_x__changes_get_list(apr_array_hea
 
       /* convert BINARY_CHANGE into a standard FSX change_t */
       change_t *change = apr_pcalloc(pool, sizeof(*change));
-      svn_fs_path_change2_t *info = &change->info;
       change->path.data = svn_fs_x__string_table_get(changes->paths,
                                                      binary_change->path,
                                                      &change->path.len,
                                                      pool);
 
       if (binary_change->noderev_id.change_set != SVN_FS_X__INVALID_CHANGE_SET)
-        info->node_rev_id = svn_fs_x__id_create(&binary_change->node_id,
-                                                &binary_change->noderev_id,
-                                                pool);
+        change->node_rev_id = svn_fs_x__id_create(&binary_change->node_id,
+                                                  &binary_change->noderev_id,
+                                                  pool);
 
-      info->change_kind = (svn_fs_path_change_kind_t)
+      change->change_kind = (svn_fs_path_change_kind_t)
         ((binary_change->flags & CHANGE_KIND_MASK) >> CHANGE_KIND_SHIFT);
-      info->text_mod = (binary_change->flags & CHANGE_TEXT_MOD) != 0;
-      info->prop_mod = (binary_change->flags & CHANGE_PROP_MOD) != 0;
-      info->node_kind = (svn_node_kind_t)
+      change->text_mod = (binary_change->flags & CHANGE_TEXT_MOD) != 0;
+      change->prop_mod = (binary_change->flags & CHANGE_PROP_MOD) != 0;
+      change->node_kind = (svn_node_kind_t)
         ((binary_change->flags & CHANGE_NODE_MASK) >> CHANGE_NODE_SHIFT);
 
-      info->copyfrom_rev = binary_change->copyfrom_rev;
-      info->copyfrom_known = TRUE;
+      change->copyfrom_rev = binary_change->copyfrom_rev;
+      change->copyfrom_known = TRUE;
       if (SVN_IS_VALID_REVNUM(binary_change->copyfrom_rev))
-        info->copyfrom_path 
+        change->copyfrom_path 
           = svn_fs_x__string_table_get(changes->paths,
                                         binary_change->copyfrom_path,
                                         NULL,
@@ -524,27 +521,26 @@ svn_fs_x__changes_get_list_func(void **o
 
       /* convert BINARY_CHANGE into a standard FSX change_t */
       change_t *change = apr_pcalloc(pool, sizeof(*change));
-      svn_fs_path_change2_t *info = &change->info;
       change->path.data
         = svn_fs_x__string_table_get_func(paths, binary_change->path,
                                           &change->path.len, pool);
 
       if (binary_change->noderev_id.change_set != SVN_FS_X__INVALID_CHANGE_SET)
-        info->node_rev_id = svn_fs_x__id_create(&binary_change->node_id,
-                                                &binary_change->noderev_id,
-                                                pool);
+        change->node_rev_id = svn_fs_x__id_create(&binary_change->node_id,
+                                                  &binary_change->noderev_id,
+                                                  pool);
 
-      info->change_kind = (svn_fs_path_change_kind_t)
+      change->change_kind = (svn_fs_path_change_kind_t)
         ((binary_change->flags & CHANGE_KIND_MASK) >> CHANGE_KIND_SHIFT);
-      info->text_mod = (binary_change->flags & CHANGE_TEXT_MOD) != 0;
-      info->prop_mod = (binary_change->flags & CHANGE_PROP_MOD) != 0;
-      info->node_kind = (svn_node_kind_t)
+      change->text_mod = (binary_change->flags & CHANGE_TEXT_MOD) != 0;
+      change->prop_mod = (binary_change->flags & CHANGE_PROP_MOD) != 0;
+      change->node_kind = (svn_node_kind_t)
         ((binary_change->flags & CHANGE_NODE_MASK) >> CHANGE_NODE_SHIFT);
 
-      info->copyfrom_rev = binary_change->copyfrom_rev;
-      info->copyfrom_known = TRUE;
+      change->copyfrom_rev = binary_change->copyfrom_rev;
+      change->copyfrom_known = TRUE;
       if (SVN_IS_VALID_REVNUM(binary_change->copyfrom_rev))
-        info->copyfrom_path 
+        change->copyfrom_path 
           = svn_fs_x__string_table_get_func(paths,
                                             binary_change->copyfrom_path,
                                             NULL,

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h Sat Dec 27 16:53:08 2014
@@ -549,8 +549,22 @@ typedef struct change_t
   /* Path of the change. */
   svn_string_t path;
 
-  /* API compatible change description */
-  svn_fs_path_change2_t info;
+  /* node revision id of changed path */
+  const svn_fs_id_t *node_rev_id;
+
+  /* See svn_fs_path_change2_t for a description for the remaining elements.
+   */
+  svn_fs_path_change_kind_t change_kind;
+
+  svn_boolean_t text_mod;
+  svn_boolean_t prop_mod;
+  svn_node_kind_t node_kind;
+
+  svn_boolean_t copyfrom_known;
+  svn_revnum_t copyfrom_rev;
+  const char *copyfrom_path;
+
+  svn_tristate_t mergeinfo_mod;
 } change_t;
 
 

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c Sat Dec 27 16:53:08 2014
@@ -786,7 +786,6 @@ read_change(change_t **change_p,
   svn_boolean_t eof = TRUE;
   change_t *change;
   char *str, *last_str, *kind_str;
-  svn_fs_path_change2_t *info;
 
   /* Default return value. */
   *change_p = NULL;
@@ -798,7 +797,6 @@ read_change(change_t **change_p,
     return SVN_NO_ERROR;
 
   change = apr_pcalloc(result_pool, sizeof(*change));
-  info = &change->info;
   last_str = line->data;
 
   /* Get the node-id of the change. */
@@ -807,8 +805,8 @@ read_change(change_t **change_p,
     return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                             _("Invalid changes line in rev-file"));
 
-  SVN_ERR(svn_fs_x__id_parse(&info->node_rev_id, str, result_pool));
-  if (info->node_rev_id == NULL)
+  SVN_ERR(svn_fs_x__id_parse(&change->node_rev_id, str, result_pool));
+  if (change->node_rev_id == NULL)
     return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                             _("Invalid changes line in rev-file"));
 
@@ -820,7 +818,7 @@ read_change(change_t **change_p,
 
   /* Don't bother to check the format number before looking for
    * node-kinds: just read them if you find them. */
-  info->node_kind = svn_node_unknown;
+  change->node_kind = svn_node_unknown;
   kind_str = strchr(str, '-');
   if (kind_str)
     {
@@ -828,9 +826,9 @@ read_change(change_t **change_p,
       *kind_str = '\0';
       kind_str++;
       if (strcmp(kind_str, SVN_FS_X__KIND_FILE) == 0)
-        info->node_kind = svn_node_file;
+        change->node_kind = svn_node_file;
       else if (strcmp(kind_str, SVN_FS_X__KIND_DIR) == 0)
-        info->node_kind = svn_node_dir;
+        change->node_kind = svn_node_dir;
       else
         return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                                 _("Invalid changes line in rev-file"));
@@ -838,23 +836,23 @@ read_change(change_t **change_p,
 
   if (strcmp(str, ACTION_MODIFY) == 0)
     {
-      info->change_kind = svn_fs_path_change_modify;
+      change->change_kind = svn_fs_path_change_modify;
     }
   else if (strcmp(str, ACTION_ADD) == 0)
     {
-      info->change_kind = svn_fs_path_change_add;
+      change->change_kind = svn_fs_path_change_add;
     }
   else if (strcmp(str, ACTION_DELETE) == 0)
     {
-      info->change_kind = svn_fs_path_change_delete;
+      change->change_kind = svn_fs_path_change_delete;
     }
   else if (strcmp(str, ACTION_REPLACE) == 0)
     {
-      info->change_kind = svn_fs_path_change_replace;
+      change->change_kind = svn_fs_path_change_replace;
     }
   else if (strcmp(str, ACTION_RESET) == 0)
     {
-      info->change_kind = svn_fs_path_change_reset;
+      change->change_kind = svn_fs_path_change_reset;
     }
   else
     {
@@ -870,11 +868,11 @@ read_change(change_t **change_p,
 
   if (strcmp(str, FLAG_TRUE) == 0)
     {
-      info->text_mod = TRUE;
+      change->text_mod = TRUE;
     }
   else if (strcmp(str, FLAG_FALSE) == 0)
     {
-      info->text_mod = FALSE;
+      change->text_mod = FALSE;
     }
   else
     {
@@ -890,11 +888,11 @@ read_change(change_t **change_p,
 
   if (strcmp(str, FLAG_TRUE) == 0)
     {
-      info->prop_mod = TRUE;
+      change->prop_mod = TRUE;
     }
   else if (strcmp(str, FLAG_FALSE) == 0)
     {
-      info->prop_mod = FALSE;
+      change->prop_mod = FALSE;
     }
   else
     {
@@ -910,11 +908,11 @@ read_change(change_t **change_p,
 
   if (strcmp(str, FLAG_TRUE) == 0)
     {
-      info->mergeinfo_mod = svn_tristate_true;
+      change->mergeinfo_mod = svn_tristate_true;
     }
   else if (strcmp(str, FLAG_FALSE) == 0)
     {
-      info->mergeinfo_mod = svn_tristate_false;
+      change->mergeinfo_mod = svn_tristate_false;
     }
   else
     {
@@ -935,22 +933,22 @@ read_change(change_t **change_p,
 
   /* Read the next line, the copyfrom line. */
   SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, result_pool));
-  info->copyfrom_known = TRUE;
+  change->copyfrom_known = TRUE;
   if (eof || line->len == 0)
     {
-      info->copyfrom_rev = SVN_INVALID_REVNUM;
-      info->copyfrom_path = NULL;
+      change->copyfrom_rev = SVN_INVALID_REVNUM;
+      change->copyfrom_path = NULL;
     }
   else
     {
       last_str = line->data;
-      SVN_ERR(parse_revnum(&info->copyfrom_rev, (const char **)&last_str));
+      SVN_ERR(parse_revnum(&change->copyfrom_rev, (const char **)&last_str));
 
       if (!svn_fspath__is_canonical(last_str))
         return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                                 _("Invalid copy-from path in changes line"));
 
-      info->copyfrom_path = auto_unescape_path(last_str, result_pool);
+      change->copyfrom_path = auto_unescape_path(last_str, result_pool);
     }
 
   *change_p = change;
@@ -1020,8 +1018,7 @@ svn_fs_x__read_changes_incrementally(svn
    All temporary allocations are in SCRATCH_POOL. */
 static svn_error_t *
 write_change_entry(svn_stream_t *stream,
-                   const char *path,
-                   svn_fs_path_change2_t *change,
+                   change_t *change,
                    apr_pool_t *scratch_pool)
 {
   const char *idstr;
@@ -1071,7 +1068,7 @@ write_change_entry(svn_stream_t *stream,
                               change->prop_mod ? FLAG_TRUE : FLAG_FALSE,
                               change->mergeinfo_mod == svn_tristate_true
                                                ? FLAG_TRUE : FLAG_FALSE,
-                              auto_escape_path(path, scratch_pool));
+                              auto_escape_path(change->path.data, scratch_pool));
 
   if (SVN_IS_VALID_REVNUM(change->copyfrom_rev))
     {
@@ -1115,16 +1112,13 @@ svn_fs_x__write_changes(svn_stream_t *st
   /* Write all items to disk in the new order. */
   for (i = 0; i < sorted_changed_paths->nelts; ++i)
     {
-      svn_fs_path_change2_t *change;
-      const char *path;
+      change_t *change;
 
       svn_pool_clear(iterpool);
-
       change = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).value;
-      path = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).key;
 
       /* Write out the new entry into the final rev-file. */
-      SVN_ERR(write_change_entry(stream, path, change, iterpool));
+      SVN_ERR(write_change_entry(stream, change, iterpool));
     }
 
   if (terminate_list)

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c Sat Dec 27 16:53:08 2014
@@ -1075,10 +1075,10 @@ serialize_change(svn_temp_serializer__co
                             sizeof(*change));
 
   /* serialize sub-structures */
-  svn_fs_x__id_serialize(context, &change->info.node_rev_id);
+  svn_fs_x__id_serialize(context, &change->node_rev_id);
 
   svn_temp_serializer__add_string(context, &change->path.data);
-  svn_temp_serializer__add_string(context, &change->info.copyfrom_path);
+  svn_temp_serializer__add_string(context, &change->copyfrom_path);
 
   /* return to the caller's nesting level */
   svn_temp_serializer__pop(context);
@@ -1103,11 +1103,11 @@ deserialize_change(void *buffer,
 
   /* fix-up of sub-structures */
   svn_fs_x__id_deserialize(change,
-                           (svn_fs_id_t **)&change->info.node_rev_id,
+                           (svn_fs_id_t **)&change->node_rev_id,
                            pool);
 
   svn_temp_deserializer__resolve(change, (void **)&change->path.data);
-  svn_temp_deserializer__resolve(change, (void **)&change->info.copyfrom_path);
+  svn_temp_deserializer__resolve(change, (void **)&change->copyfrom_path);
 }
 
 /* Auxiliary structure representing the content of a change_t array.

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c Sat Dec 27 16:53:08 2014
@@ -860,12 +860,13 @@ unparse_dir_entries(apr_array_header_t *
 
 /* Return a deep copy of SOURCE and allocate it in RESULT_POOL.
  */
-static svn_fs_path_change2_t *
-path_change_dup(const svn_fs_path_change2_t *source,
+static change_t *
+path_change_dup(const change_t *source,
                 apr_pool_t *result_pool)
 {
-  svn_fs_path_change2_t *result = apr_pmemdup(result_pool, source,
-                                              sizeof(*source));
+  change_t *result = apr_pmemdup(result_pool, source, sizeof(*source));
+  result->path.data = apr_pstrmemdup(result_pool, source->path.data,
+                                     source->path.len);
   result->node_rev_id = svn_fs_x__id_copy(source->node_rev_id, result_pool);
   if (source->copyfrom_path)
     result->copyfrom_path = apr_pstrdup(result_pool, source->copyfrom_path);
@@ -874,9 +875,9 @@ path_change_dup(const svn_fs_path_change
 }
 
 /* Merge the internal-use-only CHANGE into a hash of public-FS
-   svn_fs_path_change2_t CHANGED_PATHS, collapsing multiple changes into a
+   change_t CHANGED_PATHS, collapsing multiple changes into a
    single summarical (is that real word?) change per path.  DELETIONS is
-   also a path->svn_fs_path_change2_t hash and contains all the deletions
+   also a path->change_t hash and contains all the deletions
    that got turned into a replacement. */
 static svn_error_t *
 fold_change(apr_hash_t *changed_paths,
@@ -884,9 +885,8 @@ fold_change(apr_hash_t *changed_paths,
             const change_t *change)
 {
   apr_pool_t *pool = apr_hash_pool_get(changed_paths);
-  svn_fs_path_change2_t *old_change, *new_change;
+  change_t *old_change, *new_change;
   const svn_string_t *path = &change->path;
-  const svn_fs_path_change2_t *info = &change->info;
 
   if ((old_change = apr_hash_get(changed_paths, path->data, path->len)))
     {
@@ -895,8 +895,8 @@ fold_change(apr_hash_t *changed_paths,
 
       /* Sanity check:  only allow NULL node revision ID in the
          `reset' case. */
-      if ((! info->node_rev_id)
-           && (info->change_kind != svn_fs_path_change_reset))
+      if ((! change->node_rev_id)
+           && (change->change_kind != svn_fs_path_change_reset))
         return svn_error_create
           (SVN_ERR_FS_CORRUPT, NULL,
            _("Missing required node revision ID"));
@@ -904,8 +904,8 @@ fold_change(apr_hash_t *changed_paths,
       /* Sanity check: we should be talking about the same node
          revision ID as our last change except where the last change
          was a deletion. */
-      if (info->node_rev_id
-          && (! svn_fs_x__id_eq(old_change->node_rev_id, info->node_rev_id))
+      if (change->node_rev_id
+          && (! svn_fs_x__id_eq(old_change->node_rev_id, change->node_rev_id))
           && (old_change->change_kind != svn_fs_path_change_delete))
         return svn_error_create
           (SVN_ERR_FS_CORRUPT, NULL,
@@ -915,16 +915,16 @@ fold_change(apr_hash_t *changed_paths,
       /* Sanity check: an add, replacement, or reset must be the first
          thing to follow a deletion. */
       if ((old_change->change_kind == svn_fs_path_change_delete)
-          && (! ((info->change_kind == svn_fs_path_change_replace)
-                 || (info->change_kind == svn_fs_path_change_reset)
-                 || (info->change_kind == svn_fs_path_change_add))))
+          && (! ((change->change_kind == svn_fs_path_change_replace)
+                 || (change->change_kind == svn_fs_path_change_reset)
+                 || (change->change_kind == svn_fs_path_change_add))))
         return svn_error_create
           (SVN_ERR_FS_CORRUPT, NULL,
            _("Invalid change ordering: non-add change on deleted path"));
 
       /* Sanity check: an add can't follow anything except
          a delete or reset.  */
-      if ((info->change_kind == svn_fs_path_change_add)
+      if ((change->change_kind == svn_fs_path_change_add)
           && (old_change->change_kind != svn_fs_path_change_delete)
           && (old_change->change_kind != svn_fs_path_change_reset))
         return svn_error_create
@@ -932,7 +932,7 @@ fold_change(apr_hash_t *changed_paths,
            _("Invalid change ordering: add change on preexisting path"));
 
       /* Now, merge that change in. */
-      switch (info->change_kind)
+      switch (change->change_kind)
         {
         case svn_fs_path_change_reset:
           /* A reset here will simply remove the path change from the
@@ -958,7 +958,7 @@ fold_change(apr_hash_t *changed_paths,
           else
             {
               /* A deletion overrules a previous change (modify). */
-              new_change = path_change_dup(info, pool);
+              new_change = path_change_dup(change, pool);
               apr_hash_set(changed_paths, path->data, path->len, new_change);
             }
           break;
@@ -969,7 +969,7 @@ fold_change(apr_hash_t *changed_paths,
              so treat it just like a replace.  Remember the original
              deletion such that we are able to delete this path again
              (the replacement may have changed node kind and id). */
-          new_change = path_change_dup(info, pool);
+          new_change = path_change_dup(change, pool);
           new_change->change_kind = svn_fs_path_change_replace;
 
           apr_hash_set(changed_paths, path->data, path->len, new_change);
@@ -987,11 +987,11 @@ fold_change(apr_hash_t *changed_paths,
           /* If the new change modifies some attribute of the node, set
              the corresponding flag, whether it already was set or not.
              Note: We do not reset a flag to FALSE if a change is undone. */
-          if (info->text_mod)
+          if (change->text_mod)
             old_change->text_mod = TRUE;
-          if (info->prop_mod)
+          if (change->prop_mod)
             old_change->prop_mod = TRUE;
-          if (info->mergeinfo_mod == svn_tristate_true)
+          if (change->mergeinfo_mod == svn_tristate_true)
             old_change->mergeinfo_mod = svn_tristate_true;
           break;
         }
@@ -1001,9 +1001,9 @@ fold_change(apr_hash_t *changed_paths,
       /* Add this path.  The API makes no guarantees that this (new) key
          will not be retained.  Thus, we copy the key into the target pool
          to ensure a proper lifetime.  */
-      apr_hash_set(changed_paths,
-                   apr_pstrmemdup(pool, path->data, path->len), path->len,
-                   path_change_dup(info, pool));
+      new_change = path_change_dup(change, pool);
+      apr_hash_set(changed_paths, new_change->path.data,
+                   new_change->path.len, new_change);
     }
 
   return SVN_NO_ERROR;
@@ -1042,8 +1042,8 @@ process_changes(void *baton_p,
      is already a temporary subpool.
   */
 
-  if ((change->info.change_kind == svn_fs_path_change_delete)
-       || (change->info.change_kind == svn_fs_path_change_replace))
+  if ((change->change_kind == svn_fs_path_change_delete)
+       || (change->change_kind == svn_fs_path_change_replace))
     {
       apr_hash_index_t *hi;
 
@@ -1121,32 +1121,6 @@ svn_fs_x__txn_changes_fetch(apr_hash_t *
   return SVN_NO_ERROR;
 }
 
-
-svn_error_t *
-svn_fs_x__paths_changed(apr_hash_t **changed_paths_p,
-                        svn_fs_t *fs,
-                        svn_revnum_t rev,
-                        apr_pool_t *pool)
-{
-  apr_hash_t *changed_paths;
-  apr_array_header_t *changes;
-  int i;
-
-  SVN_ERR(svn_fs_x__get_changes(&changes, fs, rev, pool));
-
-  changed_paths = svn_hash__make(pool);
-  for (i = 0; i < changes->nelts; ++i)
-    {
-      change_t *change = APR_ARRAY_IDX(changes, i, change_t *);
-      apr_hash_set(changed_paths, change->path.data, change->path.len,
-                   &change->info);
-    }
-
-  *changed_paths_p = changed_paths;
-
-  return SVN_NO_ERROR;
-}
-
 /* Copy a revision node-rev SRC into the current transaction TXN_ID in
    the filesystem FS.  This is only used to create the root of a transaction.
    Allocations are from POOL.  */
@@ -1791,7 +1765,7 @@ svn_fs_x__add_change(svn_fs_t *fs,
                      apr_pool_t *pool)
 {
   apr_file_t *file;
-  svn_fs_path_change2_t *change;
+  change_t change;
   apr_hash_t *changes = apr_hash_make(pool);
 
   const svn_fs_id_t *fs_id;
@@ -1816,19 +1790,21 @@ svn_fs_x__add_change(svn_fs_t *fs,
                            APR_APPEND | APR_WRITE | APR_CREATE,
                            APR_OS_DEFAULT, pool));
 
-  change = svn_fs__path_change_create_internal(fs_id, change_kind, pool);
-  change->text_mod = text_mod;
-  change->prop_mod = prop_mod;
-  change->mergeinfo_mod = mergeinfo_mod
-                        ? svn_tristate_true
-                        : svn_tristate_false;
-  change->node_kind = node_kind;
-  change->copyfrom_known = TRUE;
-  change->copyfrom_rev = copyfrom_rev;
+  change.path.data = path;
+  change.path.len = strlen(path);
+  change.node_rev_id = fs_id;
+  change.change_kind = change_kind;
+  change.text_mod = text_mod;
+  change.prop_mod = prop_mod;
+  change.mergeinfo_mod = mergeinfo_mod ? svn_tristate_true
+                                       : svn_tristate_false;
+  change.node_kind = node_kind;
+  change.copyfrom_known = TRUE;
+  change.copyfrom_rev = copyfrom_rev;
   if (copyfrom_path)
-    change->copyfrom_path = apr_pstrdup(pool, copyfrom_path);
+    change.copyfrom_path = apr_pstrdup(pool, copyfrom_path);
 
-  svn_hash_sets(changes, path, change);
+  svn_hash_sets(changes, path, &change);
   SVN_ERR(svn_fs_x__write_changes(svn_stream_from_aprfile2(file, TRUE, pool),
                                   fs, changes, FALSE, pool));
 
@@ -3114,7 +3090,7 @@ verify_locks(svn_fs_t *fs,
   for (i = 0; i < changed_paths_sorted->nelts; i++)
     {
       const char *path;
-      svn_fs_path_change2_t *change;
+      change_t *change;
       svn_boolean_t recurse = TRUE;
 
       svn_pool_clear(subpool);

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h Sat Dec 27 16:53:08 2014
@@ -90,15 +90,6 @@ svn_fs_x__txn_changes_fetch(apr_hash_t *
                             svn_fs_x__txn_id_t txn_id,
                             apr_pool_t *pool);
 
-/* Find the paths which were changed in revision REV of filesystem FS
-   and store them in *CHANGED_PATHS_P.  Get any temporary allocations
-   from POOL. */
-svn_error_t *
-svn_fs_x__paths_changed(apr_hash_t **changed_paths_p,
-                        svn_fs_t *fs,
-                        svn_revnum_t rev,
-                        apr_pool_t *pool);
-
 /* Create a new transaction in filesystem FS, based on revision REV,
    and store it in *TXN_P.  Allocate all necessary variables from
    POOL. */

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c Sat Dec 27 16:53:08 2014
@@ -3290,6 +3290,30 @@ x_get_file_delta_stream(svn_txdelta_stre
 
 /* Finding Changes */
 
+/* Copy CHANGE into a FS API object allocated in RESULT_POOL. */
+static svn_fs_path_change2_t *
+construct_fs_path_change(change_t *change,
+                         apr_pool_t *result_pool)
+{
+  const svn_fs_id_t *id
+    = change->node_rev_id;
+  svn_fs_path_change2_t *result
+    = svn_fs__path_change_create_internal(id, change->change_kind,
+                                          result_pool);
+
+  result->text_mod = change->text_mod;
+  result->prop_mod = change->prop_mod;
+  result->node_kind = change->node_kind;
+
+  result->copyfrom_known = change->copyfrom_known;
+  result->copyfrom_rev = change->copyfrom_rev;
+  result->copyfrom_path = change->copyfrom_path;
+
+  result->mergeinfo_mod = change->mergeinfo_mod;
+
+  return result;
+}
+
 /* Set *CHANGED_PATHS_P to a newly allocated hash containing
    descriptions of the paths changed under ROOT.  The hash is keyed
    with const char * paths and has svn_fs_path_change2_t * values.  Use
@@ -3299,12 +3323,42 @@ x_paths_changed(apr_hash_t **changed_pat
                 svn_fs_root_t *root,
                 apr_pool_t *pool)
 {
+  apr_hash_t *changed_paths;
+
   if (root->is_txn_root)
-    return svn_fs_x__txn_changes_fetch(changed_paths_p, root->fs,
-                                       root_txn_id(root), pool);
+    {
+      apr_hash_index_t *hi;
+      SVN_ERR(svn_fs_x__txn_changes_fetch(&changed_paths, root->fs,
+                                          root_txn_id(root), pool));
+      for (hi = apr_hash_first(pool, changed_paths);
+           hi;
+           hi = apr_hash_next(hi))
+        {
+          change_t *change = apr_hash_this_val(hi);
+          apr_hash_set(changed_paths,
+                       apr_hash_this_key(hi), apr_hash_this_key_len(hi),
+                       construct_fs_path_change(change, pool));
+        }
+    }
   else
-    return svn_fs_x__paths_changed(changed_paths_p, root->fs, root->rev,
-                                   pool);
+    {
+      apr_array_header_t *changes;
+      int i;
+
+      SVN_ERR(svn_fs_x__get_changes(&changes, root->fs, root->rev, pool));
+
+      changed_paths = svn_hash__make(pool);
+      for (i = 0; i < changes->nelts; ++i)
+        {
+          change_t *change = APR_ARRAY_IDX(changes, i, change_t *);
+          apr_hash_set(changed_paths, change->path.data, change->path.len,
+                      construct_fs_path_change(change, pool));
+        }
+    }
+
+  *changed_paths_p = changed_paths;
+
+  return SVN_NO_ERROR;
 }