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/21 16:46:14 UTC

svn commit: r1709855 - in /subversion/branches/move-tracking-2/subversion: include/private/svn_branch.h libsvn_delta/branch.c libsvn_delta/branch_nested.c libsvn_delta/branch_private.h

Author: julianfoad
Date: Wed Oct 21 14:46:14 2015
New Revision: 1709855

URL: http://svn.apache.org/viewvc?rev=1709855&view=rev
Log:
On the 'move-tracking-2' branch: Virtualize access to private data in the
branch txn object.

* subversion/include/private/svn_branch.h
  (svn_branch_txn_get_branches): Constify the txn pointer.
  (svn_branch_txn_add_branch): New.

* subversion/libsvn_delta/branch.c
  (branch_txn_get_branches,
   branch_txn_add_branch,
   branch_txn_add_new_branch,
   branch_txn_delete_branch,
   svn_branch_txn_get_branches,
   svn_branch_txn_add_branch,
   svn_branch_txn_add_new_branch,
   svn_branch_txn_delete_branch,
   branch_txn_create): Virtualize these four accessors for private data (the
    'branches' array).
  (svn_branch_txn_finalize_eids,
   svn_branch_txn_get_branch_by_id,
   svn_branch_txn_parse,
   svn_branch_state_serialize): Make these 'public' functions use the
    virtual accessors.

* subversion/libsvn_delta/branch_nested.c
  (nested_branch_txn_get_branches,
   nested_branch_txn_add_branch,
   nested_branch_txn_add_new_branch,
   nested_branch_txn_delete_branch,
   svn_nested_branch_txn_create):
    Add forwarding implementations for the new virtual methods.

