# HG changeset patch # User Bryan O'Sullivan # Date 1194483962 28800 # Node ID 11d7908a3ea8348312e433d78ad65ea1a9e9c91a # Parent 2dd399d8a992080b22a2b2b407835347205298f7 convert: abstract map files into a class diff -r 2dd399d8a992 -r 11d7908a3ea8 hgext/convert/__init__.py --- a/hgext/convert/__init__.py Mon Nov 05 13:20:24 2007 -0800 +++ b/hgext/convert/__init__.py Wed Nov 07 17:06:02 2007 -0800 @@ -5,7 +5,7 @@ # This software may be used and distributed according to the terms # of the GNU General Public License, incorporated herein by reference. -from common import NoRepo, SKIPREV, converter_source, converter_sink +from common import NoRepo, SKIPREV, converter_source, converter_sink, mapfile from cvs import convert_cvs from darcs import darcs_source from git import convert_git @@ -57,23 +57,10 @@ self.ui = ui self.opts = opts self.commitcache = {} - self.revmapfile = revmapfile - self.revmapfilefd = None self.authors = {} self.authorfile = None - self.maporder = [] - self.map = {} - try: - origrevmapfile = open(self.revmapfile, 'r') - for l in origrevmapfile: - sv, dv = l[:-1].split() - if sv not in self.map: - self.maporder.append(sv) - self.map[sv] = dv - origrevmapfile.close() - except IOError: - pass + self.map = mapfile(ui, revmapfile) # Read first the dst author map if any authorfile = self.dest.authorfile() @@ -161,16 +148,6 @@ return s - def mapentry(self, src, dst): - if self.revmapfilefd is None: - try: - self.revmapfilefd = open(self.revmapfile, "a") - except IOError, (errno, strerror): - raise util.Abort("Could not open map file %s: %s, %s\n" % (self.revmapfile, errno, strerror)) - self.map[src] = dst - self.revmapfilefd.write("%s %s\n" % (src, dst)) - self.revmapfilefd.flush() - def writeauthormap(self): authorfile = self.authorfile if authorfile: @@ -217,7 +194,7 @@ dest = SKIPREV else: dest = self.map[changes] - self.mapentry(rev, dest) + self.map[rev] = dest return files, copies = changes parents = [self.map[r] for r in commit.parents] @@ -245,13 +222,13 @@ self.dest.copyfile(copyf, f) newnode = self.dest.putcommit(filenames, parents, commit) - self.mapentry(rev, newnode) + self.map[rev] = newnode def convert(self): try: self.source.before() self.dest.before() - self.source.setrevmap(self.map, self.maporder) + self.source.setrevmap(self.map) self.ui.status("scanning source...\n") heads = self.source.getheads() parents = self.walktree(heads) @@ -281,7 +258,7 @@ # write another hash correspondence to override the previous # one so we don't end up with extra tag heads if nrev: - self.mapentry(c, nrev) + self.map[c] = nrev self.writeauthormap() finally: @@ -292,8 +269,7 @@ self.dest.after() finally: self.source.after() - if self.revmapfilefd: - self.revmapfilefd.close() + self.map.close() def convert(ui, src, dest=None, revmapfile=None, **opts): """Convert a foreign SCM repository to a Mercurial one. diff -r 2dd399d8a992 -r 11d7908a3ea8 hgext/convert/common.py --- 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() diff -r 2dd399d8a992 -r 11d7908a3ea8 hgext/convert/filemap.py --- a/hgext/convert/filemap.py Mon Nov 05 13:20:24 2007 -0800 +++ b/hgext/convert/filemap.py Wed Nov 07 17:06:02 2007 -0800 @@ -128,7 +128,7 @@ self.children = {} self.seenchildren = {} - def setrevmap(self, revmap, order): + def setrevmap(self, revmap): # rebuild our state to make things restartable # # To avoid calling getcommit for every revision that has already @@ -143,7 +143,7 @@ seen = {SKIPREV: SKIPREV} dummyset = util.set() converted = [] - for rev in order: + for rev in revmap.order: mapped = revmap[rev] wanted = mapped not in seen if wanted: @@ -157,7 +157,7 @@ arg = None converted.append((rev, wanted, arg)) self.convertedorder = converted - return self.base.setrevmap(revmap, order) + return self.base.setrevmap(revmap) def rebuild(self): if self._rebuilt: diff -r 2dd399d8a992 -r 11d7908a3ea8 hgext/convert/subversion.py --- a/hgext/convert/subversion.py Mon Nov 05 13:20:24 2007 -0800 +++ b/hgext/convert/subversion.py Wed Nov 07 17:06:02 2007 -0800 @@ -149,7 +149,7 @@ self.head = self.revid(self.last_changed) self._changescache = None - def setrevmap(self, revmap, order): + def setrevmap(self, revmap): lastrevs = {} for revid in revmap.keys(): uuid, module, revnum = self.revsplit(revid)