Patchwork [3,of,5] convert: allow the sink object to be wrapped when the extension isn't loaded

mail settings
Submitter Matt Harbison
Date Nov. 26, 2017, 10:45 p.m.
Message ID <652a95c77a386d6cd994.1511736303@Envy>
Download mbox | patch
Permalink /patch/25759/
State Accepted
Headers show


Matt Harbison - Nov. 26, 2017, 10:45 p.m.
# HG changeset patch
# User Matt Harbison <>
# Date 1511726379 18000
#      Sun Nov 26 14:59:39 2017 -0500
# Node ID 652a95c77a386d6cd99480a7063d791b000229b3
# Parent  2e7c87e0755eccfc367d12d28c1597bc18e70c27
convert: allow the sink object to be wrapped when the extension isn't loaded

The next patch will wrap the conversion code, in order to write out a
requirement for 'lfs' when appropriate.  Wrapping convcmd.convertsink() in an
afterloaded callback works fine when the convert extension is enabled by the
user.  The problem here is that lfconvert uses the convert extension, whether or
not it was formally enabled by the user.

My first attempt was to have lfs install an afterloaded callback that would wrap
the convert sink if convert was loaded, or wrap lfconvert if it wasn't.  Then
the lfconvert override could install an afterloaded callback to try wrapping the
convert sink again, before calling the original lfconvert.  But that breaks down
if largefiles can't load the convert extension on the fly. [1]  Further, some
tests were failing with an error indicating that the size of the afterloaded
list changed while iterating it.

Yuya mentioned that maybe some bits of convert could be moved into core, but I'm
not sure where to draw that line.  The convertsink() method depends on the list
of sinks, which in turn depends on the sink classes.



diff --git a/hgext/convert/ b/hgext/convert/
--- a/hgext/convert/
+++ b/hgext/convert/
@@ -15,6 +15,7 @@ 
+    scmutil,
@@ -575,6 +576,7 @@ 
         ui.status(_("assuming destination %s\n") % dest)
     destc = convertsink(ui, dest, opts.get('dest_type'))
+    destc = scmutil.wrapconvertsink(destc)
         srcc, defaultsort = convertsource(ui, src, opts.get('source_type'),
diff --git a/mercurial/ b/mercurial/
--- a/mercurial/
+++ b/mercurial/
@@ -1271,3 +1271,9 @@ 
                 revrange = '%s:%s' % (minrev, maxrev)
             repo.ui.status(_('new changesets %s\n') % revrange)
+def wrapconvertsink(sink):
+    """Allow extensions to wrap the sink returned by convcmd.convertsink()
+    before it is used, whether or not the convert extension was formally loaded.
+    """
+    return sink