##// END OF EJS Templates
extensions: prohibit registration of command without using @command (API)...
Yuya Nishihara -
r32342:e5fbf968 default
parent child Browse files
Show More
@@ -118,6 +118,20 b' def _reportimporterror(ui, err, failed, '
118 if ui.debugflag:
118 if ui.debugflag:
119 ui.traceback()
119 ui.traceback()
120
120
121 # attributes set by registrar.command
122 _cmdfuncattrs = ('norepo', 'optionalrepo', 'inferrepo')
123
124 def _validatecmdtable(cmdtable):
125 """Check if extension commands have required attributes"""
126 for c, e in cmdtable.iteritems():
127 f = e[0]
128 missing = [a for a in _cmdfuncattrs if not util.safehasattr(f, a)]
129 if not missing:
130 continue
131 raise error.ProgrammingError(
132 'missing attributes: %s' % ', '.join(missing),
133 hint="use @command decorator to register '%s'" % c)
134
121 def load(ui, name, path):
135 def load(ui, name, path):
122 if name.startswith('hgext.') or name.startswith('hgext/'):
136 if name.startswith('hgext.') or name.startswith('hgext/'):
123 shortname = name[6:]
137 shortname = name[6:]
@@ -139,6 +153,7 b' def load(ui, name, path):'
139 ui.warn(_('(third party extension %s requires version %s or newer '
153 ui.warn(_('(third party extension %s requires version %s or newer '
140 'of Mercurial; disabling)\n') % (shortname, minver))
154 'of Mercurial; disabling)\n') % (shortname, minver))
141 return
155 return
156 _validatecmdtable(getattr(mod, 'cmdtable', {}))
142
157
143 _extensions[shortname] = mod
158 _extensions[shortname] = mod
144 _order.append(shortname)
159 _order.append(shortname)
@@ -1534,6 +1534,40 b' disabling in command line overlays with '
1534
1534
1535 $ cd ..
1535 $ cd ..
1536
1536
1537 Prohibit registration of commands that don't use @command (issue5137)
1538
1539 $ hg init deprecated
1540 $ cd deprecated
1541
1542 $ cat <<EOF > deprecatedcmd.py
1543 > def deprecatedcmd(repo, ui):
1544 > pass
1545 > cmdtable = {
1546 > 'deprecatedcmd': (deprecatedcmd, [], ''),
1547 > }
1548 > EOF
1549 $ cat <<EOF > .hg/hgrc
1550 > [extensions]
1551 > deprecatedcmd = `pwd`/deprecatedcmd.py
1552 > mq = !
1553 > hgext.mq = !
1554 > hgext/mq = !
1555 > EOF
1556
1557 $ hg deprecatedcmd > /dev/null
1558 *** failed to import extension deprecatedcmd from $TESTTMP/deprecated/deprecatedcmd.py: missing attributes: norepo, optionalrepo, inferrepo
1559 *** (use @command decorator to register 'deprecatedcmd')
1560 hg: unknown command 'deprecatedcmd'
1561 [255]
1562
1563 the extension shouldn't be loaded at all so the mq works:
1564
1565 $ hg qseries --config extensions.mq= > /dev/null
1566 *** failed to import extension deprecatedcmd from $TESTTMP/deprecated/deprecatedcmd.py: missing attributes: norepo, optionalrepo, inferrepo
1567 *** (use @command decorator to register 'deprecatedcmd')
1568
1569 $ cd ..
1570
1537 Test synopsis and docstring extending
1571 Test synopsis and docstring extending
1538
1572
1539 $ hg init exthelp
1573 $ hg init exthelp
General Comments 0
You need to be logged in to leave comments. Login now