# HG changeset patch # User Yuya Nishihara # Date 1452347186 -32400 # Node ID 38dc3f28f478cf1e8a0a79a158be6eba0bc7aca5 # Parent 527cf881d000b2f963ca6eda0904e7f4e8bb0d9f dispatch: show deprecation warning if command has no attributes (issue5137) norepo/optionalrepo/inferrepo were removed by aa73d6a5d9ea, which would be significant API change. This patch tries to avoid crash even if ancient third-party extensions are enabled. diff -r 527cf881d000 -r 38dc3f28f478 mercurial/dispatch.py --- a/mercurial/dispatch.py Mon Mar 14 00:14:43 2016 +0900 +++ b/mercurial/dispatch.py Sat Jan 09 22:46:26 2016 +0900 @@ -747,7 +747,12 @@ [], {}) 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 -r 527cf881d000 -r 38dc3f28f478 tests/test-extension.t --- a/tests/test-extension.t Mon Mar 14 00:14:43 2016 +0900 +++ b/tests/test-extension.t Sat Jan 09 22:46:26 2016 +0900 @@ -1203,6 +1203,48 @@ $ 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