# HG changeset patch # User Augie Fackler # Date 1247974259 18000 # Node ID 63cb630d667d31df0c5bc37500e39529a6397d03 # Parent 45df4d9320fa91d7e4f982673462c0bf05a8c2e9 tags: handle the most recent commit being an edit to an svn tag properly diff --git a/hgsubversion/svncommands.py b/hgsubversion/svncommands.py --- a/hgsubversion/svncommands.py +++ b/hgsubversion/svncommands.py @@ -27,7 +27,7 @@ def verify(ui, repo, *args, **opts): srev = int(srev.split('@')[1]) ui.write('verifying %s against r%i\n' % (ctx, srev)) - + url = repo.ui.expandpath('default') if args: url = args[0] @@ -176,9 +176,14 @@ def rebuildmeta(ui, repo, hg_repo_path, branchinfo[branch] = (parentbranch, noderevnums.get(parent.node(), 0), revision) - + droprev = lambda x: x.rsplit('@', 1)[0] for cctx in ctx.children(): - if cctx.extra().get('close'): + # check if a child of this change closes this branch + # that's true if the close flag is set and the svn revision + # path is the same. droprev removes the revnumber so we + # can verify it is the same branch easily + if (cctx.extra().get('close') + and droprev(cctx.extra().get('convert_revision', '@')) == droprev(convinfo)): branchinfo.pop(branch, None) break diff --git a/hgsubversion/svnmeta.py b/hgsubversion/svnmeta.py --- a/hgsubversion/svnmeta.py +++ b/hgsubversion/svnmeta.py @@ -418,6 +418,8 @@ class SVNMeta(object): self.branches.update(tbdelta['branches'][0]) def movetag(self, tag, hash, branch, rev, date): + if self.tags[tag] == hash: + return if branch == 'default': branch = None parentctx = self.repo[self.get_parent_revision(rev.revnum+1, branch)] diff --git a/tests/fixtures/unusual_tags.sh b/tests/fixtures/most-recent-is-edit-tag.sh copy from tests/fixtures/unusual_tags.sh copy to tests/fixtures/most-recent-is-edit-tag.sh --- a/tests/fixtures/unusual_tags.sh +++ b/tests/fixtures/most-recent-is-edit-tag.sh @@ -27,16 +27,15 @@ svn add iota svn ci -m 'branch changes' cd ../.. svn up -svn cp branches/dev_branch tags/versions/branch_version -svn ci -m 'Make a tag in tags/versions from branches/dev_branch' -svn up -svn cp trunk tags/blah/trunktag -svn ci -m 'Make a tag in tags/blah from trunk' +svn cp branches/dev_branch tags/some-tag +svn ci -m 'Make a tag.' svn up +echo foo > tags/some-tag/alpha +svn ci -m 'edit that tag' cd ../.. -svnadmin dump temp/repo > unusual_tags.svndump +svnadmin dump temp/repo > most-recent-is-edit-tag.svndump echo echo 'Complete.' echo 'You probably want to clean up temp now.' -echo 'Dump in unusual_tags.svndump' +echo 'Dump in most-recent-is-edit-tag.svndump' exit 0 diff --git a/tests/fixtures/most-recent-is-edit-tag.svndump b/tests/fixtures/most-recent-is-edit-tag.svndump new file mode 100644 --- /dev/null +++ b/tests/fixtures/most-recent-is-edit-tag.svndump @@ -0,0 +1,265 @@ +SVN-fs-dump-format-version: 2 + +UUID: 65efcde9-3b35-4f89-9c6b-23da1cf93d9b + +Revision-number: 0 +Prop-content-length: 56 +Content-length: 56 + +K 8 +svn:date +V 27 +2009-07-19T03:04:55.657240Z +PROPS-END + +Revision-number: 1 +Prop-content-length: 102 +Content-length: 102 + +K 7 +svn:log +V 3 +btt +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2009-07-19T03:04:56.082834Z +PROPS-END + +Node-path: branches +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: tags +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: tags/blah +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: tags/versions +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: 110 +Content-length: 110 + +K 7 +svn:log +V 10 +Add files. +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2009-07-19T03:04:57.109656Z +PROPS-END + +Node-path: trunk/alpha +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 6 +Text-content-md5: 9f9f90dbe3e5ee1218c86b8839db1995 +Content-length: 16 + +PROPS-END +alpha + + +Node-path: trunk/beta +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 5 +Text-content-md5: f0cf2a92516045024a0c99147b28f05b +Content-length: 15 + +PROPS-END +beta + + +Node-path: trunk/delta +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 6 +Text-content-md5: d2840cc81bc032bd1141b56687d0f93c +Content-length: 16 + +PROPS-END +delta + + +Node-path: trunk/gamma +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 6 +Text-content-md5: 303febb9068384eca46b5b6516843b35 +Content-length: 16 + +PROPS-END +gamma + + +Revision-number: 3 +Prop-content-length: 105 +Content-length: 105 + +K 7 +svn:log +V 6 +branch +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2009-07-19T03:05:00.048169Z +PROPS-END + +Node-path: branches/dev_branch +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 2 +Node-copyfrom-path: trunk + + +Revision-number: 4 +Prop-content-length: 114 +Content-length: 114 + +K 7 +svn:log +V 14 +branch changes +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2009-07-19T03:05:01.081946Z +PROPS-END + +Node-path: branches/dev_branch/alpha +Node-kind: file +Node-action: change +Text-content-length: 5 +Text-content-md5: 5e723ed52db2000686425ca28bc5ba4a +Content-length: 5 + +narf + + +Node-path: branches/dev_branch/iota +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 5 +Text-content-md5: ebcf3971120220589f1dfbf8d56e25b9 +Content-length: 15 + +PROPS-END +iota + + +Node-path: branches/dev_branch/delta +Node-action: delete + + +Revision-number: 5 +Prop-content-length: 111 +Content-length: 111 + +K 7 +svn:log +V 11 +Make a tag. +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2009-07-19T03:05:04.056268Z +PROPS-END + +Node-path: tags/some-tag +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 4 +Node-copyfrom-path: branches/dev_branch + + +Revision-number: 6 +Prop-content-length: 113 +Content-length: 113 + +K 7 +svn:log +V 13 +edit that tag +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2009-07-19T03:05:06.057723Z +PROPS-END + +Node-path: tags/some-tag/alpha +Node-kind: file +Node-action: change +Text-content-length: 4 +Text-content-md5: d3b07384d113edec49eaa6238ad5ff00 +Content-length: 4 + +foo + + diff --git a/tests/test_rebuildmeta.py b/tests/test_rebuildmeta.py --- a/tests/test_rebuildmeta.py +++ b/tests/test_rebuildmeta.py @@ -34,7 +34,7 @@ def _do_case(self, name, stupid): self.assertTrue(os.path.isfile(dtf), '%r is missing!' % tf) old, new = open(stf).read(), open(dtf).read() # uncomment next line for easy-ish debugging. - os.system('diff -u %s %s' % (stf, dtf)) + # os.system('diff -u %s %s' % (stf, dtf)) self.assertEqual(old, new) self.assertEqual(src.branchtags(), dest.branchtags()) srcbi = pickle.load(open(os.path.join(src.path, 'svn', 'branch_info'))) diff --git a/tests/test_tags.py b/tests/test_tags.py --- a/tests/test_tags.py +++ b/tests/test_tags.py @@ -8,6 +8,7 @@ from mercurial import ui import test_util +from hgsubversion import svncommands from hgsubversion import svnrepo class TestTags(test_util.TestBase): @@ -88,6 +89,28 @@ class TestTags(test_util.TestBase): 'versions/branch_version': 'I\x89\x1c>z#\xfc._K#@:\xd6\x1f\x96\xd6\x83\x1b|', }) + def test_most_recent_is_edited_stupid(self): + self.test_most_recent_is_edited(True) + + def test_most_recent_is_edited(self, stupid=False): + repo = self._load_fixture_and_fetch('most-recent-is-edit-tag.svndump', + stupid=stupid) + self.repo.ui.status( + "Note: this test failing may be because of a rebuildmeta failure.\n" + "You should check that before assuming issues with this test.\n") + wc2_path = self.wc_path + '2' + src, dest = hg.clone(repo.ui, self.wc_path, wc2_path, update=False) + svncommands.rebuildmeta(repo.ui, + dest, + os.path.dirname(dest.path), + args=[test_util.fileurl(self.repo_path), ]) + commands.pull(self.repo.ui, self.repo, stupid=stupid) + dtags, srctags = dest.tags(), self.repo.tags() + dtags.pop('tip') + srctags.pop('tip') + self.assertEqual(dtags, srctags) + self.assertEqual(dest.heads(), self.repo.heads()) + def test_edited_tag_stupid(self): self.test_edited_tag(True)