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;