# HG changeset patch # User Augie Fackler # Date 1243732694 18000 # Node ID a441ba143ac8446168d18ddc2050dccef68f863f # Parent 639105d25a2f8e2b28d2209e93c557184f04be60 tags: fix handling for certain nonstandard tag layouts. diff --git a/hgsubversion/hg_delta_editor.py b/hgsubversion/hg_delta_editor.py --- a/hgsubversion/hg_delta_editor.py +++ b/hgsubversion/hg_delta_editor.py @@ -362,8 +362,6 @@ class HgChangeReceiver(delta.Editor): longer = len(path) > len('%s/' % tagspath) if path and onpath and longer: tag, subpath = path[len(tagspath) + 1:], '' - if '/' in tag: - tag, subpath = tag.split('/', 1) return tag return False @@ -449,10 +447,12 @@ class HgChangeReceiver(delta.Editor): if not from_tag: continue branch, src_rev = self.tags[from_tag] - if t_name not in added_tags: - added_tags[t_name] = branch, src_rev - elif file and src_rev > added_tags[t_name][1]: + if t_name not in added_tags and file is '': added_tags[t_name] = branch, src_rev + elif file: + t_name = t_name[:-(len(file)+1)] + if src_rev > added_tags[t_name][1]: + added_tags[t_name] = branch, src_rev elif (paths[p].action == 'D' and p.endswith(t_name) and t_name in self.tags): tags_to_delete.add(t_name) diff --git a/tests/fixtures/unusual_tags.sh b/tests/fixtures/unusual_tags.sh new file mode 100755 --- /dev/null +++ b/tests/fixtures/unusual_tags.sh @@ -0,0 +1,42 @@ +#!/bin/sh +mkdir temp +cd temp +svnadmin create repo +svn co file://`pwd`/repo wc +cd wc +mkdir branches trunk tags +mkdir tags/versions +mkdir tags/blah +svn add * +svn ci -m 'btt' +cd trunk +for a in alpha beta gamma delta ; do + echo $a > $a + svn add $a +done +svn ci -m 'Add files.' +cd .. +svn up +svn cp trunk branches/dev_branch +svn ci -m 'branch' +cd branches/dev_branch +svn rm delta +echo narf > alpha +echo iota > iota +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 up +cd ../.. +svnadmin dump temp/repo > unusual_tags.svndump +echo +echo 'Complete.' +echo 'You probably want to clean up temp now.' +echo 'Dump in unusual_tags.svndump' +exit 0 diff --git a/tests/fixtures/unusual_tags.svndump b/tests/fixtures/unusual_tags.svndump new file mode 100644 --- /dev/null +++ b/tests/fixtures/unusual_tags.svndump @@ -0,0 +1,262 @@ +SVN-fs-dump-format-version: 2 + +UUID: f9b744e7-45eb-476b-878a-5ef2bae08236 + +Revision-number: 0 +Prop-content-length: 56 +Content-length: 56 + +K 8 +svn:date +V 27 +2009-05-31T00:36:58.665604Z +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-05-31T00:36:59.110531Z +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-05-31T00:37:00.120547Z +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-05-31T00:37:03.055780Z +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-05-31T00:37:04.091514Z +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: 152 +Content-length: 152 + +K 7 +svn:log +V 52 +Make a tag in tags/versions from branches/dev_branch +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2009-05-31T00:37:07.052404Z +PROPS-END + +Node-path: tags/versions/branch_version +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 4 +Node-copyfrom-path: branches/dev_branch + + +Revision-number: 6 +Prop-content-length: 134 +Content-length: 134 + +K 7 +svn:log +V 34 +Make a tag in tags/blah from trunk +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2009-05-31T00:37:10.055893Z +PROPS-END + +Node-path: tags/blah/trunktag +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 5 +Node-copyfrom-path: trunk + + diff --git a/tests/test_tags.py b/tests/test_tags.py --- a/tests/test_tags.py +++ b/tests/test_tags.py @@ -73,6 +73,19 @@ class TestTags(test_util.TestBase): {'tip': 'g\xdd\xcd\x93\x03g\x1e\x7f\xa6-[V%\x99\x07\xd3\x9d>(\x94', 'new_tag': '=\xb8^\xb5\x18\xa9M\xdb\xf9\xb62Z\xa0\xb5R6+\xfe6.'}) + def test_tags_in_unusual_location(self): + repo = self._load_fixture_and_fetch('unusual_tags.svndump') + branches = set(repo[h].extra()['branch'] + for h in repo.heads(closed=False)) + self.assertEqual(branches, set(['default', 'dev_branch'])) + tags = repo.tags() + del tags['tip'] + self.assertEqual( + tags, + {'blah/trunktag': '\xd3$@\xd7\xd8Nu\xce\xa6%\xf1u\xd9b\x1a\xb2\x81\xc2\xb0\xb1', + 'versions/branch_version': 'I\x89\x1c>z#\xfc._K#@:\xd6\x1f\x96\xd6\x83\x1b|', + }) + def suite(): return unittest.TestLoader().loadTestsFromTestCase(TestTags)