changeset 6049:348132c112cf

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.
author Aleix Conchillo Flaque <aleix@member.fsf.org>
date Fri, 08 Feb 2008 13:56:29 +0100
parents cfb4a51da7d5
children adf73753eb7d 57c1a7052982
files hgext/convert/common.py hgext/convert/gnuarch.py
diffstat 2 files changed, 27 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/convert/common.py	Fri Feb 08 18:31:55 2008 -0200
+++ 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):
--- a/hgext/convert/gnuarch.py	Fri Feb 08 18:31:55 2008 -0200
+++ 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/'):