comparison hgext/alias.py @ 4800:6aa1fae4c28a

Add alias extension
author Brendan Cully <brendan@kublai.com>
date Wed, 04 Jul 2007 13:38:49 -0700
parents
children 244a2609c199
comparison
equal deleted inserted replaced
4799:27d5c4d51686 4800:6aa1fae4c28a
1 # Copyright (C) 2007 Brendan Cully <brendan@kublai.com>
2 # This file is published under the GNU GPL.
3
4 '''allow user-defined command aliases
5
6 To use, create entries in your hgrc of the form
7
8 [alias]
9 mycmd = cmd --args
10 '''
11
12 from mercurial.cmdutil import findcmd, UnknownCommand, AmbiguousCommand
13 from mercurial import commands
14
15 cmdtable = {}
16
17 class RecursiveCommand(Exception): pass
18
19 class lazycommand(object):
20 '''defer command lookup until needed, so that extensions loaded
21 after alias can be aliased'''
22 def __init__(self, ui, name, target):
23 self._ui = ui
24 self._name = name
25 self._target = target
26 self._cmd = None
27
28 def __len__(self):
29 self._resolve()
30 return len(self._cmd)
31
32 def __getitem__(self, key):
33 self._resolve()
34 return self._cmd[key]
35
36 def __iter__(self):
37 self._resolve()
38 return self._cmd.__iter__()
39
40 def _resolve(self):
41 if self._cmd is not None:
42 return
43
44 try:
45 self._loading = True
46 self._cmd = findcmd(self._ui, self._target)[1]
47 if self._cmd == self:
48 raise RecursiveCommand()
49 if self._target in commands.norepo.split(' '):
50 commands.norepo += ' %s' % self._name
51 return
52 except UnknownCommand:
53 msg = '*** [alias] %s: command %s is unknown' % \
54 (self._name, self._target)
55 except AmbiguousCommand:
56 msg = '*** [alias] %s: command %s is ambiguous' % \
57 (self._name, self._target)
58 except RecursiveCommand:
59 msg = '*** [alias] %s: circular dependency on %s' % \
60 (self._name, self._target)
61 def nocmd(*args, **opts):
62 self._ui.warn(msg + '\n')
63 return 1
64 nocmd.__doc__ = msg
65 self._cmd = (nocmd, [], '')
66 commands.norepo += ' %s' % self._name
67
68 def uisetup(ui):
69 for cmd, target in ui.configitems('alias'):
70 if not target:
71 ui.warn('*** [alias] %s: no definition\n' % cmd)
72 continue
73 args = target.split(' ')
74 tcmd = args.pop(0)
75 if args:
76 pui = ui.parentui or ui
77 pui.setconfig('defaults', cmd, ' '.join(args))
78 cmdtable[cmd] = lazycommand(ui, cmd, tcmd)