changeset 381:a441ba143ac8

tags: fix handling for certain nonstandard tag layouts.
author Augie Fackler <durin42@gmail.com>
date Sat, 30 May 2009 20:18:14 -0500
parents 639105d25a2f
children b6047c200708
files hgsubversion/hg_delta_editor.py tests/fixtures/unusual_tags.sh tests/fixtures/unusual_tags.svndump tests/test_tags.py
diffstat 4 files changed, 322 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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)
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
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
+
+
--- 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)