[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