Patch attached for review:
[[[
Properly handle merge/block property conflicts when doing
transitive merging i.e. A -> B -> C.
* svnmerge.py:
(get_merge_props),
(get_block_props): Allow passing an optional rev argument.
(action_merge): Before each merge, preset the merge and blocked
property values to the merge left values. This prevents any
chance of conflicts during the merge.
* svnmerge_test.py:
(testTransitiveMergeWithBlock): Renamed from testTransitiveMerge.
Added a test at the end for the merge property value.
(testTransitiveMerge): New test that actually carries a merge
through from A -> B -> C instead of blocking it.
Patch By: Raman Gupta <[EMAIL PROTECTED]>
Review By: ?
]]]
Cheers,
Raman
Index: svnmerge.py
===================================================================
--- svnmerge.py (revision 25979)
+++ svnmerge.py (working copy)
@@ -689,13 +689,13 @@
return dict_from_revlist_prop(out)
-def get_merge_props(dir):
+def get_merge_props(dir, rev=None):
"""Extract the merged revisions."""
- return get_revlist_prop(dir, opts["prop"])
+ return get_revlist_prop(dir, opts["prop"], rev)
-def get_block_props(dir):
+def get_block_props(dir, rev=None):
"""Extract the blocked revisions."""
- return get_revlist_prop(dir, opts["block-prop"])
+ return get_revlist_prop(dir, opts["block-prop"], rev)
def get_blocked_revs(dir, source_pathid):
p = get_block_props(dir)
@@ -1323,9 +1323,10 @@
merge_metadata = logs[opts["source-url"]].merge_metadata()
for start,end in minimal_merge_intervals(revs, phantom_revs):
if not record_only:
- # Clear merge/blocked properties to avoid spurious property conflicts
- set_merge_props(branch_dir, {})
- set_block_props(branch_dir, {})
+ # Preset merge/blocked properties to the source value at the start rev
+ # to avoid spurious property conflicts
+ set_merge_props(branch_dir, get_merge_props(opts["source-url"], start - 1))
+ set_block_props(branch_dir, get_block_props(opts["source-url"], start - 1))
# Do the merge
svn_command("merge --force -r %d:%d %s %s" % \
(start - 1, end, opts["source-url"], branch_dir))
Index: svnmerge_test.py
===================================================================
--- svnmerge_test.py (revision 25979)
+++ svnmerge_test.py (working copy)
@@ -585,6 +585,57 @@
match=r"Committed revision 15")
os.chdir("../testYYY-branch")
+ open("test6", "w").write("test6")
+ self.launch("svn add test6")
+ self.launch('svn ci -m "add test6"',
+ match=r"Committed revision 16")
+
+ os.chdir("../test-branch")
+ self.svnmerge("merge -r 16")
+ self.launch('svn ci -m "merge r16"',
+ match=r"Committed revision 17")
+
+ #os.chdir("../test-branch")
+ open("test5", "w").write("test5")
+ self.launch("svn add test5")
+ self.launch('svn ci -m "add test5"',
+ match=r"Committed revision 18")
+
+ os.chdir("../trunk")
+ self.svnmerge("block -r 18")
+ self.launch('svn ci -m "block r18"',
+ match=r"Committed revision 19")
+
+ #os.chdir("../trunk")
+ out = self.svnmerge("merge -r 17")
+
+ self.launch('svn ci -m "merge r17 from test-branch"',
+ match=r"Committed revision 20")
+
+ p = self.getproperty()
+ self.assertEqual(p, '/branches/test-branch:1-13,17')
+ p = self.getBlockedProperty()
+ self.assertEqual(p, '/branches/test-branch:18')
+
+ def testTransitiveMergeWithBlock(self):
+ """
+ Test a merge of a change from testYYY-branch -> test-branch -> trunk
+ """
+ os.chdir("..")
+ self.launch("svn co %(TEST_REPO_URL)s/branches/testYYY-branch testYYY-branch")
+
+ os.chdir("trunk")
+ self.launch("svn up")
+ self.svnmerge("init ../test-branch")
+ self.launch('svn ci -m "init test-branch -> trunk"',
+ match=r"Committed revision 14")
+
+ os.chdir("../test-branch")
+ self.svnmerge("init -r 1-6 ../testYYY-branch")
+ self.launch('svn ci -m "init testYYY-branch -> test-branch"',
+ match=r"Committed revision 15")
+
+ os.chdir("../testYYY-branch")
open("test4", "w").write("test4")
self.launch("svn add test4")
self.launch('svn ci -m "add test4"',
@@ -611,6 +662,8 @@
self.launch('svn ci -m "merge r17 from test-branch"',
match=r"Committed revision 20")
+ p = self.getproperty()
+ self.assertEqual(p, '/branches/test-branch:1-13,17')
p = self.getBlockedProperty()
self.assertEqual(p, '/branches/test-branch:18')
_______________________________________________
Svnmerge mailing list
[email protected]
http://www.orcaware.com/mailman/listinfo/svnmerge