convert/cvs: delay CVS log parsing after initialization (issue1581/2)
authorPatrick Mezard <pmezard@gmail.com>
Sat, 11 Apr 2009 21:17:11 +0200
changeset 8048 d22432bdcba1
parent 8047 04c62275cbc7
child 8051 718c8f01feb2
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.
hgext/convert/cvs.py
tests/test-convert-cvs-branch.out
tests/test-convert-cvs-builtincvsps.out
tests/test-convert-cvs-synthetic.out
--- 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