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,