convert/cvs: delay CVS log parsing after initialization (
issue1581/2)
Source and destination constructors should be fast so configurations issues are
hit quickly, including authentication and filemap/authormap/splicemap issues.
Delaying might be a problem if the remove side disconnects idle connections
while the log is being read. It did not happen when converting openafs
repository, where log retrieval took at least 10mn.
--- a/hgext/convert/cvs.py Sat Apr 11 21:15:27 2009 +0200
+++ b/hgext/convert/cvs.py Sat Apr 11 21:17:11 2009 +0200
@@ -24,7 +24,7 @@
if not self.builtin:
checktool(cvspsexe)
- self.changeset = {}
+ self.changeset = None
self.files = {}
self.tags = {}
self.lastbranch = {}
@@ -34,12 +34,12 @@
self.cvsrepo = file(os.path.join(cvs, "Repository")).read()[:-1]
self.encoding = locale.getpreferredencoding()
- self._parse(ui)
self._connect()
- def _parse(self, ui):
- if self.changeset:
+ def _parse(self):
+ if self.changeset is not None:
return
+ self.changeset = {}
maxrev = 0
cmd = self.cmd
@@ -65,13 +65,13 @@
if self.builtin:
# builtin cvsps code
- ui.status(_('using builtin cvsps\n'))
+ self.ui.status(_('using builtin cvsps\n'))
- db = cvsps.createlog(ui, cache='update')
- db = cvsps.createchangeset(ui, db,
- fuzz=int(ui.config('convert', 'cvsps.fuzz', 60)),
- mergeto=ui.config('convert', 'cvsps.mergeto', None),
- mergefrom=ui.config('convert', 'cvsps.mergefrom', None))
+ db = cvsps.createlog(self.ui, cache='update')
+ db = cvsps.createchangeset(self.ui, db,
+ fuzz=int(self.ui.config('convert', 'cvsps.fuzz', 60)),
+ mergeto=self.ui.config('convert', 'cvsps.mergeto', None),
+ mergefrom=self.ui.config('convert', 'cvsps.mergefrom', None))
for cs in db:
if maxrev and cs.id>maxrev:
@@ -278,6 +278,7 @@
r = self.readp.readline()
def getheads(self):
+ self._parse()
return self.heads
def _getfile(self, name, rev):
@@ -332,6 +333,7 @@
raise util.Abort(_("unknown CVS response: %s") % line)
def getfile(self, file, rev):
+ self._parse()
data, mode = self._getfile(file, rev)
self.modecache[(file, rev)] = mode
return data
@@ -340,14 +342,18 @@
return self.modecache[(file, rev)]
def getchanges(self, rev):
+ self._parse()
self.modecache = {}
return util.sort(self.files[rev].items()), {}
def getcommit(self, rev):
+ self._parse()
return self.changeset[rev]
def gettags(self):
+ self._parse()
return self.tags
def getchangedfiles(self, rev, i):
+ self._parse()
return util.sort(self.files[rev].keys())
--- a/tests/test-convert-cvs-branch.out Sat Apr 11 21:15:27 2009 +0200
+++ b/tests/test-convert-cvs-branch.out Sat Apr 11 21:17:11 2009 +0200
@@ -23,13 +23,13 @@
% Convert
assuming destination src-hg
initializing destination src-hg repository
+connecting to cvsrepo
+scanning source...
using builtin cvsps
collecting CVS rlog
7 log entries
creating changesets
5 changeset entries
-connecting to cvsrepo
-scanning source...
sorting...
converting...
4 Initial revision
--- a/tests/test-convert-cvs-builtincvsps.out Sat Apr 11 21:15:27 2009 +0200
+++ b/tests/test-convert-cvs-builtincvsps.out Sat Apr 11 21:17:11 2009 +0200
@@ -13,13 +13,13 @@
checking in src/b/c,v
% convert fresh repo
initializing destination src-hg repository
+connecting to cvsrepo
+scanning source...
using builtin cvsps
collecting CVS rlog
5 log entries
creating changesets
3 changeset entries
-connecting to cvsrepo
-scanning source...
sorting...
converting...
2 Initial revision
@@ -31,13 +31,13 @@
c
% convert fresh repo with --filemap
initializing destination src-filemap repository
+connecting to cvsrepo
+scanning source...
using builtin cvsps
collecting CVS rlog
5 log entries
creating changesets
3 changeset entries
-connecting to cvsrepo
-scanning source...
sorting...
converting...
2 Initial revision
@@ -54,13 +54,13 @@
checking in src/a,v
checking in src/b/c,v
% convert again
+connecting to cvsrepo
+scanning source...
using builtin cvsps
collecting CVS rlog
7 log entries
creating changesets
4 changeset entries
-connecting to cvsrepo
-scanning source...
sorting...
converting...
0 ci1
@@ -70,13 +70,13 @@
c
c
% convert again with --filemap
+connecting to cvsrepo
+scanning source...
using builtin cvsps
collecting CVS rlog
7 log entries
creating changesets
4 changeset entries
-connecting to cvsrepo
-scanning source...
sorting...
converting...
0 ci1
@@ -93,13 +93,13 @@
T b/c
checking in src/b/c,v
% convert again
+connecting to cvsrepo
+scanning source...
using builtin cvsps
collecting CVS rlog
8 log entries
creating changesets
5 changeset entries
-connecting to cvsrepo
-scanning source...
sorting...
converting...
0 ci2
@@ -107,13 +107,13 @@
c
d
% convert again with --filemap
+connecting to cvsrepo
+scanning source...
using builtin cvsps
collecting CVS rlog
8 log entries
creating changesets
5 changeset entries
-connecting to cvsrepo
-scanning source...
sorting...
converting...
0 ci2
@@ -127,13 +127,13 @@
% commit a new revision with funny log message
checking in src/a,v
% convert again
+connecting to cvsrepo
+scanning source...
using builtin cvsps
collecting CVS rlog
9 log entries
creating changesets
6 changeset entries
-connecting to cvsrepo
-scanning source...
sorting...
converting...
0 funny
--- a/tests/test-convert-cvs-synthetic.out Sat Apr 11 21:15:27 2009 +0200
+++ b/tests/test-convert-cvs-synthetic.out Sat Apr 11 21:17:11 2009 +0200
@@ -34,13 +34,13 @@
new revision: 1.1.4.2; previous revision: 1.1.4.1
% convert to hg
initializing destination proj.hg repository
+connecting to *REPO*
+scanning source...
using builtin cvsps
collecting CVS rlog
9 log entries
creating changesets
4 changeset entries
-connecting to *REPO*
-scanning source...
sorting...
converting...
3 add file1 on trunk