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/05/07 14:58:31 UTC

svn commit: r1678186 - in /subversion/branches/move-tracking-2/subversion: include/private/svn_branch.h libsvn_delta/branch.c svnmover/svnmover.c

Author: julianfoad
Date: Thu May  7 12:58:31 2015
New Revision: 1678186

URL: http://svn.apache.org/r1678186
Log:
On the 'move-tracking-2' branch: Eliminate some direct access to branch
object implementation details.

* subversion/include/private/svn_branch.h,
  subversion/libsvn_delta/branch.c
  (svn_branch_get_elements): New.

* subversion/svnmover/svnmover.c
  (sort_compare_items_by_eid): New.
  (list_branch_elements_by_eid,
   branch_merge_subtree_r): Iterate over the elements in the branch
   rather than over all known element ids.
  (flat_branch_diff_r,
   svn_branch_diff_r): Print element ids using a hard-coded minimum width of
    3 rather than based on the maximum of all known element ids.

Modified:
    subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h
    subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c
    subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c

Modified: subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h?rev=1678186&r1=1678185&r2=1678186&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h (original)
+++ subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h Thu May  7 12:58:31 2015
@@ -398,6 +398,14 @@ svn_branch_get_subtree(const svn_branch_
  */
 #define SVN_BRANCH_SEQUENCE_POINT(branch)
 
+/* Return the mapping of elements in branch BRANCH.
+ *
+ * The mapping is from pointer-to-eid to
+ * pointer-to-svn_branch_el_rev_content_t.
+ */
+apr_hash_t *
+svn_branch_get_elements(svn_branch_state_t *branch);
+
 /* In BRANCH, get element EID (parent, name, payload).
  *
  * If element EID is not present, return null. Otherwise, the returned

Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c?rev=1678186&r1=1678185&r2=1678186&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c Thu May  7 12:58:31 2015
@@ -296,6 +296,12 @@ branch_validate_element(const svn_branch
     }
 }
 
+apr_hash_t *
+svn_branch_get_elements(svn_branch_state_t *branch)
+{
+  return branch->e_map;
+}
+
 svn_branch_el_rev_content_t *
 svn_branch_get_element(const svn_branch_state_t *branch,
                        int eid)

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=1678186&r1=1678185&r2=1678186&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c Thu May  7 12:58:31 2015
@@ -544,31 +544,41 @@ list_branch_elements(flat_branch_t *fb,
   return SVN_NO_ERROR;
 }
 
+/*  */
+static int
+sort_compare_items_by_eid(const svn_sort__item_t *a,
+                          const svn_sort__item_t *b)
+{
+  int eid_a = *(const int *)a->key;
+  int eid_b = *(const int *)b->key;
+
+  return eid_a - eid_b;
+}
+
 /* List all elements in branch BRANCH, in element notation.
  */
 static svn_error_t *
 list_branch_elements_by_eid(svn_branch_state_t *branch,
                             apr_pool_t *scratch_pool)
 {
-  int eid;
-  int eid_width = apr_snprintf(NULL, 0, "%d", branch->rev_root->next_eid - 1);
+  SVN_ITER_T(svn_branch_el_rev_content_t) *pi;
 
-  for (eid = branch->rev_root->first_eid; eid < branch->rev_root->next_eid; eid++)
+  for (SVN_HASH_ITER_SORTED(pi, svn_branch_get_elements(branch),
+                            sort_compare_items_by_eid, scratch_pool))
     {
-      svn_branch_el_rev_content_t *element = svn_branch_get_element(branch, eid);
+      int eid = *(const int *)(pi->key);
+      svn_branch_el_rev_content_t *element = pi->val;
 
       if (element && element->parent_eid == -1)
         {
           /* root element of this branch */
-          printf("    e%-*d  %-*s .\n",
-                 eid_width, eid,
-                 eid_width, "");
+          printf("    e%-3d  %-3s .\n",
+                 eid, "");
         }
       else if (element)
         {
-          printf("    e%-*d e%-*d/%s%s\n",
-                 eid_width, eid,
-                 eid_width, element->parent_eid,
+          printf("    e%-3d e%-3d/%s%s\n",
+                 eid, element->parent_eid,
                  element->name,
                  subbranch_str(branch, eid, scratch_pool));
         }
@@ -998,7 +1008,8 @@ branch_merge_subtree_r(svn_editor3_t *ed
   svn_branch_subtree_t *s_src, *s_tgt, *s_yca;
   apr_hash_t *diff_yca_src, *diff_yca_tgt;
   svn_boolean_t had_conflict = FALSE;
-  int first_eid, next_eid, eid;
+  SVN_ITER_T(svn_branch_el_rev_content_t *) *pi;
+  apr_hash_t *all_elements;
   const merge_conflict_policy_t policy = { TRUE, TRUE, TRUE, TRUE, TRUE };
 
   SVN_ERR_ASSERT(src->eid == tgt->eid);
@@ -1037,13 +1048,16 @@ branch_merge_subtree_r(svn_editor3_t *ed
                                          editor, s_yca, s_tgt,
                                          scratch_pool, scratch_pool));
 
-  first_eid = yca->branch->rev_root->first_eid;
-  next_eid = yca->branch->rev_root->next_eid;
-  next_eid = MAX(next_eid, src->branch->rev_root->next_eid);
-  next_eid = MAX(next_eid, tgt->branch->rev_root->next_eid);
-
-  for (eid = first_eid; eid < next_eid; eid++)
+  all_elements = apr_hash_overlay(scratch_pool,
+                                  svn_branch_get_elements(src->branch),
+                                  svn_branch_get_elements(tgt->branch));
+  all_elements = apr_hash_overlay(scratch_pool,
+                                  svn_branch_get_elements(yca->branch),
+                                  all_elements);
+  for (SVN_HASH_ITER_SORTED(pi, all_elements,
+                            sort_compare_items_by_eid, scratch_pool))
     {
+      int eid = *(const int *)(pi->key);
       svn_branch_el_rev_content_t **e_yca_src
         = svn_int_hash_get(diff_yca_src, eid);
       svn_branch_el_rev_content_t **e_yca_tgt
@@ -1365,7 +1379,6 @@ flat_branch_diff_r(svn_editor3_t *editor
                    flat_branch_t *fb_right,
                    svn_branch_diff_func_t diff_func,
                    const char *prefix,
-                   int eid_width,
                    apr_pool_t *scratch_pool)
 {
   const char *left_str = flat_branch_id_and_path(fb_left, scratch_pool);
@@ -1406,7 +1419,7 @@ flat_branch_diff_r(svn_editor3_t *editor
                      scratch_pool, "--- diff branch %s : %s\n",
                      left_str, right_str);
         }
-      SVN_ERR(diff_func(editor, fb_left, fb_right, prefix, header, eid_width,
+      SVN_ERR(diff_func(editor, fb_left, fb_right, prefix, header, 3 /*eid_width*/,
                         scratch_pool));
     }
 
@@ -1433,7 +1446,7 @@ flat_branch_diff_r(svn_editor3_t *editor
                                                         scratch_pool);
       SVN_ERR(flat_branch_diff_r(editor,
                                  sub_fb_left, sub_fb_right,
-                                 diff_func, prefix, eid_width, scratch_pool));
+                                 diff_func, prefix, scratch_pool));
     }
   return SVN_NO_ERROR;
 }
@@ -1454,13 +1467,10 @@ svn_branch_diff_r(svn_editor3_t *editor,
     = branch_get_flat_branch(left->branch, left->eid, scratch_pool);
   flat_branch_t *fb_right
     = branch_get_flat_branch(right->branch, right->eid, scratch_pool);
-  int eid_width = apr_snprintf(NULL, 0, "%d",
-                               MAX(left->branch->rev_root->next_eid,
-                                   right->branch->rev_root->next_eid));
 
   SVN_ERR(flat_branch_diff_r(editor,
                              fb_left, fb_right,
-                             diff_func, prefix, eid_width, scratch_pool));
+                             diff_func, prefix, scratch_pool));
   return SVN_NO_ERROR;
 }