[PATCH 3 of 3] Fetch revision log on demand (in batches of 50 revisions)

Brendan Cully brendan at kublai.com
Sun Jul 1 12:39:05 CDT 2007


# HG changeset patch
# User Brendan Cully <brendan at kublai.com>
# Date 1183272846 25200
# Node ID 0321ac232e00294699befeb37e98416d7e355a28
# Parent  fd573e1754ec703670e1404fde38d403bd5df27e
Fetch revision log on demand (in batches of 50 revisions)

diff --git a/series b/series
--- a/series
+++ b/series
@@ -6,6 +6,7 @@
 ./svn/enh-add-svn-transport.patch
 ./svn/enh-add-svn-converter.patch
 ./svn/compat-1.4.3.patch
+./svn/demand-log
 
 # CVS stuff for some projects
 ./generic/enh-add-parent-to-puttags.patch #+review
diff --git a/svn/demand-log b/svn/demand-log
new file mode 100644
--- /dev/null
+++ b/svn/demand-log
@@ -0,0 +1,82 @@
+fetch log on demand, in batches of 50 revisions
+
+diff --git a/hgext/convert/subversion.py b/hgext/convert/subversion.py
+--- a/hgext/convert/subversion.py
++++ b/hgext/convert/subversion.py
+@@ -106,14 +106,12 @@ class convert_svn(converter_source):
+         dirent = svn.ra.stat(self.ra, self.module, latest)
+         self.last_changed = dirent.created_rev
+ 
+-        self.head = (u"svn:%s%s@%s" % (self.uuid, self.module, self.last_changed)).decode(self.encoding)
++        self.head = self.rev(self.last_changed)
+         # print "head is" + self.head
+ 
+-        # Should lazily fetch revisions in batches of, say, 1,000...:
+-        self._fetch_revisions(from_revnum=self.last_changed, to_revnum=0)
+-        # self._parse()
+-        # self._connect()
+-            
++    def rev(self, revnum):
++        return (u"svn:%s%s@%s" % (self.uuid, self.module, revnum)).decode(self.encoding)
++        
+     def get_blacklist(self):
+         """Avoid certain revision numbers.
+         It is not uncommon for two nearby revisions to cancel each other
+@@ -139,9 +137,7 @@ class convert_svn(converter_source):
+         svn.ra.reparent(self.ra, svn_url.encode(self.encoding))
+ 
+     def _fetch_revisions(self, from_revnum = 0, to_revnum = 347, pb=None):
+-        
+-        self.parent_cset = None
+-        self.child_cset = None
++        self.ui.write('fetching revisions %d to %d\n' % (from_revnum, to_revnum))
+ 
+         def get_entry_from_path(path, module=self.module):
+             # Given the repository url of this wc, say
+@@ -186,11 +182,9 @@ class convert_svn(converter_source):
+             copyfrom = {} # Map of entrypath, revision for finding source of deleted revisions.
+             copies = {}
+             entries = []
+-            self.ui.debug("parsing evision %d\n" % revnum)
++            self.ui.debug("parsing revision %d\n" % revnum)
+             if orig_paths is not None:
+-                if revnum in (4380, 6907, 6940):
+-                    print orig_paths
+-                rev = (u"svn:%s%s@%s" % (self.uuid, self.module, revnum)).decode(self.encoding)
++                rev = self.rev(revnum)
+                 try:
+                     branch = self.module.split("/")[-1]
+                 except IndexError:
+@@ -383,10 +377,9 @@ class convert_svn(converter_source):
+                         copies=copies,
+                         branch=branch)
+ 
+-                if self.child_cset is not None:
+-                    self.child_cset.parents = [rev]
+-
+-                self.child_cset = cset
++                if revnum > 0:
++                    cset.parents = [self.rev(revnum - 1)]
++
+                 self.commits[rev] = cset
+ 
+         try:
+@@ -406,7 +399,6 @@ class convert_svn(converter_source):
+     def getheads(self):
+         # svn-url at rev
+         # Not safe if someone committed:
+-        # self.heads = [self.parent_cset]
+         self.heads = [self.head]
+         # print self.commits.keys()
+         return self.heads
+@@ -454,6 +446,10 @@ class convert_svn(converter_source):
+         return cl
+ 
+     def getcommit(self, rev):
++        if rev not in self.commits:
++            revnum = int(rev.split('@')[-1])
++            minrev = revnum - 50 > 0 and revnum - 50 or 0
++            self._fetch_revisions(from_revnum=revnum, to_revnum=minrev)
+         return self.commits[rev]
+ 
+     def gettags(self):


More information about the Mercurial-devel mailing list