[PATCH 3 of 6] Save a few opens on the map file

Edouard Gomez ed.gomez at free.fr
Thu Jun 7 16:50:20 CDT 2007


# HG changeset patch
# User Edouard Gomez <ed.gomez at free.fr>
# Date 1181250962 -7200
# Node ID 8b4f7b0f7b0d92883ef7063e8b164f2564cd1716
# Parent  ae8e8b8507aaac03d101829fb8e51cad73cd4edf
Save a few opens on the map file

Save a few opens on the map file adding a class attribute

diff --git a/hgext/convert/__init__.py b/hgext/convert/__init__.py
--- a/hgext/convert/__init__.py
+++ b/hgext/convert/__init__.py
@@ -536,15 +536,18 @@ class convert(object):
         self.source = source
         self.dest = dest
         self.ui = ui
-        self.mapfile = mapfile
         self.opts = opts
         self.commitcache = {}
+        self.mapfile = mapfile
+        self.mapfilefd = None
 
         self.map = {}
         try:
-            for l in file(self.mapfile):
+            origmapfile = open(self.mapfile, 'r')
+            for l in origmapfile:
                 sv, dv = l[:-1].split()
                 self.map[sv] = dv
+            origmapfile.close()
         except IOError:
             pass
 
@@ -620,6 +623,16 @@ class convert(object):
 
         return s
 
+    def mapentry(self, src, dst):
+        if self.mapfilefd is None:
+            try:
+                self.mapfilefd = open(self.mapfile, "a")
+            except IOError, (errno, strerror):
+                raise util.Abort("Could not open map file %s: %s, %s\n" % (self.mapfile, errno, strerror))
+        self.map[src] = dst
+        self.mapfilefd.write("%s %s\n" % (src, dst))
+        self.mapfilefd.flush()
+
     def copy(self, rev):
         c = self.commitcache[rev]
         files = self.source.getchanges(rev)
@@ -635,8 +648,8 @@ class convert(object):
 
         r = [self.map[v] for v in c.parents]
         f = [f for f,v in files]
-        self.map[rev] = self.dest.putcommit(f, r, c)
-        file(self.mapfile, "a").write("%s %s\n" % (rev, self.map[rev]))
+        newnode = self.dest.putcommit(f, r, c)
+        self.mapentry(rev, newnode)
 
     def convert(self):
         self.ui.status("scanning source...\n")
@@ -668,7 +681,11 @@ class convert(object):
             # write another hash correspondence to override the previous
             # one so we don't end up with extra tag heads
             if nrev:
-                file(self.mapfile, "a").write("%s %s\n" % (c, nrev))
+                self.mapentry(c, nrev)
+
+    def cleanup(self):
+       if self.mapfilefd:
+           self.mapfilefd.close()
 
 def _convert(ui, src, dest=None, mapfile=None, **opts):
     '''Convert a foreign SCM repository to a Mercurial one.
@@ -715,7 +732,10 @@ def _convert(ui, src, dest=None, mapfile
             mapfile = os.path.join(destc, "map")
 
     c = convert(ui, srcc, destc, mapfile, opts)
-    c.convert()
+    try:
+        c.convert()
+    finally:
+        c.cleanup()
 
 cmdtable = {
     "convert": (_convert,


More information about the Mercurial-devel mailing list