[PATCH 4 of 5] convert: pass localrepo.fileobj to converter sinks
Patrick Mezard
pmezard at gmail.com
Mon Jun 2 16:31:39 CDT 2008
# HG changeset patch
# User Patrick Mezard <pmezard at gmail.com>
# Date 1212441839 -7200
# Node ID 946542b6c0169e08d613e862bef768684be5d5f2
# Parent 50a52215368f4127b5fe720ad49ad214a9ddf8de
convert: pass localrepo.fileobj to converter sinks
diff --git a/hgext/convert/convcmd.py b/hgext/convert/convcmd.py
--- a/hgext/convert/convcmd.py
+++ b/hgext/convert/convcmd.py
@@ -1,3 +1,4 @@
+
# convcmd - convert extension commands definition
#
# Copyright 2005-2007 Matt Mackall <mpm at selenic.com>
@@ -16,7 +17,7 @@
import filemap
import os, shutil
-from mercurial import hg, util
+from mercurial import hg, util, localrepo
from mercurial.i18n import _
orig_encoding = 'ascii'
@@ -63,6 +64,28 @@
except NoRepo, inst:
ui.note(_("convert: %s\n") % inst)
raise util.Abort('%s: unknown repository type' % path)
+
+class sourcefile(localrepo.fileobject):
+ def __init__(self, source, name, version, copied):
+ self._source = source
+ self._name = name
+ self._version = version
+ self._copied = copied
+
+ def name(self):
+ return self._name
+
+ def data(self):
+ return self._source.getfile(self._name, self._version)
+
+ def islink(self):
+ return 'l' in self._source.getmode(self._name, self._version)
+
+ def isexec(self):
+ return 'x' in self._source.getmode(self._name, self._version)
+
+ def copied(self):
+ return self._copied
class converter(object):
def __init__(self, ui, source, dest, revmapfile, opts):
@@ -222,7 +245,6 @@
def copy(self, rev):
commit = self.commitcache[rev]
do_copies = hasattr(self.dest, 'copyfile')
- filenames = []
changes = self.source.getchanges(rev)
if isinstance(changes, basestring):
@@ -241,20 +263,13 @@
pbranches.append((self.map[prev],
self.commitcache[prev].branch))
self.dest.setbranch(commit.branch, pbranches)
+
+ fileobjs = []
for f, v in files:
- filenames.append(f)
- try:
- data = self.source.getfile(f, v)
- except IOError, inst:
- self.dest.delfile(f)
- else:
- e = self.source.getmode(f, v)
- self.dest.putfile(f, e, data)
- if do_copies:
- if f in copies:
- copyf = copies[f]
- # Merely marks that a copy happened.
- self.dest.copyfile(copyf, f)
+ copyf = None
+ if do_copies and f in copies:
+ copyf = copies[f]
+ fileobjs.append(sourcefile(self.source, f, v, copyf))
try:
parents = self.splicemap[rev].replace(',', ' ').split()
@@ -263,7 +278,7 @@
parents = [self.map.get(p, p) for p in parents]
except KeyError:
parents = [b[0] for b in pbranches]
- newnode = self.dest.putcommit(filenames, parents, commit)
+ newnode = self.dest.putcommit(fileobjs, parents, commit)
self.source.converted(rev, newnode)
self.map[rev] = newnode
diff --git a/hgext/convert/hg.py b/hgext/convert/hg.py
--- a/hgext/convert/hg.py
+++ b/hgext/convert/hg.py
@@ -125,7 +125,20 @@
self.repo.pull(prepo, [prepo.lookup(h) for h in heads])
self.before()
- def putcommit(self, files, parents, commit):
+ def putcommit(self, fileobjs, parents, commit):
+ files = []
+ for f in fileobjs:
+ files.append(f.name())
+ try:
+ data = f.data()
+ except IOError, inst:
+ self.delfile(f.name())
+ else:
+ e = (f.islink() and 'l' or '') + (f.isexec() and 'x' or '')
+ self.putfile(f.name(), e, data)
+ if f.copied():
+ self.copyfile(f.copied(), f.name())
+
seen = {}
pl = []
for p in parents:
diff --git a/hgext/convert/subversion.py b/hgext/convert/subversion.py
--- a/hgext/convert/subversion.py
+++ b/hgext/convert/subversion.py
@@ -1081,7 +1081,20 @@
def revid(self, rev):
return u"svn:%s@%s" % (self.uuid, rev)
- def putcommit(self, files, parents, commit):
+ def putcommit(self, fileobjs, parents, commit):
+ files = []
+ for f in fileobjs:
+ files.append(f.name())
+ try:
+ data = f.data()
+ except IOError, inst:
+ self.delfile(f.name())
+ else:
+ e = (f.islink() and 'l' or '') + (f.isexec() and 'x' or '')
+ self.putfile(f.name(), e, data)
+ if f.copied():
+ self.copyfile(f.copied(), f.name())
+
for parent in parents:
try:
return self.revid(self.childmap[parent])
More information about the Mercurial-devel
mailing list