# HG changeset patch # User Patrick Mezard # Date 1228928602 21600 # Node ID 4d42dbbb5127719a96bb92b90102f0df06a88e06 # Parent c2a84d436202fdcc2e1d88aa3fecd46f711172eb 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 diff --git a/hg_delta_editor.py b/hg_delta_editor.py --- 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: diff --git a/tests/fixtures/unorderedbranch.sh b/tests/fixtures/unorderedbranch.sh 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 diff --git a/tests/fixtures/unorderedbranch.svndump b/tests/fixtures/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 + + diff --git a/tests/test_fetch_branches.py b/tests/test_fetch_branches.py --- 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), ]