dispatch: don't rewrap aliases that have the same definition stable
authorIdan Kamara <idankk86@gmail.com>
Thu, 04 Aug 2011 19:41:23 +0300
branchstable
changeset 15019 f4b7be3f8430
parent 15018 e89f62dcd723
child 15024 0f1311e829c9
dispatch: don't rewrap aliases that have the same definition Previously aliases that overrode existing commands would wrap the old alias on every call to dispatch() (twice actually), which is an obvious re-entrancy issue for things like the command server or TortoiseHG.
mercurial/dispatch.py
--- a/mercurial/dispatch.py	Thu Aug 04 02:51:29 2011 +0200
+++ b/mercurial/dispatch.py	Thu Aug 04 19:41:23 2011 +0300
@@ -354,6 +354,15 @@
     # but only if they have been defined prior to the current definition.
     for alias, definition in ui.configitems('alias'):
         aliasdef = cmdalias(alias, definition, cmdtable)
+
+        try:
+            olddef = cmdtable[aliasdef.cmd][0]
+            if olddef.definition == aliasdef.definition:
+                continue
+        except (KeyError, AttributeError):
+            # definition might not exist or it might not be a cmdalias
+            pass
+
         cmdtable[aliasdef.cmd] = (aliasdef, aliasdef.opts, aliasdef.help)
         if aliasdef.norepo:
             commands.norepo += ' %s' % alias