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/10/06 18:29:50 UTC

svn commit: r1707086 - in /subversion/branches/move-tracking-2/subversion: include/private/svn_branch.h include/private/svn_element.h libsvn_delta/branch.c libsvn_delta/compat3e.c libsvn_delta/editor3e.c libsvn_delta/element.c svnmover/svnmover.c

Author: julianfoad
Date: Tue Oct  6 16:29:50 2015
New Revision: 1707086

URL: http://svn.apache.org/viewvc?rev=1707086&view=rev
Log:
On the 'move-tracking-2' branch: Refactoring towards moving the
subbranch-root element concept to a higher level. Represent a subbranch-root
payload by a payload object with a flag set, rather than by null, and
eliminate some special handling of a subbranch-root element.

* subversion/include/private/svn_branch.h
  (svn_branch_update_subbranch_root_element): Delete.

* subversion/include/private/svn_element.h
  (svn_element_payload_t): Add an 'is_subbranch_root' field.
  (svn_element_payload_create_subbranch): New.

* subversion/libsvn_delta/branch.c
  (svn_branch_update_subbranch_root_element): Delete.
  (branch_validate_element,
   map_purge_orphans,
   svn_branch_map_add_subtree,
   svn_branch_state_parse,
   svn_branch_state_serialize): Update the callers/users.

* subversion/libsvn_delta/compat3e.c
  (editor3_alter): Update the callers/users.

* subversion/libsvn_delta/editor3e.c
  (svn_editor3_alter,
   svn_editor3_copy_one,
   svn_editor3_payload_resolve,
   wrap_alter): Update the callers/users.

* subversion/libsvn_delta/element.c
  (svn_element_payload_invariants,
   svn_element_payload_equal): Update the callers/users.
  (svn_element_payload_create_subbranch): New.

* subversion/svnmover/svnmover.c
  (subtree_replay,
   element_merge,
   mk_branch,
   do_branch): Update the callers/users.

Modified:
    subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h
    subversion/branches/move-tracking-2/subversion/include/private/svn_element.h
    subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c
    subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3e.c
    subversion/branches/move-tracking-2/subversion/libsvn_delta/editor3e.c
    subversion/branches/move-tracking-2/subversion/libsvn_delta/element.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=1707086&r1=1707085&r2=1707086&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 Tue Oct  6 16:29:50 2015
@@ -586,18 +586,6 @@ svn_branch_update_element(svn_branch_sta
                           const char *new_name,
                           const svn_element_payload_t *new_payload);
 
-/* Set or change the EID:element mapping for EID in BRANCH to reflect a
- * subbranch root element. This element has no payload in this branch; the
- * corresponding element of the subbranch will define its payload.
- *
- * Duplicate NEW_NAME into the branch mapping's pool.
- */
-void
-svn_branch_update_subbranch_root_element(svn_branch_state_t *branch,
-                                         int eid,
-                                         svn_branch_eid_t new_parent_eid,
-                                         const char *new_name);
-
 /* Purge orphaned elements and subbranches.
  */
 void

