# HG changeset patch # User Augie Fackler # Date 1265474181 21600 # Node ID 9e6499c415a91efbf4d81bfe59ccf1ba0fe87059 # Parent d84116dda52d8492fd82ce80c037011511fdccf7 tags: fix files edited during tag creation This was broken because file edits were skipped if they were in tags, but committags in svnmeta didn't check to see if any files were changed during initial tag creation. diff --git a/hgsubversion/replay.py b/hgsubversion/replay.py --- a/hgsubversion/replay.py +++ b/hgsubversion/replay.py @@ -118,9 +118,10 @@ def convert_rev(ui, meta, svn, r, tbdelt # New regular tag without modifications, it will be committed by # svnmeta.committag(), we can skip the whole branch for now tag = meta.get_path_tag(meta.remotename(branch)) - if (tag and tag not in meta.tags and - branch not in meta.branches - and branch not in meta.repo.branchtags()): + if (tag and tag not in meta.tags + and branch not in meta.branches + and branch not in meta.repo.branchtags() + and not files): continue parentctx = meta.repo.changectx(parents[0]) @@ -176,6 +177,7 @@ def convert_rev(ui, meta, svn, r, tbdelt meta.revmap[rev.revnum, branch] = new_hash if tag: meta.movetag(tag, new_hash, parentctx.extra().get('branch', None), rev, date) + meta.addedtags.pop(tag, None) # 2. handle branches that need to be committed without any files for branch in current.emptybranches: diff --git a/hgsubversion/stupid.py b/hgsubversion/stupid.py --- a/hgsubversion/stupid.py +++ b/hgsubversion/stupid.py @@ -553,7 +553,8 @@ def convert_rev(ui, meta, svn, r, tbdelt deleted_branches = {} for p in r.paths: - if meta.get_path_tag(p): + tag = meta.get_path_tag(p) + if tag and tag not in meta.tags: continue branch = meta.localname(p) if not (r.paths[p].action == 'R' and branch in meta.branches): @@ -613,7 +614,8 @@ def convert_rev(ui, meta, svn, r, tbdelt # svnmeta.committag(), we can skip the whole branch for now if (tag and tag not in meta.tags and b not in meta.branches - and b not in meta.repo.branchtags()): + and b not in meta.repo.branchtags() + and not files_touched): continue if parentctx.node() == node.nullid and not files_touched: @@ -653,6 +655,7 @@ def convert_rev(ui, meta, svn, r, tbdelt meta.revmap[r.revnum, b] = ha else: meta.movetag(tag, ha, parentctx.extra().get('branch', None), r, date) + meta.addedtags.pop(tag, None) util.describe_commit(ui, ha, b) # These are branches with an 'R' status in svn log. This means they were diff --git a/hgsubversion/svnmeta.py b/hgsubversion/svnmeta.py --- a/hgsubversion/svnmeta.py +++ b/hgsubversion/svnmeta.py @@ -510,7 +510,7 @@ class SVNMeta(object): self.branches.update(tbdelta['branches'][0]) def movetag(self, tag, hash, branch, rev, date): - if self.tags[tag] == hash: + if tag in self.tags and self.tags[tag] == hash: return if branch == 'default': branch = None diff --git a/tests/fixtures/commit-to-tag.sh b/tests/fixtures/commit-to-tag.sh --- a/tests/fixtures/commit-to-tag.sh +++ b/tests/fixtures/commit-to-tag.sh @@ -64,6 +64,11 @@ svn up svn merge -r9:8 $REPOPATH . svn ci -m 'Revert revision 9.' +# make a tag from a branch and edit it at the same time +svn up +svn cp branches/magic tags/edit-at-create +echo alpha >> tags/edit-at-create/alpha +svn ci -m 'make a tag from a branch and edit it at the same time' cd ../.. svnadmin dump temp/repo > commit-to-tag.svndump diff --git a/tests/fixtures/commit-to-tag.svndump b/tests/fixtures/commit-to-tag.svndump --- a/tests/fixtures/commit-to-tag.svndump +++ b/tests/fixtures/commit-to-tag.svndump @@ -563,3 +563,38 @@ Node-action: add Node-copyfrom-rev: 8 Node-copyfrom-path: tags/will-edit/alpha Text-copy-source-md5: 9f9f90dbe3e5ee1218c86b8839db1995 + +Revision-number: 20 +Prop-content-length: 153 +Content-length: 153 + +K 7 +svn:log +V 53 +make a tag from a branch and edit it at the same time +K 10 +svn:author +V 5 +augie +K 8 +svn:date +V 27 +2010-02-06T13:31:13.153406Z +PROPS-END + +Node-path: tags/edit-at-create +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 19 +Node-copyfrom-path: branches/magic + + +Node-path: tags/edit-at-create/alpha +Node-kind: file +Node-action: change +Text-content-length: 12 +Text-content-md5: 7b77a55a273801087b943dfbe257f4db +Content-length: 12 + +alpha +alpha diff --git a/tests/test_tags.py b/tests/test_tags.py --- a/tests/test_tags.py +++ b/tests/test_tags.py @@ -131,7 +131,8 @@ rename a tag def test_edited_tag(self, stupid=False): repo = self._load_fixture_and_fetch('commit-to-tag.svndump', stupid=stupid) - self.assertEqual(len(repo.heads()), 5) + headcount = 6 + self.assertEqual(len(repo.heads()), headcount) heads = repo.heads() openheads = [h for h in heads if not repo[h].extra().get('close', False)] closedheads = set(heads) - set(openheads) @@ -146,7 +147,7 @@ rename a tag self.assertEqual(1, len(self.repo.branchheads('magic'))) - alsoedit, editlater, closeme, willedit, = closedheads + alsoedit, editlater, closeme, willedit, editcreate, = closedheads self.assertEqual( repo[willedit].extra(), {'close': '1', @@ -180,6 +181,7 @@ rename a tag {'close': '1', 'branch': 'closeme', 'convert_revision': 'svn:af82cc90-c2d2-43cd-b1aa-c8a78449440a/branches/closeme@17'}) + self.assertEqual('alpha\nalpha\n', repo['edit-at-create']['alpha'].data()) def test_tags_in_unusual_location(self): repo = self._load_fixture_and_fetch('tag_name_same_as_branch.svndump')