changeset 131:4d42dbbb5127

hg_delta_editor: fix parent revision detection on branch copy Project items copyfrom revisions are irrelevant to parent revision detection, only the project one or those of its ancestors matter. Items copyfrom is useful when retrieving items content. Former code resulted in incorrect converted graph for pyglet repository, especially on the following revision: ------------------------------------------------------------------------ r274 | r1chardj0n3s | 2006-12-21 02:02:14 +0100 (Jeu, 21 Dec 2006) | 2 lines Changed paths: A /branches/richard-glx-version (from /trunk:269) M /branches/richard-glx-version/pyglet/window/xlib/__init__.py R /branches/richard-glx-version/tests/test.py (from /trunk/tests/test.py:270) R /branches/richard-glx-version/tools/info.py (from /trunk/tools/info.py:272) R /branches/richard-glx-version/website/get_involved.php (from /trunk/website/get_involved.php:273) Branching to horribly mangle GLX
author Patrick Mezard <pmezard@gmail.com>
date Wed, 10 Dec 2008 11:03:22 -0600
parents c2a84d436202
children 3a9d6cd18332
files hg_delta_editor.py tests/fixtures/unorderedbranch.sh tests/fixtures/unorderedbranch.svndump tests/test_fetch_branches.py
diffstat 4 files changed, 224 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/hg_delta_editor.py
+++ b/hg_delta_editor.py
@@ -267,7 +267,7 @@ class HgChangeReceiver(delta.Editor):
         added_tags = {}
         tags_to_delete = set()
         branches_to_delete = set()
-        for p in paths:
+        for p in sorted(paths):
             fi, br = self._path_and_branch_for_path(p)
             if fi is not None:
                 if fi == '' and br not in self.branches:
@@ -295,10 +295,6 @@ class HgChangeReceiver(delta.Editor):
                     br2 = br or 'default'
                     if br2 not in self.repo.branchtags() and paths[p].action == 'D':
                         branches_to_delete.add(br)
-                elif br in added_branches:
-                    if paths[p].copyfrom_rev > added_branches[br][1]:
-                        x,y,z = added_branches[br]
-                        added_branches[br] = x, paths[p].copyfrom_rev, z
             else:
                 t_name = self._is_path_tag(p)
                 if t_name == False:
new file mode 100755
--- /dev/null
+++ b/tests/fixtures/unorderedbranch.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+#
+# Generate unorderedbranch.svndump
+#
+
+mkdir temp
+cd temp
+
+mkdir project-orig
+cd project-orig
+mkdir trunk
+mkdir branches
+cd ..
+
+svnadmin create testrepo
+svnurl=file://`pwd`/testrepo
+svn import project-orig $svnurl -m "init project"
+
+svn co $svnurl project
+cd project/trunk
+echo a > a
+svn add a
+svn ci -m "add a in trunk"
+echo b > b
+echo z > z
+svn add b z
+svn ci -m "add b and z in trunk"
+svn up
+cd ../branches
+# Copy from trunk past revision. The converted used to take the last
+# trunk revision as branch parent instead of the specified one.
+svn cp -r 2 ../trunk branch
+svn cp ../trunk/z branch
+echo c > branch/c
+svn add branch/c
+svn ci -m 'branch and add c'
+cd ../..
+
+svnadmin dump testrepo > ../unorderedbranch.svndump
new file mode 100644
--- /dev/null
+++ b/tests/fixtures/unorderedbranch.svndump
@@ -0,0 +1,175 @@
+SVN-fs-dump-format-version: 2
+
+UUID: 0f1e934c-2a07-4fc9-acf5-47264bd6bc41
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2008-12-06T16:48:56.303240Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 114
+Content-length: 114
+
+K 7
+svn:log
+V 12
+init project
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2008-12-06T16:48:56.429957Z
+PROPS-END
+
+Node-path: branches
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 116
+Content-length: 116
+
+K 7
+svn:log
+V 14
+add a in trunk
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2008-12-06T16:48:57.178238Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Content-length: 12
+
+PROPS-END
+a
+
+
+Revision-number: 3
+Prop-content-length: 122
+Content-length: 122
+
+K 7
+svn:log
+V 20
+add b and z in trunk
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2008-12-06T16:48:58.191379Z
+PROPS-END
+
+Node-path: trunk/b
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 3b5d5c3712955042212316173ccf37be
+Content-length: 12
+
+PROPS-END
+b
+
+
+Node-path: trunk/z
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: a8a78d0ff555c931f045b6f448129846
+Content-length: 12
+
+PROPS-END
+z
+
+
+Revision-number: 4
+Prop-content-length: 118
+Content-length: 118
+
+K 7
+svn:log
+V 16
+branch and add c
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2008-12-06T16:49:02.185634Z
+PROPS-END
+
+Node-path: branches/branch
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 2
+Node-copyfrom-path: trunk
+
+
+Node-path: branches/branch/c
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 2cd6ee2c70b0bde53fbe6cac3c8b8bb1
+Content-length: 12
+
+PROPS-END
+c
+
+
+Node-path: branches/branch/z
+Node-kind: file
+Node-action: add
+Node-copyfrom-rev: 3
+Node-copyfrom-path: trunk/z
+Text-copy-source-md5: a8a78d0ff555c931f045b6f448129846
+Prop-content-length: 34
+Content-length: 34
+
+K 13
+svn:mergeinfo
+V 0
+
+PROPS-END
+
+
--- a/tests/test_fetch_branches.py
+++ b/tests/test_fetch_branches.py
@@ -20,6 +20,15 @@ class TestFetchBranches(test_util.TestBa
     def test_unrelatedbranch_stupid(self):
         self.test_unrelatedbranch(True)
 
+    def test_unorderedbranch(self, stupid=False):
+        repo = self._load_fixture_and_fetch('unorderedbranch.svndump', stupid)
+        r = repo['branch']
+        self.assertEqual(0, r.parents()[0].rev())
+        self.assertEqual(['a', 'c', 'z'], sorted(r.manifest()))
+
+    def test_unorderedbranch_stupid(self):
+        self.test_unorderedbranch(True)
+
 def suite():
     all = [unittest.TestLoader().loadTestsFromTestCase(TestFetchBranches),
           ]