[PATCH] convert: automatically regenerate '.hg/shamap' if missing

Dan Villiom Podlaski Christiansen danchr at gmail.com
Fri Aug 14 13:43:48 CDT 2009


# HG changeset patch
# User Dan Villiom Podlaski Christiansen <danchr at gmail.com>
# Date 1250085414 -7200
# Node ID a1dc369ffd49fc1e3081a98c5f5d493e1613296e
# Parent  46524d942ae7937154595b3facea5d34df55c0e3
convert: automatically regenerate '.hg/shamap' if missing.

diff --git a/hgext/convert/hg.py b/hgext/convert/hg.py
--- a/hgext/convert/hg.py
+++ b/hgext/convert/hg.py
@@ -23,7 +23,7 @@ from mercurial.i18n import _
 from mercurial.node import bin, hex, nullid
 from mercurial import hg, util, context, error
 
-from common import NoRepo, commit, converter_source, converter_sink
+from common import NoRepo, commit, mapfile, converter_source, converter_sink
 
 class mercurial_sink(converter_sink):
     def __init__(self, ui, path):
@@ -65,7 +65,27 @@ class mercurial_sink(converter_sink):
         self.wlock.release()
 
     def revmapfile(self):
-        return self.repo.join("shamap")
+        revmapfile = self.repo.join("shamap")
+
+        if (self.filemapmode and len(self.repo)
+            and not os.path.exists(revmapfile)):
+            self.ui.status(_('regenerating revision map...\n'))
+            revmap = mapfile(self.ui, revmapfile)
+            try:
+                for rev in self.repo:
+                    if rev and not rev % 10000:
+                        self.ui.status('%i revisions read...\n' % rev)
+                    context = self.repo[rev]
+                    extra = context.extra()
+                    if 'convert_revision' in extra:
+                        revmap[extra['convert_revision']] = context.hex()
+                revmap.close()
+            except KeyboardInterrupt:
+                revmap.close()
+                os.remove(revmapfile)
+                raise
+
+        return revmapfile
 
     def authorfile(self):
         return self.repo.join("authormap")


More information about the Mercurial-devel mailing list