Patchwork extensions: call afterloaded() with loaded=False for disabled extensions

login
register
mail settings
Submitter Adam Simpkins
Date June 23, 2017, 6:01 p.m.
Message ID <faa49c4b833ab33dbc41.1498240912@devbig125.prn1.facebook.com>
Download mbox | patch
Permalink /patch/21635/
State Accepted
Headers show

Comments

Adam Simpkins - June 23, 2017, 6:01 p.m.
# HG changeset patch
# User Adam Simpkins <simpkins@fb.com>
# Date 1498240745 25200
#      Fri Jun 23 10:59:05 2017 -0700
# Node ID faa49c4b833ab33dbc41e90ff5b4cffd7cc70891
# Parent  2529e2ae9f4cfb49958fb9c5e5a95a39c9664f4c
extensions: call afterloaded() with loaded=False for disabled extensions

If an extension was loaded but disabled due to a minimumhgversion check it
will be present in the _extensions map, but set to None.  The rest of the
extensions code treats the extension as if it were not present in this case,
but the afterloaded() function called the callback with loaded=True.
Yuya Nishihara - June 24, 2017, 3:18 a.m.
On Fri, 23 Jun 2017 11:01:52 -0700, Adam Simpkins wrote:
> # HG changeset patch
> # User Adam Simpkins <simpkins@fb.com>
> # Date 1498240745 25200
> #      Fri Jun 23 10:59:05 2017 -0700
> # Node ID faa49c4b833ab33dbc41e90ff5b4cffd7cc70891
> # Parent  2529e2ae9f4cfb49958fb9c5e5a95a39c9664f4c
> extensions: call afterloaded() with loaded=False for disabled extensions

Looks good, queued. Thanks for adding extended tests.

Patch

diff --git a/mercurial/extensions.py b/mercurial/extensions.py
--- a/mercurial/extensions.py
+++ b/mercurial/extensions.py
@@ -257,7 +257,9 @@ 
     '''
 
     if extension in _extensions:
-        callback(loaded=True)
+        # Report loaded as False if the extension is disabled
+        loaded = (_extensions[extension] is not None)
+        callback(loaded=loaded)
     else:
         _aftercallbacks.setdefault(extension, []).append(callback)
 
diff --git a/tests/test-extensions-afterloaded.t b/tests/test-extensions-afterloaded.t
new file mode 100644
--- /dev/null
+++ b/tests/test-extensions-afterloaded.t
@@ -0,0 +1,113 @@ 
+Test the extensions.afterloaded() function
+
+  $ cat > foo.py <<EOF
+  > from mercurial import extensions
+  > def uisetup(ui):
+  >     ui.write("foo.uisetup\\n")
+  >     ui.flush()
+  >     def bar_loaded(loaded):
+  >         ui.write("foo: bar loaded: %r\\n" % (loaded,))
+  >         ui.flush()
+  >     extensions.afterloaded('bar', bar_loaded)
+  > EOF
+  $ cat > bar.py <<EOF
+  > def uisetup(ui):
+  >     ui.write("bar.uisetup\\n")
+  >     ui.flush()
+  > EOF
+  $ basepath=`pwd`
+
+  $ hg init basic
+  $ cd basic
+  $ echo foo > file
+  $ hg add file
+  $ hg commit -m 'add file'
+
+  $ echo '[extensions]' >> .hg/hgrc
+  $ echo "foo = $basepath/foo.py" >> .hg/hgrc
+  $ echo "bar = $basepath/bar.py" >> .hg/hgrc
+  $ hg log -r. -T'{rev}\n'
+  foo.uisetup
+  foo: bar loaded: True
+  bar.uisetup
+  0
+
+Test afterloaded with the opposite extension load order
+
+  $ cd ..
+  $ hg init basic_reverse
+  $ cd basic_reverse
+  $ echo foo > file
+  $ hg add file
+  $ hg commit -m 'add file'
+
+  $ echo '[extensions]' >> .hg/hgrc
+  $ echo "bar = $basepath/bar.py" >> .hg/hgrc
+  $ echo "foo = $basepath/foo.py" >> .hg/hgrc
+  $ hg log -r. -T'{rev}\n'
+  bar.uisetup
+  foo.uisetup
+  foo: bar loaded: True
+  0
+
+Test the extensions.afterloaded() function when the requested extension is not
+loaded
+
+  $ cd ..
+  $ hg init notloaded
+  $ cd notloaded
+  $ echo foo > file
+  $ hg add file
+  $ hg commit -m 'add file'
+
+  $ echo '[extensions]' >> .hg/hgrc
+  $ echo "foo = $basepath/foo.py" >> .hg/hgrc
+  $ hg log -r. -T'{rev}\n'
+  foo.uisetup
+  foo: bar loaded: False
+  0
+
+Test the extensions.afterloaded() function when the requested extension is not
+configured but fails the minimum version check
+
+  $ cd ..
+  $ cat > minvers.py <<EOF
+  > minimumhgversion = '9999.9999'
+  > def uisetup(ui):
+  >     ui.write("minvers.uisetup\\n")
+  >     ui.flush()
+  > EOF
+  $ hg init minversion
+  $ cd minversion
+  $ echo foo > file
+  $ hg add file
+  $ hg commit -m 'add file'
+
+  $ echo '[extensions]' >> .hg/hgrc
+  $ echo "foo = $basepath/foo.py" >> .hg/hgrc
+  $ echo "bar = $basepath/minvers.py" >> .hg/hgrc
+  $ hg log -r. -T'{rev}\n'
+  (third party extension bar requires version 9999.9999 or newer of Mercurial; disabling)
+  foo.uisetup
+  foo: bar loaded: False
+  0
+
+Test the extensions.afterloaded() function when the requested extension is not
+configured but fails the minimum version check, using the opposite load order
+for the two extensions.
+
+  $ cd ..
+  $ hg init minversion_reverse
+  $ cd minversion_reverse
+  $ echo foo > file
+  $ hg add file
+  $ hg commit -m 'add file'
+
+  $ echo '[extensions]' >> .hg/hgrc
+  $ echo "bar = $basepath/minvers.py" >> .hg/hgrc
+  $ echo "foo = $basepath/foo.py" >> .hg/hgrc
+  $ hg log -r. -T'{rev}\n'
+  (third party extension bar requires version 9999.9999 or newer of Mercurial; disabling)
+  foo.uisetup
+  foo: bar loaded: False
+  0