[PATCH 5 of 5] convert: hg sink no longer reads from the working directory

Patrick Mezard pmezard at gmail.com
Mon Jun 2 16:31:40 CDT 2008


# HG changeset patch
# User Patrick Mezard <pmezard at gmail.com>
# Date 1212441839 -7200
# Node ID cc44b958626d498be256f432f21aaff3c9cdf0be
# Parent  946542b6c0169e08d613e862bef768684be5d5f2
convert: hg sink no longer reads from the working directory

diff --git a/hgext/convert/hg.py b/hgext/convert/hg.py
--- a/hgext/convert/hg.py
+++ b/hgext/convert/hg.py
@@ -17,9 +17,19 @@
 from mercurial.i18n import _
 from mercurial.repo import RepoError
 from mercurial.node import bin, hex, nullid
-from mercurial import hg, revlog, util
+from mercurial import hg, revlog, util, localrepo
 
 from common import NoRepo, commit, converter_source, converter_sink
+
+class tagfile(localrepo.fileobject):
+    def __init__(self, data):
+        self._data = data
+
+    def name(self):
+        return '.hgtags'
+
+    def data(self):
+        return self._data
 
 class mercurial_sink(converter_sink):
     def __init__(self, ui, path):
@@ -126,19 +136,6 @@
             self.before()
 
     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:
@@ -165,7 +162,7 @@
         while parents:
             p1 = p2
             p2 = parents.pop(0)
-            a = self.repo.rawcommit(files, text, commit.author, commit.date,
+            a = self.repo.memcommit(fileobjs, text, commit.author, commit.date,
                                     bin(p1), bin(p2), extra=extra)
             self.repo.dirstate.clear()
             text = "(octopus merge fixup)\n"
@@ -182,35 +179,28 @@
 
     def puttags(self, tags):
         try:
-            old = self.repo.wfile(".hgtags").read()
+            parentctx = self.repo.changectx(self.tagsbranch)
+            tagparent = parentctx.node()
+        except RepoError, inst:
+            parentctx = None
+            tagparent = nullid
+
+        try:
+            old = parentctx.filectx(".hgtags").data()
             oldlines = old.splitlines(1)
             oldlines.sort()
         except:
             oldlines = []
 
-        k = tags.keys()
-        k.sort()
-        newlines = []
-        for tag in k:
-            newlines.append("%s %s\n" % (tags[tag], tag))
-
+        newlines = [("%s %s\n" % (tags[tag], tag)) for tag in tags.keys()]
         newlines.sort()
 
         if newlines != oldlines:
             self.ui.status("updating tags\n")
-            f = self.repo.wfile(".hgtags", "w")
-            f.write("".join(newlines))
-            f.close()
-            if not oldlines: self.repo.add([".hgtags"])
+            f = tagfile("".join(newlines))
             date = "%s 0" % int(time.mktime(time.gmtime()))
-            extra = {}
-            if self.tagsbranch != 'default':
-                extra['branch'] = self.tagsbranch
-            try:
-                tagparent = self.repo.changectx(self.tagsbranch).node()
-            except RepoError, inst:
-                tagparent = nullid
-            self.repo.rawcommit([".hgtags"], "update tags", "convert-repo",
+            extra = {'branch': self.tagsbranch}
+            self.repo.memcommit([f], "update tags", "convert-repo",
                                 date, tagparent, nullid, extra=extra)
             return hex(self.repo.changelog.tip())
 
diff --git a/tests/test-convert-cvs b/tests/test-convert-cvs
--- a/tests/test-convert-cvs
+++ b/tests/test-convert-cvs
@@ -5,6 +5,11 @@
 cvscall()
 {
     cvs -f $@
+}
+
+hgcat()
+{
+    hg --cwd src-hg cat -r tip "$1"
 }
 
 echo "[extensions]" >> $HGRCPATH
@@ -45,13 +50,13 @@
 
 echo % convert fresh repo
 hg convert src src-hg | sed -e 's/connecting to.*cvsrepo/connecting to cvsrepo/g'
-cat src-hg/a
-cat src-hg/b/c
+hgcat a
+hgcat b/c
 
 echo % convert fresh repo with --filemap
 echo include b/c > filemap
 hg convert --filemap filemap src src-filemap | sed -e 's/connecting to.*cvsrepo/connecting to cvsrepo/g'
-cat src-hg/b/c
+hgcat b/c
 hg -R src-filemap log --template '#rev# #desc# files: #files#\n'
 
 echo % commit new file revisions
@@ -64,12 +69,12 @@
 
 echo % convert again
 hg convert src src-hg | sed -e 's/connecting to.*cvsrepo/connecting to cvsrepo/g'
-cat src-hg/a
-cat src-hg/b/c
+hgcat a
+hgcat b/c
 
 echo % convert again with --filemap
 hg convert --filemap filemap src src-filemap | sed -e 's/connecting to.*cvsrepo/connecting to cvsrepo/g'
-cat src-hg/b/c
+hgcat b/c
 hg -R src-filemap log --template '#rev# #desc# files: #files#\n'
 
 echo % commit branch
@@ -84,12 +89,12 @@
 
 echo % convert again
 hg convert src src-hg | sed -e 's/connecting to.*cvsrepo/connecting to cvsrepo/g'
-cat src-hg/a
-cat src-hg/b/c
+hgcat a
+hgcat b/c
 
 echo % convert again with --filemap
 hg convert --filemap filemap src src-filemap | sed -e 's/connecting to.*cvsrepo/connecting to cvsrepo/g'
-cat src-hg/b/c
+hgcat b/c
 hg -R src-filemap log --template '#rev# #desc# files: #files#\n'
 
 echo "graphlog = " >> $HGRCPATH
diff --git a/tests/test-convert-cvs.out b/tests/test-convert-cvs.out
--- a/tests/test-convert-cvs.out
+++ b/tests/test-convert-cvs.out
@@ -78,7 +78,6 @@
 sorting...
 converting...
 0 ci2
-a
 a
 c
 d


More information about the Mercurial-devel mailing list