[PATCH 3 of 9] chgserve: pre-import extensions

Jun Wu quark at fb.com
Sun Nov 13 16:55:47 EST 2016


# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1479070477 0
#      Sun Nov 13 20:54:37 2016 +0000
# Node ID 70611a6b45d51ba4bf560c2cfdb8d94e08a3dc8f
# Parent  ca7a76135db4a9b8a90665c8a42013debbdae3b7
chgserve: pre-import extensions

This patch makes chgserve pre-import extensions. It assumes that
pre-importing extensions does not have side effects.

diff --git a/mercurial/chgserver.py b/mercurial/chgserver.py
--- a/mercurial/chgserver.py
+++ b/mercurial/chgserver.py
@@ -73,4 +73,26 @@ testedwith = 'ships-with-hg-core'
 _log = commandserver.log
 
+_preimported = {} # {(name, path): mod}
+
+def _preimportextensions(ui):
+    for name, path in ui.configitems('extensions'):
+        # do not pre-import disabled extensions
+        if path.startswith('!'):
+            continue
+        try:
+            mod = extensions._importext(name, path)
+        except ImportError:
+            pass
+        else:
+            _preimported[(name, path)] = mod
+            ui.debug('chg: pre-imported %s\n' % name)
+
+def _importext(orig, name, path=None, reportfunc=None):
+    mod = _preimported.get((name, path))
+    if mod:
+        return mod
+    else:
+        return orig(name, path, reportfunc)
+
 def _hashlist(items):
     """return sha1 hexdigest for a list"""
@@ -646,4 +668,5 @@ def uisetup(ui):
 def _runchgservice(args):
     ui = uimod.ui()
+    _preimportextensions(ui)
 
     addresses = dispatch._earlygetopt(['--address'], args)
@@ -662,3 +685,4 @@ def _runchgservice(args):
 
 def run():
+    extensions.wrapfunction(extensions, '_importext', _importext)
     sys.exit(_runchgservice(sys.argv[1:]))


More information about the Mercurial-devel mailing list