* subversion/libsvn_delta/branch_private.h
  (branch_txn_v_get_branches_t,
   branch_txn_v_add_branch_t,
   branch_txn_v_add_new_branch_t,
   branch_txn_v_delete_branch_t,
   svn_branch_txn_vtable_t):
    Declare the new virtual methods.

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/libsvn_delta/branch_nested.c
    subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_private.h

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=1709855&r1=1709854&r2=1709855&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 Wed Oct 21 14:46:14 2015
@@ -174,7 +174,7 @@ svn_branch_txn_create(const svn_branch_t
  * Return an empty array if there are none.
  */
 apr_array_header_t *
-svn_branch_txn_get_branches(svn_branch_txn_t *txn,
+svn_branch_txn_get_branches(const svn_branch_txn_t *txn,
                             apr_pool_t *result_pool);
 
 /* Return the branch whose id is BRANCH_ID in TXN.
@@ -346,6 +346,13 @@ svn_branch_id_unnest(const char **outer_
                      const char *bid,
                      apr_pool_t *result_pool);
 
+/* Register the existence of BRANCH in TXN.
+ */
+svn_error_t *
+svn_branch_txn_add_branch(svn_branch_txn_t *txn,
+                          svn_branch_state_t *branch,
+                          apr_pool_t *scratch_pool);
+
 /* Create a new branch with branch id BID, with no elements
  * (not even a root element).
  *

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=1709855&r1=1709854&r2=1709855&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c Wed Oct 21 14:46:14 2015
@@ -114,6 +114,68 @@ branch_in_rev_or_txn(svn_branch_state_t
 }
 
 /* An #svn_branch_txn_t method. */
+static apr_array_header_t *
+branch_txn_get_branches(const svn_branch_txn_t *txn,
+                        apr_pool_t *result_pool)
+{
+  return apr_array_copy(result_pool, txn->priv->branches);
+}
+
+/* An #svn_branch_txn_t method. */
+static svn_error_t *
+branch_txn_add_branch(svn_branch_txn_t *txn,
+                      svn_branch_state_t *branch,
+                      apr_pool_t *scratch_pool)
+{
+  SVN_ARRAY_PUSH(txn->priv->branches) = branch;
+
+  return SVN_NO_ERROR;
+}
+
+/* An #svn_branch_txn_t method. */
+static svn_branch_state_t *
+branch_txn_add_new_branch(svn_branch_txn_t *txn,
+                          const char *bid,
+                          svn_branch_rev_bid_t *predecessor,
+                          int root_eid,
+                          apr_pool_t *scratch_pool)
+{
+  svn_branch_state_t *new_branch;
+
+  SVN_ERR_ASSERT_NO_RETURN(root_eid != -1);
+
+  new_branch = branch_state_create(bid, predecessor, root_eid, txn,
+                                   txn->priv->branches->pool);
+
+  SVN_ARRAY_PUSH(txn->priv->branches) = new_branch;
+
+  return new_branch;
+}
+
+/* An #svn_branch_txn_t method. */
+static svn_error_t *
+branch_txn_delete_branch(svn_branch_txn_t *txn,
+                         const char *bid,
+                         apr_pool_t *scratch_pool)
+{
+  SVN_ITER_T(svn_branch_state_t) *bi;
+
+  for (SVN_ARRAY_ITER(bi, txn->priv->branches, scratch_pool))
+    {
+      svn_branch_state_t *b = bi->val;
+
+      if (strcmp(b->bid, bid) == 0)
+        {
+          SVN_DBG(("deleting branch b%s e%d",
+                   bid, b->priv->element_tree->root_eid));
+          svn_sort__array_delete(txn->priv->branches, bi->i, 1);
+          break;
+        }
+    }
+  return SVN_NO_ERROR;
+}
+
+/* An #svn_branch_txn_t method. */
 static svn_error_t *
 branch_txn_new_eid(svn_branch_txn_t *txn,
                    svn_branch_eid_t *eid_p,
@@ -242,6 +304,54 @@ branch_txn_sequence_point(svn_branch_txn
  * ========================================================================
  */
 
+apr_array_header_t *
+svn_branch_txn_get_branches(const svn_branch_txn_t *txn,
+                            apr_pool_t *result_pool)
+{
+  apr_array_header_t *branches
+    = txn->vtable->get_branches(txn,
+                                result_pool);
+  return branches;
+}
+
+svn_error_t *
+svn_branch_txn_add_branch(svn_branch_txn_t *txn,
+                          svn_branch_state_t *branch,
+                          apr_pool_t *scratch_pool)
+{
+  SVN_ERR(txn->vtable->add_branch(txn,
+                                  branch,
+                                  scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+svn_branch_state_t *
+svn_branch_txn_add_new_branch(svn_branch_txn_t *txn,
+                              const char *bid,
+                              svn_branch_rev_bid_t *predecessor,
+                              int root_eid,
+                              apr_pool_t *scratch_pool)
+{
+  svn_branch_state_t *new_branch
+    = txn->vtable->add_new_branch(txn,
+                                  bid, predecessor, root_eid,
+                                  scratch_pool);
+
+  return new_branch;
+}
+
+svn_error_t *
+svn_branch_txn_delete_branch(svn_branch_txn_t *txn,
+                             const char *bid,
+                             apr_pool_t *scratch_pool)
+{
+  SVN_ERR(txn->vtable->delete_branch(txn,
+                                    bid,
+                                    scratch_pool));
+  return SVN_NO_ERROR;
+}
+
 svn_error_t *
 svn_branch_txn_new_eid(svn_branch_txn_t *txn,
                         int *new_eid_p,
@@ -330,6 +440,10 @@ branch_txn_create(svn_branch_repos_t *re
 {
   static const svn_branch_txn_vtable_t vtable = {
     {0},
+    branch_txn_get_branches,
+    branch_txn_add_branch,
+    branch_txn_add_new_branch,
+    branch_txn_delete_branch,
     branch_txn_new_eid,
     branch_txn_open_branch,
     branch_txn_branch,
@@ -419,6 +533,7 @@ svn_branch_txn_finalize_eids(svn_branch_
 {
   int n_txn_eids = (-1) - txn->first_eid;
   int mapping_offset;
+  apr_array_header_t *branches = branch_txn_get_branches(txn, scratch_pool);
   int i;
 
   if (txn->first_eid == 0)
@@ -429,9 +544,9 @@ svn_branch_txn_finalize_eids(svn_branch_
        txn_local_eid == -3  =>  committed_eid := (txn.next_eid + 1) ... */
   mapping_offset = txn->next_eid - 2;
 
-  for (i = 0; i < txn->priv->branches->nelts; i++)
+  for (i = 0; i < branches->nelts; i++)
     {
-      svn_branch_state_t *b = APR_ARRAY_IDX(txn->priv->branches, i, void *);
+      svn_branch_state_t *b = APR_ARRAY_IDX(branches, i, void *);
 
       SVN_ERR(branch_finalize_eids(b, mapping_offset, scratch_pool));
     }
@@ -445,22 +560,16 @@ svn_branch_txn_finalize_eids(svn_branch_
  * ========================================================================
  */
 
-apr_array_header_t *
-svn_branch_txn_get_branches(svn_branch_txn_t *txn,
-                            apr_pool_t *result_pool)
-{
-  return apr_array_copy(result_pool, txn->priv->branches);
-}
-
 svn_branch_state_t *
 svn_branch_txn_get_branch_by_id(const svn_branch_txn_t *txn,
                                 const char *branch_id,
                                 apr_pool_t *scratch_pool)
 {
+  apr_array_header_t *branches = branch_txn_get_branches(txn, scratch_pool);
   SVN_ITER_T(svn_branch_state_t) *bi;
   svn_branch_state_t *branch = NULL;
 
-  for (SVN_ARRAY_ITER(bi, txn->priv->branches, scratch_pool))
+  for (SVN_ARRAY_ITER(bi, branches, scratch_pool))
     {
       svn_branch_state_t *b = bi->val;
 
@@ -965,47 +1074,6 @@ svn_branch_instantiate_elements(svn_bran
   return SVN_NO_ERROR;
 }
 
-svn_branch_state_t *
-svn_branch_txn_add_new_branch(svn_branch_txn_t *txn,
-                              const char *bid,
-                              svn_branch_rev_bid_t *predecessor,
-                              int root_eid,
-                              apr_pool_t *scratch_pool)
-{
-  svn_branch_state_t *new_branch;
-
-  SVN_ERR_ASSERT_NO_RETURN(root_eid != -1);
-
-  new_branch = branch_state_create(bid, predecessor, root_eid, txn,
-                                   txn->priv->branches->pool);
-
-  SVN_ARRAY_PUSH(txn->priv->branches) = new_branch;
-
-  return new_branch;
-}
-
-svn_error_t *
-svn_branch_txn_delete_branch(svn_branch_txn_t *txn,
-                             const char *bid,
-                             apr_pool_t *scratch_pool)
-{
-  SVN_ITER_T(svn_branch_state_t) *bi;
-
-  for (SVN_ARRAY_ITER(bi, txn->priv->branches, scratch_pool))
-    {
-      svn_branch_state_t *b = bi->val;
-
-      if (strcmp(b->bid, bid) == 0)
-        {
-          SVN_DBG(("deleting branch b%s e%d",
-                   bid, b->priv->element_tree->root_eid));
-          svn_sort__array_delete(txn->priv->branches, bi->i, 1);
-          break;
-        }
-    }
-  return SVN_NO_ERROR;
-}
-
 /*
  * ========================================================================
  * Branch State Object
@@ -1326,7 +1394,7 @@ svn_branch_txn_parse(svn_branch_txn_t **
 
       SVN_ERR(svn_branch_state_parse(&branch, txn, stream,
                                      result_pool, scratch_pool));
-      SVN_ARRAY_PUSH(txn->priv->branches) = branch;
+      SVN_ERR(svn_branch_txn_add_branch(txn, branch, scratch_pool));
     }
 
   *txn_p = txn;
@@ -1400,6 +1468,7 @@ svn_branch_txn_serialize(svn_stream_t *s
                          svn_branch_txn_t *txn,
                          apr_pool_t *scratch_pool)
 {
+  apr_array_header_t *branches = branch_txn_get_branches(txn, scratch_pool);
   SVN_ITER_T(svn_branch_state_t) *bi;
 
   SVN_ERR(svn_stream_printf(stream, scratch_pool,
@@ -1407,9 +1476,9 @@ svn_branch_txn_serialize(svn_stream_t *s
                             "branches %d\n",
                             txn->rev,
                             txn->first_eid, txn->next_eid,
-                            txn->priv->branches->nelts));
+                            branches->nelts));
 
-  for (SVN_ARRAY_ITER(bi, txn->priv->branches, scratch_pool))
+  for (SVN_ARRAY_ITER(bi, branches, scratch_pool))
     {
       svn_branch_state_t *branch = bi->val;
 

Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_nested.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_nested.c?rev=1709855&r1=1709854&r2=1709855&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_nested.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_nested.c Wed Oct 21 14:46:14 2015
@@ -374,6 +374,63 @@ struct svn_branch_txn_priv_t
 
 /* Implements nested branching.
  * An #svn_branch_txn_t method. */
+static apr_array_header_t *
+nested_branch_txn_get_branches(const svn_branch_txn_t *txn,
+                               apr_pool_t *result_pool)
+{
+  /* Just forwarding: nothing more is needed. */
+  apr_array_header_t *branches
+    = svn_branch_txn_get_branches(txn->priv->wrapped_txn,
+                                  result_pool);
+
+  return branches;
+}
+
+/* An #svn_branch_txn_t method. */
+static svn_error_t *
+nested_branch_txn_add_branch(svn_branch_txn_t *txn,
+                             svn_branch_state_t *branch,
+                             apr_pool_t *scratch_pool)
+{
+  /* Just forwarding: nothing more is needed. */
+  SVN_ERR(svn_branch_txn_add_branch(txn->priv->wrapped_txn,
+                                    branch,
+                                    scratch_pool));
+  return SVN_NO_ERROR;
+}
+
+/* An #svn_branch_txn_t method. */
+static svn_branch_state_t *
+nested_branch_txn_add_new_branch(svn_branch_txn_t *txn,
+                                 const char *bid,
+                                 svn_branch_rev_bid_t *predecessor,
+                                 int root_eid,
+                                 apr_pool_t *scratch_pool)
+{
+  /* Just forwarding: nothing more is needed. */
+  svn_branch_state_t *new_branch
+    = svn_branch_txn_add_new_branch(txn->priv->wrapped_txn,
+                                    bid, predecessor, root_eid,
+                                    scratch_pool);
+
+  return new_branch;
+}
+
+/* An #svn_branch_txn_t method. */
+static svn_error_t *
+nested_branch_txn_delete_branch(svn_branch_txn_t *txn,
+                                const char *bid,
+                                apr_pool_t *scratch_pool)
+{
+  /* Just forwarding: nothing more is needed. */
+  SVN_ERR(svn_branch_txn_delete_branch(txn->priv->wrapped_txn,
+                                       bid,
+                                       scratch_pool));
+  return SVN_NO_ERROR;
+}
+
+/* Implements nested branching.
+ * An #svn_branch_txn_t method. */
 static svn_error_t *
 nested_branch_txn_new_eid(svn_branch_txn_t *txn,
                           svn_branch_eid_t *eid_p,
@@ -480,6 +537,10 @@ svn_nested_branch_txn_create(svn_branch_
 {
   static const svn_branch_txn_vtable_t vtable = {
     {0},
+    nested_branch_txn_get_branches,
+    nested_branch_txn_add_branch,
+    nested_branch_txn_add_new_branch,
+    nested_branch_txn_delete_branch,
     nested_branch_txn_new_eid,
     nested_branch_txn_open_branch,
     nested_branch_txn_branch,

Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_private.h?rev=1709855&r1=1709854&r2=1709855&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_private.h (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_private.h Wed Oct 21 14:46:14 2015
@@ -53,6 +53,27 @@ typedef struct svn_vtable_priv_t
  * See the corresponding public API functions for details.
  */
 
+typedef apr_array_header_t *(*branch_txn_v_get_branches_t)(
+  const svn_branch_txn_t *txn,
+  apr_pool_t *result_pool);
+
+typedef svn_error_t *(*branch_txn_v_add_branch_t)(
+  svn_branch_txn_t *txn,
+  svn_branch_state_t *branch,
+  apr_pool_t *scratch_pool);
+
+typedef svn_branch_state_t *(*branch_txn_v_add_new_branch_t)(
+  svn_branch_txn_t *txn,
+  const char *bid,
+  svn_branch_rev_bid_t *predecessor,
+  int root_eid,
+  apr_pool_t *scratch_pool);
+
+typedef svn_error_t *(*branch_txn_v_delete_branch_t)(
+  svn_branch_txn_t *txn,
+  const char *bid,
+  apr_pool_t *scratch_pool);
+
 typedef svn_error_t *(*branch_txn_v_new_eid_t)(
   svn_branch_txn_t *txn,
   svn_branch_eid_t *eid_p,
@@ -86,6 +107,10 @@ struct svn_branch_txn_vtable_t
   svn_vtable_priv_t vpriv;
 
   /* Methods. */
+  branch_txn_v_get_branches_t get_branches;
+  branch_txn_v_add_branch_t add_branch;
+  branch_txn_v_add_new_branch_t add_new_branch;
+  branch_txn_v_delete_branch_t delete_branch;
   branch_txn_v_new_eid_t new_eid;
   branch_txn_v_open_branch_t open_branch;
   branch_txn_v_branch_t branch;