[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