mercurial/commands.py
changeset 2944 2efa9b8aed30
parent 2943 8e59010158ce
child 2945 731f6b3d27c2
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -3449,8 +3449,11 @@ def findext(name):
                 return sys.modules[v]
         raise KeyError(name)
 
-def load_extensions(ui, extensions):
-    for ext_name, load_from_name in extensions:
+def load_extensions(ui):
+    added = []
+    for ext_name, load_from_name in ui.extensions():
+        if ext_name in external:
+            continue
         try:
             if load_from_name:
                 # the module will be loaded in sys.modules
@@ -3470,6 +3473,7 @@ def load_extensions(ui, extensions):
                 except ImportError:
                     mod = importh(ext_name)
             external[ext_name] = mod.__name__
+            added.append((mod, ext_name))
         except (util.SignalInterrupt, KeyboardInterrupt):
             raise
         except Exception, inst:
@@ -3478,11 +3482,10 @@ def load_extensions(ui, extensions):
             if ui.print_exc():
                 return 1
 
-    for name in external.itervalues():
-        mod = sys.modules[name]
+    for mod, name in added:
         uisetup = getattr(mod, 'uisetup', None)
         if uisetup:
-            uisetup(u)
+            uisetup(ui)
         cmdtable = getattr(mod, 'cmdtable', {})
         for t in cmdtable:
             if t in table:
@@ -3495,13 +3498,12 @@ def dispatch(args):
         if num: signal.signal(num, catchterm)
 
     try:
-        u = ui.ui(traceback='--traceback' in sys.argv[1:])
+        u = ui.ui(traceback='--traceback' in sys.argv[1:],
+                  readhooks=[load_extensions])
     except util.Abort, inst:
         sys.stderr.write(_("abort: %s\n") % inst)
         return -1
 
-    load_extensions(u, u.extensions())
-
     try:
         cmd, func, args, options, cmdoptions = parse(u, args)
         if options["time"]: