You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2015/09/17 16:56:20 UTC

svn commit: r1703641 - /subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c

Author: julianfoad
Date: Thu Sep 17 14:56:20 2015
New Revision: 1703641

URL: http://svn.apache.org/r1703641
Log:
On the 'move-tracking-2' branch: Change 'svnmover diff' code to use a hash
instead of an array.

This will make it easier to select a diff item by its eid, which I will use
in a subsequent patch.

* subversion/svnmover/svnmover.c
  (subtree_diff): Return a hash instead of an array.
  (diff_ordering_major_paths): Compare 'sort items' instead of 'diff items'.
  (diff_ordering_eids): Delete.
  (show_subtree_diff): Update to work with a hash instead of an array.

Modified:
    subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c

Modified: subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c?rev=1703641&r1=1703640&r2=1703641&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c Thu Sep 17 14:56:20 2015
@@ -1706,14 +1706,14 @@ typedef struct diff_item_t
 
 /* Return differences between branch subtrees S_LEFT and S_RIGHT.
  *
- * Set *DIFF_CHANGES to an array of (diff_item_t).
+ * Set *DIFF_CHANGES to a hash of (eid -> diff_item_t).
  *
  * ### This requires 'subtrees' only in order to produce the 'relpath'
  *     fields in the output. Other than that, it would work with arbitrary
  *     sets of elements.
  */
 static svn_error_t *
-subtree_diff(svn_array_t **diff_changes,
+subtree_diff(apr_hash_t **diff_changes,
              svn_editor3_t *editor,
              svn_branch_subtree_t *s_left,
              svn_branch_subtree_t *s_right,
@@ -1723,7 +1723,7 @@ subtree_diff(svn_array_t **diff_changes,
   apr_hash_t *diff_left_right;
   apr_hash_index_t *hi;
 
-  *diff_changes = svn_array_make(result_pool);
+  *diff_changes = apr_hash_make(result_pool);
 
   SVN_ERR(svn_branch_subtree_differences(&diff_left_right,
                                          editor, s_left, s_right,
@@ -1750,7 +1750,7 @@ subtree_diff(svn_array_t **diff_changes,
           item->reparented = (e0 && e1 && e0->parent_eid != e1->parent_eid);
           item->renamed = (e0 && e1 && strcmp(e0->name, e1->name) != 0);
 
-          SVN_ARRAY_PUSH(*diff_changes) = item;
+          svn_int_hash_set(*diff_changes, eid, item);
         }
     }
 
@@ -1764,9 +1764,10 @@ subtree_diff(svn_array_t **diff_changes,
  * Return negative/zero/positive when A sorts before/equal-to/after B.
  */
 static int
-diff_ordering_major_paths(const void *a, const void *b)
+diff_ordering_major_paths(const struct svn_sort__item_t *a,
+                          const struct svn_sort__item_t *b)
 {
-  const diff_item_t *item_a = *(void *const *)a, *item_b = *(void *const *)b;
+  const diff_item_t *item_a = a->value, *item_b = b->value;
   int deleted_a = (item_a->e0 && ! item_a->e1);
   int deleted_b = (item_b->e0 && ! item_b->e1);
   const char *major_path_a = (item_a->e1 ? item_a->relpath1 : item_a->relpath0);
@@ -1780,19 +1781,6 @@ diff_ordering_major_paths(const void *a,
   return svn_path_compare_paths(major_path_a, major_path_b);
 }
 
-/* Find the relative order of diff items A and B, according to the
- * EID of each.
- *
- * Return negative/zero/positive when A sorts before/equal-to/after B.
- */
-static int
-diff_ordering_eids(const void *a, const void *b)
-{
-  const diff_item_t *item_a = *(void *const *)a, *item_b = *(void *const *)b;
-
-  return (item_a->eid < item_b->eid) ? -1 : (item_a->eid > item_b->eid) ? 1 : 0;
-}
-
 /* Display differences between subtrees LEFT and RIGHT, which are subtrees
  * of branches LEFT_BID and RIGHT_BID respectively.
  *
@@ -1814,7 +1802,7 @@ show_subtree_diff(svn_editor3_t *editor,
                   const char *header,
                   apr_pool_t *scratch_pool)
 {
-  svn_array_t *diff_changes;
+  apr_hash_t *diff_changes;
   SVN_ITER_T(diff_item_t) *ai;
 
   SVN_ERR_ASSERT(left && left->root_eid >= 0
@@ -1823,13 +1811,14 @@ show_subtree_diff(svn_editor3_t *editor,
   SVN_ERR(subtree_diff(&diff_changes, editor, left, right,
                        scratch_pool, scratch_pool));
 
-  if (header && diff_changes->nelts)
+  if (header && apr_hash_count(diff_changes))
     notify("%s%s", prefix, header);
 
-  for (SVN_ARRAY_ITER_SORTED(ai, diff_changes,
-                             (the_ui_mode == UI_MODE_EIDS)
-                               ? diff_ordering_eids : diff_ordering_major_paths,
-                             scratch_pool))
+  for (SVN_HASH_ITER_SORTED(ai, diff_changes,
+                            (the_ui_mode == UI_MODE_EIDS)
+                              ? sort_compare_items_by_eid
+                              : diff_ordering_major_paths,
+                            scratch_pool))
     {
       diff_item_t *item = ai->val;
       svn_branch_el_rev_content_t *e0 = item->e0, *e1 = item->e1;