Patrick Mézard  committed 4bbc6bf

replay: fetch full revision at most once per run (issue252)

Before this change, hgsubversion was fetching full revisions from the first
revision the project was created to the first revision containing converted
data. Unfortunately, some projects exhibits such spans longer than 500
revisions, during which hgsubversion was uselessly scanning the whole tree. The
fix is not technically perfect, we could record somewhere that while no data
was converted we scanned the project already, instead of scanning once at every
hgsubversion run until a revision is converted. But it should be good enough
unless someone runs hgsubversion once for every target revision.

One repository exhibiting this behaviour:


  • Participants
  • Parent commits 607f43a
  • Tags 1.2.1

Comments (0)

Files changed (3)

File hgsubversion/

-def convert_rev(ui, meta, svn, r, tbdelta):
+def convert_rev(ui, meta, svn, r, tbdelta, firstrun):
     editor = meta.editor
     editor.current.rev = r
-    if meta.revmap.oldest <= 0:
-        # no prior revisions are known, so fetch the entire revision contents
+    if firstrun and meta.revmap.oldest <= 0:
+        # We know nothing about this project, so fetch everything before
+        # trying to apply deltas.
         ui.debug('replay: fetching full revision\n')
         svn.get_revision(r.revnum, editor)

File hgsubversion/

             branches[branchname] = branchpath
     return branches
-def convert_rev(ui, meta, svn, r, tbdelta):
+def convert_rev(ui, meta, svn, r, tbdelta, firstrun):
     # this server fails at replay
     branches = branches_in_paths(meta, tbdelta, r.paths, r.revnum,

File hgsubversion/

             # start converting revisions
+            firstrun = True
             for r in svn.revisions(start=start, stop=stopat_rev):
                 if ( is None and
                     r.message == 'This is an empty revision for padding.'):
                         util.progress(ui, 'pull', r.revnum - start, total=total)
-                        close = pullfuns[have_replay](ui, meta, svn, r, tbdelta)
+                        close = pullfuns[have_replay](ui, meta, svn, r, tbdelta,
+                                                      firstrun)
                         meta.committags(r, close)
                         for branch, parent in close.iteritems():
                             if parent in (None, node.nullid):
                         converted = True
+                        firstrun = False
                     except svnwrap.SubversionRepoCanNotReplay, e: #pragma: no cover
                         ui.status('%s\n' % e.message)