You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2010/05/28 23:44:18 UTC
svn commit: r949307 - in /subversion/trunk/subversion: libsvn_client/merge.c
tests/cmdline/merge_tests.py tests/cmdline/mergeinfo_tests.py
Author: pburba
Date: Fri May 28 21:44:18 2010
New Revision: 949307
URL: http://svn.apache.org/viewvc?rev=949307&view=rev
Log:
Fix issue #3646 'record-only merges create self-referential mergeinfo'.
* subversion/libsvn_client/merge.c
(populate_remaining_ranges): Start getting the target's implicit mergeinfo
during --record-only merges; record_mergeinfo_for_dir_merge() already
does the right thing re self-referential mergeinfo once we do this.
* subversion/tests/cmdline/merge_tests.py
(self_reverse_merge): Tweak test setup to use 'svn propset' rather than
expecting self-referential mergeinfo to be set by --record-only.
(cyclic_record_only_merge_creates_self_referential_mergeinfo): Rename to...
(record_only_merge_creates_self_referential_mergeinfo): ...this, to reflect
the fact that this issue has nothing to do with cyclic merges. Also
remove comment about XFail status.
(test_list): Rename
cyclic_record_only_merge_creates_self_referential_mergeinfo to
record_only_merge_creates_self_referential_mergeinfo and remove XFail.
* subversion/tests/cmdline/mergeinfo_tests.py
(mergeinfo): As per self_reverse_merge above.
Modified:
subversion/trunk/subversion/libsvn_client/merge.c
subversion/trunk/subversion/tests/cmdline/merge_tests.py
subversion/trunk/subversion/tests/cmdline/mergeinfo_tests.py
Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=949307&r1=949306&r2=949307&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Fri May 28 21:44:18 2010
@@ -4112,6 +4112,9 @@ populate_remaining_ranges(apr_array_head
apr_pool_t *iterpool;
int i;
svn_revnum_t gap_start, gap_end;
+ svn_boolean_t child_inherits_implicit;
+ svn_client__merge_path_t *parent;
+ int parent_index;
iterpool = svn_pool_create(pool);
@@ -4125,6 +4128,46 @@ populate_remaining_ranges(apr_array_head
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i,
svn_client__merge_path_t *);
+
+ parent = NULL;
+ svn_pool_clear(iterpool);
+
+ /* Issue #3646 'record-only merges create self-referential
+ mergeinfo'. Get the merge target's implicit mergeinfo (natural
+ history). We'll use it later to avoid setting self-referential
+ mergeinfo -- see filter_natural_history_from_mergeinfo(). */
+ if (i == 0) /* First item is always the merge target. */
+ {
+ SVN_ERR(get_full_mergeinfo(NULL, /* child->pre_merge_mergeinfo */
+ &(child->implicit_mergeinfo),
+ NULL, /* child->indirect_mergeinfo */
+ svn_mergeinfo_inherited, ra_session,
+ child->abspath,
+ MAX(revision1, revision2),
+ MIN(revision1, revision2),
+ merge_b->ctx, pool, iterpool));
+ }
+ else
+ {
+ /* Issue #3443 - Subtrees of the merge target can inherit
+ their parent's implicit mergeinfo in most cases. */
+ parent_index = find_nearest_ancestor(children_with_mergeinfo,
+ FALSE, child->abspath);
+ parent = APR_ARRAY_IDX(children_with_mergeinfo, parent_index,
+ svn_client__merge_path_t *);
+ /* If CHILD is a subtree then its parent must be in
+ CHILDREN_WITH_MERGEINFO, see the global comment
+ 'THE CHILDREN_WITH_MERGEINFO ARRAY'. */
+ SVN_ERR_ASSERT(parent);
+
+ child_inherits_implicit = (parent && !child->switched);
+ SVN_ERR(ensure_implicit_mergeinfo(parent, child,
+ child_inherits_implicit,
+ revision1, revision2,
+ ra_session, merge_b->ctx,
+ pool, iterpool));
+ }
+
child->remaining_ranges = svn_rangelist__initialize(revision1,
revision2,
TRUE, pool);
@@ -4163,8 +4206,8 @@ populate_remaining_ranges(apr_array_head
const char *child_url1, *child_url2;
svn_client__merge_path_t *child =
APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *);
- svn_client__merge_path_t *parent = NULL;
- svn_boolean_t child_inherits_implicit;
+
+ parent = NULL;
/* If the path is absent don't do subtree merge either. */
SVN_ERR_ASSERT(child);
@@ -4201,8 +4244,8 @@ populate_remaining_ranges(apr_array_head
/* If CHILD isn't the merge target find its parent. */
if (i > 0)
{
- int parent_index = find_nearest_ancestor(children_with_mergeinfo,
- FALSE, child->abspath);
+ parent_index = find_nearest_ancestor(children_with_mergeinfo,
+ FALSE, child->abspath);
parent = APR_ARRAY_IDX(children_with_mergeinfo, parent_index,
svn_client__merge_path_t *);
/* If CHILD is a subtree then its parent must be in
Modified: subversion/trunk/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tests.py?rev=949307&r1=949306&r2=949307&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/merge_tests.py Fri May 28 21:44:18 2010
@@ -8999,8 +8999,8 @@ def self_reverse_merge(sbox):
# record dummy self mergeinfo to test the fact that self-reversal should work
# irrespective of mergeinfo.
- svntest.actions.run_and_verify_svn(None, None, [], 'merge', '-c', '1',
- '--record-only', sbox.repo_url, wc_dir)
+ svntest.actions.run_and_verify_svn(None, None, [], 'ps', SVN_PROP_MERGEINFO,
+ '/:1', wc_dir)
# Bad svntest.main.greek_state does not have '', so adding it explicitly.
expected_disk.add({'' : Item(props={SVN_PROP_MERGEINFO : '/:1'})})
@@ -15514,8 +15514,8 @@ def immediate_depth_merge_creates_minima
#----------------------------------------------------------------------
# Test for issue #3646 'cyclic --record-only merges create self-referential
# mergeinfo'
-def cyclic_record_only_merge_creates_self_referential_mergeinfo(sbox):
- "cyclic merge creates self referential mergeinfo"
+def record_only_merge_creates_self_referential_mergeinfo(sbox):
+ "merge creates self referential mergeinfo"
# Given a copy of trunk@M to branch, committed in r(M+1), if we
# --record-only merge the branch back to trunk with no revisions
@@ -15544,20 +15544,7 @@ def cyclic_record_only_merge_creates_sel
svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
# Merge A-branch back to A. This should record the mergeinfo '/A-branch:3'
- # on A. Currently however, it records self referential mergeinfo on A of
- # '/A:2'. This test is set as XFail until this issue is fixed.
- #
- # >svn merge ^/A-branch A --record-only
- # --- Recording mergeinfo for merge of r2 into 'A':
- # U A
- # --- Recording mergeinfo for merge of r3 into 'A':
- # G A
- #
- # >svn pg svn:mergeinfo -vR
- # Properties on 'A':
- # svn:mergeinfo
- # /A:2 <-- This is part of A's own history!
- # /A-branch:3
+ # on A.
expected_output = wc.State(A_path, {})
expected_mergeinfo_output = wc.State(A_path, {
'' : Item(status=' U'),
@@ -15803,7 +15790,7 @@ test_list = [ None,
merge_into_wc_for_deleted_branch,
foreign_repos_del_and_props,
immediate_depth_merge_creates_minimal_subtree_mergeinfo,
- XFail(cyclic_record_only_merge_creates_self_referential_mergeinfo),
+ record_only_merge_creates_self_referential_mergeinfo,
]
if __name__ == '__main__':
Modified: subversion/trunk/subversion/tests/cmdline/mergeinfo_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/mergeinfo_tests.py?rev=949307&r1=949306&r2=949307&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/mergeinfo_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/mergeinfo_tests.py Fri May 28 21:44:18 2010
@@ -74,8 +74,8 @@ def mergeinfo(sbox):
wc_dir = sbox.wc_dir
# Dummy up some mergeinfo.
- svntest.actions.run_and_verify_svn(None, None, [], "merge", "-c", "1",
- "--record-only", sbox.repo_url, wc_dir)
+ svntest.actions.run_and_verify_svn(None, None, [], 'ps', SVN_PROP_MERGEINFO,
+ '/:1', wc_dir)
svntest.actions.run_and_verify_mergeinfo(adjust_error_for_server_version(""),
['1'], sbox.repo_url, wc_dir)