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

Reply via email to