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 2016/02/14 19:56:30 UTC

svn commit: r1730373 - in /subversion/trunk/subversion: include/svn_fs.h libsvn_fs/fs-loader.c libsvn_repos/replay.c

Author: stefan2
Date: Sun Feb 14 18:56:30 2016
New Revision: 1730373

URL: http://svn.apache.org/viewvc?rev=1730373&view=rev
Log:
Switch the repos layer's replay functions to new svn_fs_paths_changed3 API.

To do this, we also need a dup function for svn_fs_path_change3_t.

* subversion/include/svn_fs.h
  (svn_fs_path_change3_dup): Declare the new API function.

* subversion/libsvn_fs/fs-loader.c
  (svn_fs_path_change3_dup): Implement it.

* subversion/libsvn_repos/replay.c
  (add_subdir,
   fill_copyfrom,
   path_driver_cb_func): All changes now use the new struct type.
  (get_relevant_changes): Switch to the new API. Be sure to copy the temp
                          data before placing it into the output containers.
  (add_subdir_ev2,
   replay_node): All changes now use the new struct type.

Modified:
    subversion/trunk/subversion/include/svn_fs.h
    subversion/trunk/subversion/libsvn_fs/fs-loader.c
    subversion/trunk/subversion/libsvn_repos/replay.c

Modified: subversion/trunk/subversion/include/svn_fs.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_fs.h?rev=1730373&r1=1730372&r2=1730373&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_fs.h (original)
+++ subversion/trunk/subversion/include/svn_fs.h Sun Feb 14 18:56:30 2016
@@ -1660,6 +1660,15 @@ svn_fs_path_change3_create(svn_fs_path_c
                            apr_pool_t *result_pool);
 
 /**
+ * Return a deep copy of @a *change, allocated in @a result_pool.
+ *
+ * @since New in 1.10.
+ */
+svn_fs_path_change3_t *
+svn_fs_path_change3_dup(svn_fs_path_change3_t *change,
+                        apr_pool_t *result_pool);
+
+/**
  * Opaque iterator object type for a changed paths list.
  *
  * @since New in 1.10.

Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.c?rev=1730373&r1=1730372&r2=1730373&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.c Sun Feb 14 18:56:30 2016
@@ -2140,6 +2140,21 @@ svn_fs_path_change3_create(svn_fs_path_c
   return svn_fs__path_change_create_internal2(change_kind, result_pool);
 }
 
+svn_fs_path_change3_t *
+svn_fs_path_change3_dup(svn_fs_path_change3_t *change,
+                        apr_pool_t *result_pool)
+{
+  svn_fs_path_change3_t *copy = apr_pmemdup(result_pool, change,
+                                            sizeof(*copy));
+
+  copy->path.data = apr_pstrmemdup(result_pool, copy->path.data,
+                                   copy->path.len);
+  if (copy->copyfrom_path)
+    copy->copyfrom_path = apr_pstrdup(result_pool, change->copyfrom_path);
+
+  return copy;
+}
+
 /* Return the library version number. */
 const svn_version_t *
 svn_fs_version(void)

