diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py --- a/mercurial/dispatch.py +++ b/mercurial/dispatch.py @@ -747,7 +747,12 @@ def _checkshellalias(lui, ui, args, prec [], {}) def _cmdattr(ui, cmd, func, attr): - return getattr(func, attr) + try: + return getattr(func, attr) + except AttributeError: + ui.deprecwarn("missing attribute '%s', use @command decorator " + "to register '%s'" % (attr, cmd), '3.8') + return False _loaded = set() diff --git a/tests/test-extension.t b/tests/test-extension.t --- a/tests/test-extension.t +++ b/tests/test-extension.t @@ -1203,6 +1203,48 @@ disabling in command line overlays with $ cd .. +Test compatibility with extension commands that don't use @command (issue5137) + + $ hg init deprecated + $ cd deprecated + + $ cat < deprecatedcmd.py + > def deprecatedcmd(repo, ui): + > pass + > cmdtable = { + > 'deprecatedcmd': (deprecatedcmd, [], ''), + > } + > EOF + $ cat < .hg/hgrc + > [extensions] + > deprecatedcmd = `pwd`/deprecatedcmd.py + > mq = ! + > hgext.mq = ! + > hgext/mq = ! + > [alias] + > deprecatedalias = deprecatedcmd + > EOF + + $ hg deprecatedcmd + devel-warn: missing attribute 'norepo', use @command decorator to register 'deprecatedcmd' + (compatibility will be dropped after Mercurial-3.8, update your code.) at: * (glob) + + $ hg deprecatedalias + devel-warn: missing attribute 'norepo', use @command decorator to register 'deprecatedalias' + (compatibility will be dropped after Mercurial-3.8, update your code.) at: * (glob) + + no warning unless command is executed: + + $ hg paths + + but mq iterates over command table: + + $ hg --config extensions.mq= paths + devel-warn: missing attribute 'norepo', use @command decorator to register 'deprecatedcmd' + (compatibility will be dropped after Mercurial-3.8, update your code.) at: * (glob) + + $ cd .. + Test synopsis and docstring extending $ hg init exthelp