Modified: subversion/branches/move-tracking-2/subversion/include/private/svn_element.h
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/include/private/svn_element.h?rev=1707086&r1=1707085&r2=1707086&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/include/private/svn_element.h (original)
+++ subversion/branches/move-tracking-2/subversion/include/private/svn_element.h Tue Oct  6 16:29:50 2015
@@ -107,6 +107,10 @@ typedef struct svn_element_payload_t svn
  */
 struct svn_element_payload_t
 {
+  /* Is this a subbranch-root element, in other words a link to a nested
+   * branch? If so, all other fields are irrelevant. */
+  svn_boolean_t is_subbranch_root;
+
   /* The node kind for this payload: dir, file, symlink, or unknown. */
   svn_node_kind_t kind;
 
@@ -153,6 +157,14 @@ svn_element_payload_equal(const svn_elem
                           const svn_element_payload_t *right,
                           apr_pool_t *scratch_pool);
 
+/** Create a new node-payload object for a subbranch-root (link to a
+ * nested branch).
+ *
+ * Allocate the result in @a result_pool.
+ */
+svn_element_payload_t *
+svn_element_payload_create_subbranch(apr_pool_t *result_pool);
+
 /** Create a new node-payload object by reference to an existing payload.
  *
  * Set the node kind to 'unknown'.

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=1707086&r1=1707085&r2=1707086&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c Tue Oct  6 16:29:50 2015
@@ -417,12 +417,8 @@ branch_validate_element(const svn_branch
     element->name
     && IS_BRANCH_ROOT_EID(branch, eid) == (*element->name == '\0'));
 
-  /* Payload, if specified, must be in full or by reference. */
-  if (element->payload)
-    {
-      SVN_ERR_ASSERT_NO_RETURN(svn_element_payload_invariants(element->payload));
-    }
-  else /* it's a subbranch root */
+  SVN_ERR_ASSERT_NO_RETURN(svn_element_payload_invariants(element->payload));
+  if (element->payload->is_subbranch_root)
     {
       /* a subbranch root element must not be the branch root element */
       SVN_ERR_ASSERT_NO_RETURN(eid != branch->root_eid);
@@ -502,24 +498,6 @@ svn_branch_update_element(svn_branch_sta
   branch_map_set(branch, eid, element);
 }
 
-void
-svn_branch_update_subbranch_root_element(svn_branch_state_t *branch,
-                                         int eid,
-                                         svn_branch_eid_t new_parent_eid,
-                                         const char *new_name)
-{
-  apr_pool_t *map_pool = apr_hash_pool_get(branch->e_map);
-  svn_branch_el_rev_content_t *element
-    = svn_branch_el_rev_content_create(new_parent_eid, new_name,
-                                       NULL /*payload*/, map_pool);
-
-  /* EID must be a valid element id */
-  SVN_ERR_ASSERT_NO_RETURN(EID_IS_ALLOCATED(branch, eid));
-
-  /* Insert the new version */
-  branch_map_set(branch, eid, element);
-}
-
 static void
 map_purge_orphans(apr_hash_t *e_map,
                   int root_eid,
@@ -615,7 +593,8 @@ map_purge_orphans(apr_hash_t *e_map,
                   changed = TRUE;
                 }
               else
-                SVN_ERR_ASSERT_NO_RETURN(parent_element->payload);
+                SVN_ERR_ASSERT_NO_RETURN(
+                  ! parent_element->payload->is_subbranch_root);
             }
         }
     }