Modified: subversion/trunk/subversion/libsvn_repos/replay.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/replay.c?rev=1730373&r1=1730372&r2=1730373&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/replay.c (original)
+++ subversion/trunk/subversion/libsvn_repos/replay.c Sun Feb 14 18:56:30 2016
@@ -198,7 +198,7 @@ add_subdir(svn_fs_root_t *source_root,
 
   for (hi = apr_hash_first(pool, dirents); hi; hi = apr_hash_next(hi))
     {
-      svn_fs_path_change2_t *change;
+      svn_fs_path_change3_t *change;
       svn_boolean_t readable = TRUE;
       svn_fs_dirent_t *dent = apr_hash_this_val(hi);
       const char *copyfrom_path = NULL;
@@ -412,7 +412,7 @@ fill_copyfrom(svn_fs_root_t **copyfrom_r
               svn_revnum_t *copyfrom_rev,
               svn_boolean_t *src_readable,
               svn_fs_root_t *root,
-              svn_fs_path_change2_t *change,
+              svn_fs_path_change3_t *change,
               svn_repos_authz_func_t authz_read_func,
               void *authz_read_baton,
               const char *path,
@@ -463,7 +463,7 @@ path_driver_cb_func(void **dir_baton,
   const svn_delta_editor_t *editor = cb->editor;
   void *edit_baton = cb->edit_baton;
   svn_fs_root_t *root = cb->root;
-  svn_fs_path_change2_t *change;
+  svn_fs_path_change3_t *change;
   svn_boolean_t do_add = FALSE, do_delete = FALSE;
   void *file_baton = NULL;
   svn_revnum_t copyfrom_rev;
@@ -846,7 +846,7 @@ fetch_props_func(apr_hash_t **props,
 /* Retrieve the path changes under ROOT, filter them with AUTHZ_READ_FUNC
    and AUTHZ_READ_BATON and return those that intersect with BASE_RELPATH.
 
-   The svn_fs_path_change2_t* will be returned in *CHANGED_PATHS, keyed by
+   The svn_fs_path_change3_t* will be returned in *CHANGED_PATHS, keyed by
    their path.  The paths themselves are additionally returned in *PATHS.
 
    Allocate the returned data in RESULT_POOL and use SCRATCH_POOL for
@@ -862,24 +862,22 @@ get_relevant_changes(apr_hash_t **change
                      apr_pool_t *result_pool,
                      apr_pool_t *scratch_pool)
 {
-  apr_hash_t *fs_changes;
-  apr_hash_index_t *hi;
+  svn_fs_path_change_iterator_t *iterator;
+  svn_fs_path_change3_t *change;
   apr_pool_t *iterpool = svn_pool_create(scratch_pool);
 
   /* Fetch the paths changed under ROOT. */
-  SVN_ERR(svn_fs_paths_changed2(&fs_changes, root, result_pool));
+  SVN_ERR(svn_fs_paths_changed3(&iterator, root, scratch_pool, scratch_pool));
+  SVN_ERR(svn_fs_path_change_get(&change, iterator));
 
   /* Make an array from the keys of our CHANGED_PATHS hash, and copy
      the values into a new hash whose keys have no leading slashes. */
   *paths = apr_array_make(result_pool, 16, sizeof(const char *));
   *changed_paths = apr_hash_make(result_pool);
-  for (hi = apr_hash_first(scratch_pool, fs_changes);
-       hi;
-       hi = apr_hash_next(hi))
-    {
-      const char *path = apr_hash_this_key(hi);
-      apr_ssize_t keylen = apr_hash_this_key_len(hi);
-      svn_fs_path_change2_t *change = apr_hash_this_val(hi);
+  while (change)
+    {
+      const char *path = change->path.data;
+      apr_ssize_t keylen = change->path.len;
       svn_boolean_t allowed = TRUE;
 
       svn_pool_clear(iterpool);
@@ -902,10 +900,17 @@ get_relevant_changes(apr_hash_t **change
           if (   svn_relpath_skip_ancestor(base_relpath, path)
               || svn_relpath_skip_ancestor(path, base_relpath))
             {
+              change = svn_fs_path_change3_dup(change, result_pool);
+              path = change->path.data;
+              if (path[0] == '/')
+                path++;
+
               APR_ARRAY_PUSH(*paths, const char *) = path;
               apr_hash_set(*changed_paths, path, keylen, change);
             }
         }
+
+      SVN_ERR(svn_fs_path_change_get(&change, iterator));
     }
 
   svn_pool_destroy(iterpool);
@@ -1090,7 +1095,7 @@ add_subdir_ev2(svn_fs_root_t *source_roo
 
   for (hi = apr_hash_first(scratch_pool, dirents); hi; hi = apr_hash_next(hi))
     {
-      svn_fs_path_change2_t *change;
+      svn_fs_path_change3_t *change;
       svn_boolean_t readable = TRUE;
       svn_fs_dirent_t *dent = apr_hash_this_val(hi);
       const char *copyfrom_path = NULL;
@@ -1218,7 +1223,7 @@ replay_node(svn_fs_root_t *root,
             apr_pool_t *result_pool,
             apr_pool_t *scratch_pool)
 {
-  svn_fs_path_change2_t *change;
+  svn_fs_path_change3_t *change;
   svn_boolean_t do_add = FALSE;
   svn_boolean_t do_delete = FALSE;
   svn_revnum_t copyfrom_rev;