diff hgext/convert/common.py @ 5510:11d7908a3ea8

convert: abstract map files into a class
author Bryan O'Sullivan <bos@serpentine.com>
date Wed, 07 Nov 2007 17:06:02 -0800
parents f0a3918abd42
children 8cd26ccc68f8
line wrap: on
line diff
--- a/hgext/convert/common.py	Mon Nov 05 13:20:24 2007 -0800
+++ b/hgext/convert/common.py	Wed Nov 07 17:06:02 2007 -0800
@@ -1,5 +1,5 @@
 # common code for the convert extension
-import base64
+import base64, errno
 import cPickle as pickle
 from mercurial import util
 
@@ -54,11 +54,8 @@
     def after(self):
         pass
 
-    def setrevmap(self, revmap, order):
-        """set the map of already-converted revisions
-        
-        order is a list with the keys from revmap in the order they
-        appear in the revision map file."""
+    def setrevmap(self, revmap):
+        """set the map of already-converted revisions"""
         pass
 
     def getheads(self):
@@ -190,3 +187,41 @@
         filter empty revisions.
         """
         pass
+
+
+class mapfile(dict):
+    def __init__(self, ui, path):
+        super(mapfile, self).__init__()
+        self.ui = ui
+        self.path = path
+        self.fp = None
+        self.order = []
+        self._read()
+
+    def _read(self):
+        try:
+            fp = open(self.path, 'r')
+        except IOError, err:
+            if err.errno != errno.ENOENT:
+                raise
+            return
+        for line in fp:
+            key, value = line[:-1].split(' ', 1)
+            if key not in self:
+                self.order.append(key)
+            super(mapfile, self).__setitem__(key, value)
+        fp.close()
+            
+    def __setitem__(self, key, value):
+        if self.fp is None:
+            try:
+                self.fp = open(self.path, 'a')
+            except IOError, err:
+                raise util.Abort(_('could not open map file %r: %s') %
+                                 (self.path, err.strerror))
+        self.fp.write('%s %s\n' % (key, value))
+        self.fp.flush()
+        super(mapfile, self).__setitem__(key, value)
+
+    def close(self):
+        self.fp.close()