@@ -797,13 +776,9 @@ svn_branch_map_add_subtree(svn_branch_st
 
   /* Create the new subtree root element */
   new_root_content = svn_int_hash_get(new_subtree.e_map, new_subtree.root_eid);
-  if (new_root_content->payload)
-    svn_branch_update_element(to_branch, to_eid,
+  svn_branch_update_element(to_branch, to_eid,
                               new_parent_eid, new_name,
                               new_root_content->payload);
-  else
-    svn_branch_update_subbranch_root_element(to_branch, to_eid,
-                                             new_parent_eid, new_name);
 
   /* Process its immediate children */
   for (hi = apr_hash_first(scratch_pool, new_subtree.e_map);
@@ -1166,19 +1141,19 @@ svn_branch_state_parse(svn_branch_state_
 
       if (this_name)
         {
+          svn_element_payload_t *payload;
           if (! is_subbranch)
             {
-              svn_element_payload_t *payload
-                = svn_element_payload_create_ref(rev_root->rev, bid, eid,
-                                                 result_pool);
-              svn_branch_update_element(
-                branch_state, eid, this_parent_eid, this_name, payload);
+              payload = svn_element_payload_create_ref(rev_root->rev, bid, eid,
+                                                       result_pool);
             }
           else
             {
-              svn_branch_update_subbranch_root_element(
-                branch_state, eid, this_parent_eid, this_name);
+              payload
+                = svn_element_payload_create_subbranch(result_pool);
             }
+          svn_branch_update_element(
+            branch_state, eid, this_parent_eid, this_name, payload);
         }
     }
 
@@ -1291,7 +1266,8 @@ svn_branch_state_serialize(svn_stream_t
       SVN_ERR(svn_stream_printf(stream, scratch_pool,
                                 "e%d: %s %d %s\n",
                                 eid,
-                                element ? (element->payload ? "normal" : "subbranch")
+                                element ? ((! element->payload->is_subbranch_root)
+                                             ? "normal" : "subbranch")
                                      : "none",
                                 parent_eid, name));
     }

Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3e.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3e.c?rev=1707086&r1=1707085&r2=1707086&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3e.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3e.c Tue Oct  6 16:29:50 2015
@@ -1283,23 +1283,20 @@ editor3_alter(void *baton,
          || (new_parent_eid < eb->edited_rev_root->first_eid))
     svn_branch_txn_new_eid(eb->edited_rev_root);
 
-  if (new_payload)
+  if (! new_payload->is_subbranch_root)
     {
       SVN_DBG(("alter(e%d): parent e%d, name '%s', kind %s",
                eid, new_parent_eid,
                new_name, svn_node_kind_to_word(new_payload->kind)));
 
-      svn_branch_update_element(branch, eid, new_parent_eid, new_name,
-                                new_payload);
     }
   else
     {
       SVN_DBG(("alter(e%d): parent e%d, name '%s', kind (subbranch)",
                eid, new_parent_eid, new_name));
-
-      svn_branch_update_subbranch_root_element(branch, eid,
-                                               new_parent_eid, new_name);
     }
+  svn_branch_update_element(branch, eid, new_parent_eid, new_name,
+                            new_payload);
 
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/editor3e.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/editor3e.c?rev=1707086&r1=1707085&r2=1707086&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/editor3e.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/editor3e.c Tue Oct  6 16:29:50 2015
@@ -267,7 +267,7 @@ svn_editor3_alter(svn_editor3_t *editor,
                                          : VALID_EID(new_parent_eid));*/
   /*SVN_ERR_ASSERT(eid == branch->root_eid ? *new_name == '\0'
                                          : VALID_NAME(new_name));*/
-  SVN_ERR_ASSERT(!new_payload || VALID_PAYLOAD(new_payload));
+  SVN_ERR_ASSERT(VALID_PAYLOAD(new_payload));
   VERIFY(alter, new_parent_eid != eid);
 
   DO_CALLBACK(editor, cb_alter,
@@ -291,7 +291,7 @@ svn_editor3_copy_one(svn_editor3_t *edit
   SVN_ERR_ASSERT(VALID_REV_BID_EID(src_el_rev));
   SVN_ERR_ASSERT(VALID_EID(new_parent_eid));
   SVN_ERR_ASSERT(VALID_NAME(new_name));
-  SVN_ERR_ASSERT(! new_payload || VALID_PAYLOAD(new_payload));
+  SVN_ERR_ASSERT(VALID_PAYLOAD(new_payload));
   /* TODO: verify source element exists (in a committed rev) */
 
   DO_CALLBACK(editor, cb_copy_one,
@@ -341,14 +341,12 @@ svn_error_t *
 svn_editor3_payload_resolve(svn_editor3_t *editor,
                             svn_branch_el_rev_content_t *element)
 {
-  SVN_ERR_ASSERT(!element->payload
-                 || svn_element_payload_invariants(element->payload));
+  SVN_ERR_ASSERT(svn_element_payload_invariants(element->payload));
 
   DO_CALLBACK(editor, cb_payload_resolve,
               1(element));
 
-  SVN_ERR_ASSERT(!element->payload
-                 || svn_element_payload_invariants(element->payload));
+  SVN_ERR_ASSERT(svn_element_payload_invariants(element->payload));
   return SVN_NO_ERROR;
 }
 
@@ -516,7 +514,7 @@ wrap_alter(void *baton,
   dbg(eb, scratch_pool, "%s : alter(p=%s, n=%s, k=%s)",
       eid_str(eid, scratch_pool),
       eid_str(new_parent_eid, scratch_pool), new_name,
-      new_payload ? svn_node_kind_to_word(new_payload->kind) : "subbranch");
+      (!new_payload->is_subbranch_root) ? svn_node_kind_to_word(new_payload->kind) : "subbranch");
   SVN_ERR(svn_editor3_alter(eb->wrapped_editor,
                             branch_id, eid,
                             new_parent_eid, new_name, new_payload));

Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/element.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/element.c?rev=1707086&r1=1707085&r2=1707086&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/element.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/element.c Tue Oct  6 16:29:50 2015
@@ -71,6 +71,9 @@ svn_pathrev_equal(svn_pathrev_t *peg_pat
 svn_boolean_t
 svn_element_payload_invariants(const svn_element_payload_t *payload)
 {
+  if (payload->is_subbranch_root)
+    return TRUE;
+
   /* If kind is unknown, it's a reference; otherwise it has content
      specified and may also have a reference. */
   if (payload->kind == svn_node_unknown)
@@ -119,14 +122,15 @@ svn_element_payload_equal(const svn_elem
 {
   apr_array_header_t *prop_diffs;
 
-  assert(! left || svn_element_payload_invariants(left));
-  assert(! right || svn_element_payload_invariants(right));
+  assert(svn_element_payload_invariants(left));
+  assert(svn_element_payload_invariants(right));
 
-  if (!left && !right)
+  /* any two subbranch-root elements compare equal */
+  if (left->is_subbranch_root && right->is_subbranch_root)
     {
       return TRUE;
     }
-  else if (!left || !right)
+  else if (left->is_subbranch_root || right->is_subbranch_root)
     {
       return FALSE;
     }
@@ -172,6 +176,18 @@ svn_element_payload_equal(const svn_elem
 }
 
 svn_element_payload_t *
+svn_element_payload_create_subbranch(apr_pool_t *result_pool)
+{
+  svn_element_payload_t *new_payload
+    = apr_pcalloc(result_pool, sizeof(*new_payload));
+
+  new_payload->pool = result_pool;
+  new_payload->is_subbranch_root = TRUE;
+  assert(svn_element_payload_invariants(new_payload));
+  return new_payload;
+}
+
+svn_element_payload_t *
 svn_element_payload_create_ref(svn_revnum_t rev,
                                const char *branch_id,
                                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=1707086&r1=1707085&r2=1707086&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c Tue Oct  6 16:29:50 2015
@@ -353,9 +353,9 @@ subtree_replay(svn_editor3_t *editor,
       svn_branch_el_rev_content_t **e_pair = apr_hash_this_val(hi);
       svn_branch_el_rev_content_t *e0 = e_pair[0], *e1 = e_pair[1];
 
-      SVN_ERR_ASSERT(!e0 || !e0->payload
+      SVN_ERR_ASSERT(!e0
                      || svn_element_payload_invariants(e0->payload));
-      SVN_ERR_ASSERT(!e1 || !e1->payload
+      SVN_ERR_ASSERT(!e1
                      || svn_element_payload_invariants(e1->payload));
       if (e0 || e1)
         {
@@ -1327,7 +1327,8 @@ element_merge(svn_branch_el_rev_content_
       /* Double add (as we already handled the case where YCA also exists) */
       /* May be allowed for equal content of a normal element (not subbranch) */
       if (policy->merge_double_add
-          && side1->payload && side2->payload /* they are not subbranches */
+          && !side1->payload->is_subbranch_root
+          && !side2->payload->is_subbranch_root
           && svn_branch_el_rev_content_equal(side1, side2, scratch_pool))
         {
           SVN_DBG(("e%d double add",
@@ -2386,7 +2387,7 @@ mk_branch(const char **new_branch_id_p,
   SVN_ERR(svn_editor3_alter(editor,
                             outer_branch_id, new_outer_eid,
                             outer_parent_eid, outer_name,
-                            NULL /*new_payload*/));
+                            svn_element_payload_create_subbranch(scratch_pool)));
 
   SVN_ERR(svn_editor3_new_eid(editor, &new_inner_eid));
   SVN_ERR(svn_editor3_open_branch(editor, &new_branch_id,
@@ -2441,7 +2442,8 @@ do_branch(const char **new_branch_id_p,
 
   SVN_ERR(svn_editor3_alter(editor,
                             to_outer_branch_id, to_outer_eid,
-                            to_outer_parent_eid, new_name, NULL));
+                            to_outer_parent_eid, new_name,
+                            svn_element_payload_create_subbranch(scratch_pool)));
 
   notify_v("A+   %s (branch %s)",
            svn_branch_get_path_by_eid(to_outer_branch, to_outer_eid,