diff hgsubversion/svnmeta.py @ 448:fbc7cf4fd701

tags: reinstate a tag map file in a better way
author Augie Fackler <durin42@gmail.com>
date Tue, 23 Jun 2009 21:33:40 -0500
parents 0d3b5acb1d51
children bda5b47ad2a2
line wrap: on
line diff
--- a/hgsubversion/svnmeta.py
+++ b/hgsubversion/svnmeta.py
@@ -62,7 +62,7 @@ class SVNMeta(object):
             f = open(self.branch_info_file)
             self.branches = pickle.load(f)
             f.close()
-        self.tags = {}
+        self.tags = maps.TagMap(repo)
         if os.path.exists(self.tag_locations_file):
             f = open(self.tag_locations_file)
             self.tag_locations = pickle.load(f)
@@ -263,7 +263,8 @@ class SVNMeta(object):
             if src_tag != False or src_file == '': # case 2
                 ln = self.localname(p)
                 if src_tag != False:
-                    src_branch, src_rev = self.tags[src_tag]
+                    ci = self.repo[self.tags[src_tag]].extra()['convert_revision']
+                    src_rev, src_branch, = self.parse_converted_revision(ci)
                 return {ln: (src_branch, src_rev, revnum)}
         return {}
 
@@ -311,13 +312,18 @@ class SVNMeta(object):
         '''
         tag = self.is_path_tag(self.remotename(branch))
         if tag and tag in self.tags:
-            br, r = self.tags[tag]
+            ha = self.tags[tag]
+            r, br = self.parse_converted_revision(self.repo[ha].extra()['convert_revision'])
         else:
             r, br = self.get_parent_svn_branch_and_rev(number, branch)
         if r is not None:
             return self.revmap[r, br]
         return revlog.nullid
 
+    def parse_converted_revision(self, convertedrev):
+        branch, revnum = convertedrev[40:].rsplit('@', 1)
+        return int(revnum), self.localname(self.normalize(branch))
+
     def update_branch_tag_map_for_rev(self, revision):
         paths = revision.paths
         added_branches = {}
@@ -338,7 +344,8 @@ class SVNMeta(object):
                         from_tag = self.is_path_tag(src_p)
                         if not from_tag:
                             continue
-                        branch, src_rev = self.tags[from_tag]
+                        ci = self.repo[self.tags[from_tag]].extra()['convert_revision']
+                        src_rev, branch, = self.parse_converted_revision(ci)
                     if t_name not in added_tags and file is '':
                         added_tags[t_name] = branch, src_rev
                     elif file:
@@ -395,21 +402,18 @@ class SVNMeta(object):
                     and branch not in added_branches):
                     parent = {branch: (None, 0, revision.revnum)}
             added_branches.update(parent)
-        rmtags = dict((t, self.tags[t][0]) for t in tags_to_delete)
+        def branchoftag(tag):
+            cr = self.repo[self.tags[tag]].extra()['convert_revision']
+            return self.parse_converted_revision(cr)[1]
+        rmtags = dict((t, branchoftag(t)) for t in tags_to_delete)
         return {
             'tags': (added_tags, rmtags),
             'branches': (added_branches, self.closebranches),
         }
 
     def save_tbdelta(self, tbdelta):
-        for t in tbdelta['tags'][1]:
-            del self.tags[t]
         for br in tbdelta['branches'][1]:
             del self.branches[br]
-        for t, info in tbdelta['tags'][0].items():
-            self.ui.status('Tagged %s@%s as %s\n' %
-                           (info[0] or 'trunk', info[1], t))
-        self.tags.update(tbdelta['tags'][0])
         self.branches.update(tbdelta['branches'][0])
 
     def movetag(self, tag, hash, branch, rev, date):
@@ -438,11 +442,10 @@ class SVNMeta(object):
                              date,
                              pextra)
         new_hash = self.repo.commitctx(ctx)
-        prefix, revnum = pextra['convert_revision'].rsplit('@', 1)
-        branch = self.localname(self.normalize('/' + prefix.split('/', 1)[1]))
-        assert self.revmap[int(revnum), branch] == parentctx.node()
-        self.revmap[int(revnum), branch] = new_hash
-
+        revnum, branch = self.parse_converted_revision(pextra['convert_revision'])
+        assert self.revmap[revnum, branch] == parentctx.node()
+        self.revmap[revnum, branch] = new_hash
+        self.tags[tag] = hash
         util.describe_commit(self.ui, new_hash, branch)
 
     def committags(self, delta, rev, endbranches):
@@ -471,6 +474,7 @@ class SVNMeta(object):
                 elif op == 'rm':
                     tagged = node.hex(node.nullid)
                 src += '%s %s\n' % (tagged, tag)
+                self.tags[tag] = node.bin(tagged)
 
             # add new changeset containing updated .hgtags
             def fctxfun(repo, memctx, path):