# HG changeset patch # User Aleix Conchillo Flaque # Date 2008-02-08 12:56:29 # Node ID 348132c112cf1c9c6135af7b37b8b246ec2e4fed # Parent cfb4a51da7d592928d7fbaf43fc2ade9ff9ce57e 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 --git a/hgext/convert/common.py b/hgext/convert/common.py --- a/hgext/convert/common.py +++ b/hgext/convert/common.py @@ -249,7 +249,7 @@ class commandline(object): 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 @@ class commandline(object): 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 --git a/hgext/convert/gnuarch.py b/hgext/convert/gnuarch.py --- a/hgext/convert/gnuarch.py +++ b/hgext/convert/gnuarch.py @@ -155,24 +155,24 @@ class gnuarch_source(converter_source, c 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 @@ class gnuarch_source(converter_source, c 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 @@ class gnuarch_source(converter_source, c 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/'):