[PATCH] convert: improve gnu arch source performance and other fixes

Aleix Conchillo Flaque aleix at member.fsf.org
Fri Feb 8 08:43:19 CST 2008


# HG changeset patch
# User Aleix Conchillo Flaque <aleix at member.fsf.org>
# Date 1202475389 -3600
# Node ID 39607c3e05871028b5391c0e42d5cc73e209005d
# Parent  012ad48a07fafb7460b194b169031f5968801bc8
convert: improve gnu arch source performance and other fixes

- Improve performance by reading 'replay' output instead of
  calling 'delta' command after 'replay'. This increases speed
  significantly.

- Some times 'replay' command might fail with conflicts (don't
  know why), a new get from that revision just fixes it. So,
  if something fails, get a fresh copy from that revision and
  try from there.

diff -r 012ad48a07fa -r 39607c3e0587 hgext/convert/common.py
--- a/hgext/convert/common.py	Fri Feb 08 11:55:17 2008 +0100
+++ b/hgext/convert/common.py	Fri Feb 08 13:56:29 2008 +0100
@@ -249,7 +249,7 @@
     def runlines(self, cmd, *args, **kwargs):
         fp = self._run(cmd, *args, **kwargs)
         output = fp.readlines()
-        self.ui.debug(output)
+        self.ui.debug(''.join(output))
         return output, fp.close()
 
     def checkexit(self, status, output=''):
@@ -267,7 +267,7 @@
 
     def runlines0(self, cmd, *args, **kwargs):
         output, status = self.runlines(cmd, *args, **kwargs)
-        self.checkexit(status, output)
+        self.checkexit(status, ''.join(output))
         return output
 
     def getargmax(self):
diff -r 012ad48a07fa -r 39607c3e0587 hgext/convert/gnuarch.py
--- a/hgext/convert/gnuarch.py	Fri Feb 08 11:55:17 2008 +0100
+++ b/hgext/convert/gnuarch.py	Fri Feb 08 13:56:29 2008 +0100
@@ -155,24 +155,24 @@
     def _update(self, rev):
         if rev == 'base-0':
             # Initialise 'base-0' revision
-            self.ui.debug(_('obtaining revision %s...\n' % rev))
-            revision = '%s--%s' % (self.treeversion, rev)
-            output = self._execute('get', revision, self.tmppath)
-            self.ui.debug(_('analysing revision %s...\n' % rev))
-            files = self._readcontents(self.tmppath)
-            self.changes[rev].add_files += files
+            self._obtainrevision(rev)
         else:
             self.ui.debug(_('applying revision %s...\n' % rev))
             revision = '%s--%s' % (self.treeversion, rev)
-            output = self._execute('replay', '-d', self.tmppath, revision)
-
-            old_rev = self.parents[rev][0]
-            self.ui.debug(_('computing changeset between %s and %s...\n' \
-                               % (old_rev, rev)))
-            rev_a = '%s--%s' % (self.treeversion, old_rev)
-            rev_b = '%s--%s' % (self.treeversion, rev)
-            delta = self.runlines0('delta', '-n', rev_a, rev_b)
-            self._parsedelta(delta, rev)
+            changeset, status = self.runlines('replay', '-d', self.tmppath,
+                                              revision)
+            if status:
+                # Something went wrong while merging (baz or tla
+                # issue?), get latest revision and try from there
+                shutil.rmtree(self.tmppath, ignore_errors=True)
+                self._obtainrevision(rev)
+            else:
+                old_rev = self.parents[rev][0]
+                self.ui.debug(_('computing changeset between %s and %s...\n' \
+                                    % (old_rev, rev)))
+                rev_a = '%s--%s' % (self.treeversion, old_rev)
+                rev_b = '%s--%s' % (self.treeversion, rev)
+                self._parsechangeset(changeset, rev)
 
     def _getfile(self, name, rev):
         mode = os.lstat(os.path.join(self.tmppath, name)).st_mode
@@ -218,6 +218,15 @@
             copies[s] = d
         return changes, copies
 
+    def _obtainrevision(self, rev):
+        self.ui.debug(_('obtaining revision %s...\n' % rev))
+        revision = '%s--%s' % (self.treeversion, rev)
+        output = self._execute('get', revision, self.tmppath)
+        self.checkexit(output)
+        self.ui.debug(_('analysing revision %s...\n' % rev))
+        files = self._readcontents(self.tmppath)
+        self.changes[rev].add_files += files
+
     def _parsecatlog(self, data, rev):
         summary = []
         for l in data:
@@ -234,7 +243,7 @@
                 self.changes[rev].author = l[len('Creator: '):]
         self.changes[rev].summary = '\n'.join(summary)
 
-    def _parsedelta(self, data, rev):
+    def _parsechangeset(self, data, rev):
         for l in data:
             l = l.strip()
             if l.startswith('A') and not l.startswith('A/'):


More information about the Mercurial-devel mailing list