Commits

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:

svn://svn.zankasoftware.com/zanka

Comments (0)

Files changed (3)

hgsubversion/replay.py

             else:
                 current.delete(path)
 
-def convert_rev(ui, meta, svn, r, tbdelta):
+def convert_rev(ui, meta, svn, r, tbdelta, firstrun):
 
     editor = meta.editor
     editor.current.clear()
     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)
     else:

hgsubversion/stupid.py

             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,

hgsubversion/wrappers.py

     try:
         try:
             # start converting revisions
+            firstrun = True
             for r in svn.revisions(start=start, stop=stopat_rev):
                 if (r.author is None and
                     r.message == 'This is an empty revision for padding.'):
                         util.progress(ui, 'pull', r.revnum - start, total=total)
 
                         meta.save_tbdelta(tbdelta)
-                        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):
 
                         meta.save()
                         converted = True
+                        firstrun = False
 
                     except svnwrap.SubversionRepoCanNotReplay, e: #pragma: no cover
                         ui.status('%s\n' % e.message)