|
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) |