# HG changeset patch
# User Augie Fackler <durin42@gmail.com>
# 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')