convert: allow the sink object to be wrapped when the extension isn't loaded
authorMatt Harbison <matt_harbison@yahoo.com>
Sun, 26 Nov 2017 14:59:39 -0500
changeset 35177 9700cb9df140
parent 35176 671aba341d90
child 35178 f8f939a2926c
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. [1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-November/108038.html
hgext/convert/convcmd.py
mercurial/scmutil.py
--- a/hgext/convert/convcmd.py	Wed Nov 22 20:49:01 2017 -0500
+++ b/hgext/convert/convcmd.py	Sun Nov 26 14:59:39 2017 -0500
@@ -15,6 +15,7 @@
     encoding,
     error,
     hg,
+    scmutil,
     util,
 )
 
@@ -575,6 +576,7 @@
         ui.status(_("assuming destination %s\n") % dest)
 
     destc = convertsink(ui, dest, opts.get('dest_type'))
+    destc = scmutil.wrapconvertsink(destc)
 
     try:
         srcc, defaultsort = convertsource(ui, src, opts.get('source_type'),
--- a/mercurial/scmutil.py	Wed Nov 22 20:49:01 2017 -0500
+++ b/mercurial/scmutil.py	Sun Nov 26 14:59:39 2017 -0500
@@ -1279,3 +1279,9 @@
             else:
                 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