alias.py
80 lines
| 2.4 KiB
| text/x-python
|
PythonLexer
/ hgext / alias.py
Brendan Cully
|
r4801 | # Copyright (C) 2007 Brendan Cully <brendan@kublai.com> | ||
# This file is published under the GNU GPL. | ||||
'''allow user-defined command aliases | ||||
To use, create entries in your hgrc of the form | ||||
[alias] | ||||
mycmd = cmd --args | ||||
''' | ||||
Martin Geisler
|
r6954 | from mercurial.i18n import _ | ||
Matt Mackall
|
r7643 | from mercurial import commands, cmdutil, error | ||
Brendan Cully
|
r4801 | |||
cmdtable = {} | ||||
class RecursiveCommand(Exception): pass | ||||
class lazycommand(object): | ||||
'''defer command lookup until needed, so that extensions loaded | ||||
after alias can be aliased''' | ||||
def __init__(self, ui, name, target): | ||||
self._ui = ui | ||||
self._name = name | ||||
self._target = target | ||||
self._cmd = None | ||||
def __len__(self): | ||||
self._resolve() | ||||
return len(self._cmd) | ||||
def __getitem__(self, key): | ||||
self._resolve() | ||||
return self._cmd[key] | ||||
def __iter__(self): | ||||
self._resolve() | ||||
return self._cmd.__iter__() | ||||
def _resolve(self): | ||||
if self._cmd is not None: | ||||
return | ||||
try: | ||||
Matt Mackall
|
r7643 | self._cmd = cmdutil.findcmd(self._target, commands.table, False)[1] | ||
Brendan Cully
|
r4801 | if self._cmd == self: | ||
raise RecursiveCommand() | ||||
if self._target in commands.norepo.split(' '): | ||||
commands.norepo += ' %s' % self._name | ||||
return | ||||
Matt Mackall
|
r7643 | except error.UnknownCommand: | ||
Martin Geisler
|
r6954 | msg = _('*** [alias] %s: command %s is unknown') % \ | ||
Brendan Cully
|
r4801 | (self._name, self._target) | ||
Matt Mackall
|
r7643 | except error.AmbiguousCommand: | ||
Martin Geisler
|
r6954 | msg = _('*** [alias] %s: command %s is ambiguous') % \ | ||
Brendan Cully
|
r4801 | (self._name, self._target) | ||
except RecursiveCommand: | ||||
Martin Geisler
|
r6954 | msg = _('*** [alias] %s: circular dependency on %s') % \ | ||
Brendan Cully
|
r4801 | (self._name, self._target) | ||
def nocmd(*args, **opts): | ||||
self._ui.warn(msg + '\n') | ||||
return 1 | ||||
nocmd.__doc__ = msg | ||||
self._cmd = (nocmd, [], '') | ||||
commands.norepo += ' %s' % self._name | ||||
def uisetup(ui): | ||||
for cmd, target in ui.configitems('alias'): | ||||
if not target: | ||||
Martin Geisler
|
r6954 | ui.warn(_('*** [alias] %s: no definition\n') % cmd) | ||
Brendan Cully
|
r4801 | continue | ||
Benoit Boissinot
|
r8519 | args = target.split(' ', 1) | ||
Brendan Cully
|
r4801 | tcmd = args.pop(0) | ||
if args: | ||||
Benoit Boissinot
|
r8519 | args = args[0] | ||
Benoit Boissinot
|
r8477 | defaults = ui.config('defaults', cmd) | ||
if defaults: | ||||
Benoit Boissinot
|
r8519 | args = ' '.join((args, defaults)) | ||
ui.setconfig('defaults', cmd, args) | ||||
Brendan Cully
|
r4801 | cmdtable[cmd] = lazycommand(ui, cmd, tcmd) | ||