##// END OF EJS Templates
Move alias into core
Brendan Cully -
r8655:21688b8a default
parent child Browse files
Show More
@@ -100,6 +100,29 b' This section describes the different sec'
100 100 Mercurial "hgrc" file, the purpose of each section, its possible
101 101 keys, and their possible values.
102 102
103 [[alias]]
104 alias::
105 Defines command aliases.
106 Aliases allow you to define your own commands in terms of other
107 commands (or aliases), optionally including arguments.
108 +
109 Alias definitions consist of lines of the form:
110 +
111 <alias> = <command> [<argument]...
112 +
113 For example, this definition:
114 +
115 latest = log --limit 5
116 +
117 creates a new command `latest` that shows only the five most recent
118 changesets. You can define subsequent aliases using earlier ones:
119 +
120 stable5 = latest -b stable
121 +
122 *Note*: It is possible to create aliases with the same names as
123 existing commands, which will then override the original
124 definitions. This is almost always a bad idea!
125
103 126 [[auth]]
104 127 auth::
105 128 Authentication credentials for HTTP authentication.
@@ -161,6 +161,74 b' def _findrepo(p):'
161 161
162 162 return p
163 163
164 def aliasargs(fn):
165 if hasattr(fn, 'args'):
166 return fn.args
167 return []
168
169 class cmdalias(object):
170 def __init__(self, name, definition, cmdtable):
171 self.name = name
172 self.definition = definition
173 self.args = []
174 self.opts = []
175 self.help = ''
176 self.norepo = True
177
178 try:
179 cmdutil.findcmd(self.name, cmdtable, True)
180 self.shadows = True
181 except error.UnknownCommand:
182 self.shadows = False
183
184 if not self.definition:
185 def fn(ui, *args):
186 ui.warn(_("no definition for alias '%s'\n") % self.name)
187 return 1
188 self.fn = fn
189
190 return
191
192 args = shlex.split(self.definition)
193 cmd = args.pop(0)
194 opts = []
195 help = ''
196
197 try:
198 self.fn, self.opts, self.help = cmdutil.findcmd(cmd, cmdtable, False)[1]
199 self.args = aliasargs(self.fn) + args
200 if cmd not in commands.norepo.split(' '):
201 self.norepo = False
202 except error.UnknownCommand:
203 def fn(ui, *args):
204 ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \
205 % (self.name, cmd))
206 return 1
207 self.fn = fn
208 except error.AmbiguousCommand:
209 def fn(ui, *args):
210 ui.warn(_("alias '%s' resolves to ambiguous command '%s'\n") \
211 % (self.name, cmd))
212 return 1
213 self.fn = fn
214
215 def __call__(self, ui, *args, **opts):
216 if self.shadows:
217 ui.debug(_("alias '%s' shadows command\n") % self.name)
218
219 return self.fn(ui, *args, **opts)
220
221 def addaliases(ui, cmdtable):
222 # aliases are processed after extensions have been loaded, so they
223 # may use extension commands. Aliases can also use other alias definitions,
224 # but only if they have been defined prior to the current definition.
225 for alias, definition in ui.configitems('alias'):
226 aliasdef = cmdalias(alias, definition, cmdtable)
227
228 cmdtable[alias] = (aliasdef, aliasdef.opts, aliasdef.help)
229 if aliasdef.norepo:
230 commands.norepo += ' %s' % alias
231
164 232 def _parse(ui, args):
165 233 options = {}
166 234 cmdoptions = {}
@@ -175,6 +243,7 b' def _parse(ui, args):'
175 243 aliases, i = cmdutil.findcmd(cmd, commands.table,
176 244 ui.config("ui", "strict"))
177 245 cmd = aliases[0]
246 args = aliasargs(i[0]) + args
178 247 defaults = ui.config("defaults", cmd)
179 248 if defaults:
180 249 args = shlex.split(defaults) + args
@@ -301,6 +370,9 b' def _dispatch(ui, args):'
301 370 % (name, " ".join(overrides)))
302 371 commands.table.update(cmdtable)
303 372 _loaded.add(name)
373
374 addaliases(lui, commands.table)
375
304 376 # check for fallback encoding
305 377 fallback = lui.config('ui', 'fallbackencoding')
306 378 if fallback:
@@ -1,18 +1,17 b''
1 1 #!/bin/sh
2 2
3 3 cat >> $HGRCPATH <<EOF
4 [extensions]
5 alias=
6
7 4 [alias]
8 5 myinit = init
9 6 cleanstatus = status -c
10 7 unknown = bargle
11 8 ambiguous = s
12 9 recursive = recursive
10 nodefinition =
13 11 mylog = log
14 12 lognull = log -r null
15 13 shortlog = log --template '{rev} {node|short} | {date|isodate}\n'
14 dln = lognull --debug
16 15
17 16 [defaults]
18 17 mylog = -q
@@ -32,6 +31,9 b' hg ambiguous'
32 31 echo '% recursive'
33 32 hg recursive
34 33
34 echo '% no definition'
35 hg nodef
36
35 37 cd alias
36 38 echo foo > foo
37 39 hg ci -Amfoo
@@ -45,3 +47,6 b' hg shortlog'
45 47 echo '% interaction with defaults'
46 48 hg mylog
47 49 hg lognull
50
51 echo '% properly recursive'
52 hg dln
@@ -1,10 +1,12 b''
1 1 % basic
2 2 % unknown
3 *** [alias] unknown: command bargle is unknown
3 alias 'unknown' resolves to unknown command 'bargle'
4 4 % ambiguous
5 *** [alias] ambiguous: command s is ambiguous
5 alias 'ambiguous' resolves to ambiguous command 's'
6 6 % recursive
7 *** [alias] recursive: circular dependency on recursive
7 alias 'recursive' resolves to unknown command 'recursive'
8 % no definition
9 no definition for alias 'nodefinition'
8 10 adding foo
9 11 % with opts
10 12 C foo
@@ -13,3 +15,12 b' 0 e63c23eaa88a | 1970-01-01 00:00 +0000'
13 15 % interaction with defaults
14 16 0:e63c23eaa88a
15 17 -1:000000000000
18 % properly recursive
19 changeset: -1:0000000000000000000000000000000000000000
20 parent: -1:0000000000000000000000000000000000000000
21 parent: -1:0000000000000000000000000000000000000000
22 manifest: -1:0000000000000000000000000000000000000000
23 user:
24 date: Thu Jan 01 00:00:00 1970 +0000
25 extra: branch=default
26
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now