##// END OF EJS Templates
dispatch: better error message for --config option
Bill Schroeder -
r9825:0d850f8b default
parent child Browse files
Show More
@@ -1,499 +1,500 b''
1 # dispatch.py - command dispatching for mercurial
1 # dispatch.py - command dispatching for mercurial
2 #
2 #
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2, incorporated herein by reference.
6 # GNU General Public License version 2, incorporated herein by reference.
7
7
8 from i18n import _
8 from i18n import _
9 import os, sys, atexit, signal, pdb, socket, errno, shlex, time
9 import os, sys, atexit, signal, pdb, socket, errno, shlex, time
10 import util, commands, hg, fancyopts, extensions, hook, error
10 import util, commands, hg, fancyopts, extensions, hook, error
11 import cmdutil, encoding
11 import cmdutil, encoding
12 import ui as _ui
12 import ui as _ui
13
13
14 def run():
14 def run():
15 "run the command in sys.argv"
15 "run the command in sys.argv"
16 sys.exit(dispatch(sys.argv[1:]))
16 sys.exit(dispatch(sys.argv[1:]))
17
17
18 def dispatch(args):
18 def dispatch(args):
19 "run the command specified in args"
19 "run the command specified in args"
20 try:
20 try:
21 u = _ui.ui()
21 u = _ui.ui()
22 if '--traceback' in args:
22 if '--traceback' in args:
23 u.setconfig('ui', 'traceback', 'on')
23 u.setconfig('ui', 'traceback', 'on')
24 except util.Abort, inst:
24 except util.Abort, inst:
25 sys.stderr.write(_("abort: %s\n") % inst)
25 sys.stderr.write(_("abort: %s\n") % inst)
26 return -1
26 return -1
27 except error.ConfigError, inst:
27 except error.ConfigError, inst:
28 sys.stderr.write(_("hg: %s\n") % inst)
28 sys.stderr.write(_("hg: %s\n") % inst)
29 return -1
29 return -1
30 return _runcatch(u, args)
30 return _runcatch(u, args)
31
31
32 def _runcatch(ui, args):
32 def _runcatch(ui, args):
33 def catchterm(*args):
33 def catchterm(*args):
34 raise error.SignalInterrupt
34 raise error.SignalInterrupt
35
35
36 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
36 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
37 num = getattr(signal, name, None)
37 num = getattr(signal, name, None)
38 if num: signal.signal(num, catchterm)
38 if num: signal.signal(num, catchterm)
39
39
40 try:
40 try:
41 try:
41 try:
42 # enter the debugger before command execution
42 # enter the debugger before command execution
43 if '--debugger' in args:
43 if '--debugger' in args:
44 pdb.set_trace()
44 pdb.set_trace()
45 try:
45 try:
46 return _dispatch(ui, args)
46 return _dispatch(ui, args)
47 finally:
47 finally:
48 ui.flush()
48 ui.flush()
49 except:
49 except:
50 # enter the debugger when we hit an exception
50 # enter the debugger when we hit an exception
51 if '--debugger' in args:
51 if '--debugger' in args:
52 pdb.post_mortem(sys.exc_info()[2])
52 pdb.post_mortem(sys.exc_info()[2])
53 ui.traceback()
53 ui.traceback()
54 raise
54 raise
55
55
56 # Global exception handling, alphabetically
56 # Global exception handling, alphabetically
57 # Mercurial-specific first, followed by built-in and library exceptions
57 # Mercurial-specific first, followed by built-in and library exceptions
58 except error.AmbiguousCommand, inst:
58 except error.AmbiguousCommand, inst:
59 ui.warn(_("hg: command '%s' is ambiguous:\n %s\n") %
59 ui.warn(_("hg: command '%s' is ambiguous:\n %s\n") %
60 (inst.args[0], " ".join(inst.args[1])))
60 (inst.args[0], " ".join(inst.args[1])))
61 except error.ConfigError, inst:
61 except error.ConfigError, inst:
62 ui.warn(_("hg: %s\n") % inst.args[0])
62 ui.warn(_("hg: %s\n") % inst.args[0])
63 except error.LockHeld, inst:
63 except error.LockHeld, inst:
64 if inst.errno == errno.ETIMEDOUT:
64 if inst.errno == errno.ETIMEDOUT:
65 reason = _('timed out waiting for lock held by %s') % inst.locker
65 reason = _('timed out waiting for lock held by %s') % inst.locker
66 else:
66 else:
67 reason = _('lock held by %s') % inst.locker
67 reason = _('lock held by %s') % inst.locker
68 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
68 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
69 except error.LockUnavailable, inst:
69 except error.LockUnavailable, inst:
70 ui.warn(_("abort: could not lock %s: %s\n") %
70 ui.warn(_("abort: could not lock %s: %s\n") %
71 (inst.desc or inst.filename, inst.strerror))
71 (inst.desc or inst.filename, inst.strerror))
72 except error.ParseError, inst:
72 except error.ParseError, inst:
73 if inst.args[0]:
73 if inst.args[0]:
74 ui.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
74 ui.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
75 commands.help_(ui, inst.args[0])
75 commands.help_(ui, inst.args[0])
76 else:
76 else:
77 ui.warn(_("hg: %s\n") % inst.args[1])
77 ui.warn(_("hg: %s\n") % inst.args[1])
78 commands.help_(ui, 'shortlist')
78 commands.help_(ui, 'shortlist')
79 except error.RepoError, inst:
79 except error.RepoError, inst:
80 ui.warn(_("abort: %s!\n") % inst)
80 ui.warn(_("abort: %s!\n") % inst)
81 except error.ResponseError, inst:
81 except error.ResponseError, inst:
82 ui.warn(_("abort: %s") % inst.args[0])
82 ui.warn(_("abort: %s") % inst.args[0])
83 if not isinstance(inst.args[1], basestring):
83 if not isinstance(inst.args[1], basestring):
84 ui.warn(" %r\n" % (inst.args[1],))
84 ui.warn(" %r\n" % (inst.args[1],))
85 elif not inst.args[1]:
85 elif not inst.args[1]:
86 ui.warn(_(" empty string\n"))
86 ui.warn(_(" empty string\n"))
87 else:
87 else:
88 ui.warn("\n%r\n" % util.ellipsis(inst.args[1]))
88 ui.warn("\n%r\n" % util.ellipsis(inst.args[1]))
89 except error.RevlogError, inst:
89 except error.RevlogError, inst:
90 ui.warn(_("abort: %s!\n") % inst)
90 ui.warn(_("abort: %s!\n") % inst)
91 except error.SignalInterrupt:
91 except error.SignalInterrupt:
92 ui.warn(_("killed!\n"))
92 ui.warn(_("killed!\n"))
93 except error.UnknownCommand, inst:
93 except error.UnknownCommand, inst:
94 ui.warn(_("hg: unknown command '%s'\n") % inst.args[0])
94 ui.warn(_("hg: unknown command '%s'\n") % inst.args[0])
95 commands.help_(ui, 'shortlist')
95 commands.help_(ui, 'shortlist')
96 except util.Abort, inst:
96 except util.Abort, inst:
97 ui.warn(_("abort: %s\n") % inst)
97 ui.warn(_("abort: %s\n") % inst)
98 except ImportError, inst:
98 except ImportError, inst:
99 m = str(inst).split()[-1]
99 m = str(inst).split()[-1]
100 ui.warn(_("abort: could not import module %s!\n") % m)
100 ui.warn(_("abort: could not import module %s!\n") % m)
101 if m in "mpatch bdiff".split():
101 if m in "mpatch bdiff".split():
102 ui.warn(_("(did you forget to compile extensions?)\n"))
102 ui.warn(_("(did you forget to compile extensions?)\n"))
103 elif m in "zlib".split():
103 elif m in "zlib".split():
104 ui.warn(_("(is your Python install correct?)\n"))
104 ui.warn(_("(is your Python install correct?)\n"))
105 except IOError, inst:
105 except IOError, inst:
106 if hasattr(inst, "code"):
106 if hasattr(inst, "code"):
107 ui.warn(_("abort: %s\n") % inst)
107 ui.warn(_("abort: %s\n") % inst)
108 elif hasattr(inst, "reason"):
108 elif hasattr(inst, "reason"):
109 try: # usually it is in the form (errno, strerror)
109 try: # usually it is in the form (errno, strerror)
110 reason = inst.reason.args[1]
110 reason = inst.reason.args[1]
111 except: # it might be anything, for example a string
111 except: # it might be anything, for example a string
112 reason = inst.reason
112 reason = inst.reason
113 ui.warn(_("abort: error: %s\n") % reason)
113 ui.warn(_("abort: error: %s\n") % reason)
114 elif hasattr(inst, "args") and inst.args[0] == errno.EPIPE:
114 elif hasattr(inst, "args") and inst.args[0] == errno.EPIPE:
115 if ui.debugflag:
115 if ui.debugflag:
116 ui.warn(_("broken pipe\n"))
116 ui.warn(_("broken pipe\n"))
117 elif getattr(inst, "strerror", None):
117 elif getattr(inst, "strerror", None):
118 if getattr(inst, "filename", None):
118 if getattr(inst, "filename", None):
119 ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
119 ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
120 else:
120 else:
121 ui.warn(_("abort: %s\n") % inst.strerror)
121 ui.warn(_("abort: %s\n") % inst.strerror)
122 else:
122 else:
123 raise
123 raise
124 except OSError, inst:
124 except OSError, inst:
125 if getattr(inst, "filename", None):
125 if getattr(inst, "filename", None):
126 ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
126 ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
127 else:
127 else:
128 ui.warn(_("abort: %s\n") % inst.strerror)
128 ui.warn(_("abort: %s\n") % inst.strerror)
129 except KeyboardInterrupt:
129 except KeyboardInterrupt:
130 try:
130 try:
131 ui.warn(_("interrupted!\n"))
131 ui.warn(_("interrupted!\n"))
132 except IOError, inst:
132 except IOError, inst:
133 if inst.errno == errno.EPIPE:
133 if inst.errno == errno.EPIPE:
134 if ui.debugflag:
134 if ui.debugflag:
135 ui.warn(_("\nbroken pipe\n"))
135 ui.warn(_("\nbroken pipe\n"))
136 else:
136 else:
137 raise
137 raise
138 except MemoryError:
138 except MemoryError:
139 ui.warn(_("abort: out of memory\n"))
139 ui.warn(_("abort: out of memory\n"))
140 except SystemExit, inst:
140 except SystemExit, inst:
141 # Commands shouldn't sys.exit directly, but give a return code.
141 # Commands shouldn't sys.exit directly, but give a return code.
142 # Just in case catch this and and pass exit code to caller.
142 # Just in case catch this and and pass exit code to caller.
143 return inst.code
143 return inst.code
144 except socket.error, inst:
144 except socket.error, inst:
145 ui.warn(_("abort: %s\n") % inst.args[-1])
145 ui.warn(_("abort: %s\n") % inst.args[-1])
146 except:
146 except:
147 ui.warn(_("** unknown exception encountered, details follow\n"))
147 ui.warn(_("** unknown exception encountered, details follow\n"))
148 ui.warn(_("** report bug details to "
148 ui.warn(_("** report bug details to "
149 "http://mercurial.selenic.com/bts/\n"))
149 "http://mercurial.selenic.com/bts/\n"))
150 ui.warn(_("** or mercurial@selenic.com\n"))
150 ui.warn(_("** or mercurial@selenic.com\n"))
151 ui.warn(_("** Mercurial Distributed SCM (version %s)\n")
151 ui.warn(_("** Mercurial Distributed SCM (version %s)\n")
152 % util.version())
152 % util.version())
153 ui.warn(_("** Extensions loaded: %s\n")
153 ui.warn(_("** Extensions loaded: %s\n")
154 % ", ".join([x[0] for x in extensions.extensions()]))
154 % ", ".join([x[0] for x in extensions.extensions()]))
155 raise
155 raise
156
156
157 return -1
157 return -1
158
158
159 def _findrepo(p):
159 def _findrepo(p):
160 while not os.path.isdir(os.path.join(p, ".hg")):
160 while not os.path.isdir(os.path.join(p, ".hg")):
161 oldp, p = p, os.path.dirname(p)
161 oldp, p = p, os.path.dirname(p)
162 if p == oldp:
162 if p == oldp:
163 return None
163 return None
164
164
165 return p
165 return p
166
166
167 def aliasargs(fn):
167 def aliasargs(fn):
168 if hasattr(fn, 'args'):
168 if hasattr(fn, 'args'):
169 return fn.args
169 return fn.args
170 return []
170 return []
171
171
172 class cmdalias(object):
172 class cmdalias(object):
173 def __init__(self, name, definition, cmdtable):
173 def __init__(self, name, definition, cmdtable):
174 self.name = name
174 self.name = name
175 self.definition = definition
175 self.definition = definition
176 self.args = []
176 self.args = []
177 self.opts = []
177 self.opts = []
178 self.help = ''
178 self.help = ''
179 self.norepo = True
179 self.norepo = True
180
180
181 try:
181 try:
182 cmdutil.findcmd(self.name, cmdtable, True)
182 cmdutil.findcmd(self.name, cmdtable, True)
183 self.shadows = True
183 self.shadows = True
184 except error.UnknownCommand:
184 except error.UnknownCommand:
185 self.shadows = False
185 self.shadows = False
186
186
187 if not self.definition:
187 if not self.definition:
188 def fn(ui, *args):
188 def fn(ui, *args):
189 ui.warn(_("no definition for alias '%s'\n") % self.name)
189 ui.warn(_("no definition for alias '%s'\n") % self.name)
190 return 1
190 return 1
191 self.fn = fn
191 self.fn = fn
192
192
193 return
193 return
194
194
195 args = shlex.split(self.definition)
195 args = shlex.split(self.definition)
196 cmd = args.pop(0)
196 cmd = args.pop(0)
197
197
198 try:
198 try:
199 self.fn, self.opts, self.help = cmdutil.findcmd(cmd, cmdtable, False)[1]
199 self.fn, self.opts, self.help = cmdutil.findcmd(cmd, cmdtable, False)[1]
200 self.args = aliasargs(self.fn) + args
200 self.args = aliasargs(self.fn) + args
201 if cmd not in commands.norepo.split(' '):
201 if cmd not in commands.norepo.split(' '):
202 self.norepo = False
202 self.norepo = False
203 except error.UnknownCommand:
203 except error.UnknownCommand:
204 def fn(ui, *args):
204 def fn(ui, *args):
205 ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \
205 ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \
206 % (self.name, cmd))
206 % (self.name, cmd))
207 return 1
207 return 1
208 self.fn = fn
208 self.fn = fn
209 except error.AmbiguousCommand:
209 except error.AmbiguousCommand:
210 def fn(ui, *args):
210 def fn(ui, *args):
211 ui.warn(_("alias '%s' resolves to ambiguous command '%s'\n") \
211 ui.warn(_("alias '%s' resolves to ambiguous command '%s'\n") \
212 % (self.name, cmd))
212 % (self.name, cmd))
213 return 1
213 return 1
214 self.fn = fn
214 self.fn = fn
215
215
216 def __call__(self, ui, *args, **opts):
216 def __call__(self, ui, *args, **opts):
217 if self.shadows:
217 if self.shadows:
218 ui.debug("alias '%s' shadows command\n" % self.name)
218 ui.debug("alias '%s' shadows command\n" % self.name)
219
219
220 return self.fn(ui, *args, **opts)
220 return self.fn(ui, *args, **opts)
221
221
222 def addaliases(ui, cmdtable):
222 def addaliases(ui, cmdtable):
223 # aliases are processed after extensions have been loaded, so they
223 # aliases are processed after extensions have been loaded, so they
224 # may use extension commands. Aliases can also use other alias definitions,
224 # may use extension commands. Aliases can also use other alias definitions,
225 # but only if they have been defined prior to the current definition.
225 # but only if they have been defined prior to the current definition.
226 for alias, definition in ui.configitems('alias'):
226 for alias, definition in ui.configitems('alias'):
227 aliasdef = cmdalias(alias, definition, cmdtable)
227 aliasdef = cmdalias(alias, definition, cmdtable)
228 cmdtable[alias] = (aliasdef, aliasdef.opts, aliasdef.help)
228 cmdtable[alias] = (aliasdef, aliasdef.opts, aliasdef.help)
229 if aliasdef.norepo:
229 if aliasdef.norepo:
230 commands.norepo += ' %s' % alias
230 commands.norepo += ' %s' % alias
231
231
232 def _parse(ui, args):
232 def _parse(ui, args):
233 options = {}
233 options = {}
234 cmdoptions = {}
234 cmdoptions = {}
235
235
236 try:
236 try:
237 args = fancyopts.fancyopts(args, commands.globalopts, options)
237 args = fancyopts.fancyopts(args, commands.globalopts, options)
238 except fancyopts.getopt.GetoptError, inst:
238 except fancyopts.getopt.GetoptError, inst:
239 raise error.ParseError(None, inst)
239 raise error.ParseError(None, inst)
240
240
241 if args:
241 if args:
242 cmd, args = args[0], args[1:]
242 cmd, args = args[0], args[1:]
243 aliases, i = cmdutil.findcmd(cmd, commands.table,
243 aliases, i = cmdutil.findcmd(cmd, commands.table,
244 ui.config("ui", "strict"))
244 ui.config("ui", "strict"))
245 cmd = aliases[0]
245 cmd = aliases[0]
246 args = aliasargs(i[0]) + args
246 args = aliasargs(i[0]) + args
247 defaults = ui.config("defaults", cmd)
247 defaults = ui.config("defaults", cmd)
248 if defaults:
248 if defaults:
249 args = map(util.expandpath, shlex.split(defaults)) + args
249 args = map(util.expandpath, shlex.split(defaults)) + args
250 c = list(i[1])
250 c = list(i[1])
251 else:
251 else:
252 cmd = None
252 cmd = None
253 c = []
253 c = []
254
254
255 # combine global options into local
255 # combine global options into local
256 for o in commands.globalopts:
256 for o in commands.globalopts:
257 c.append((o[0], o[1], options[o[1]], o[3]))
257 c.append((o[0], o[1], options[o[1]], o[3]))
258
258
259 try:
259 try:
260 args = fancyopts.fancyopts(args, c, cmdoptions, True)
260 args = fancyopts.fancyopts(args, c, cmdoptions, True)
261 except fancyopts.getopt.GetoptError, inst:
261 except fancyopts.getopt.GetoptError, inst:
262 raise error.ParseError(cmd, inst)
262 raise error.ParseError(cmd, inst)
263
263
264 # separate global options back out
264 # separate global options back out
265 for o in commands.globalopts:
265 for o in commands.globalopts:
266 n = o[1]
266 n = o[1]
267 options[n] = cmdoptions[n]
267 options[n] = cmdoptions[n]
268 del cmdoptions[n]
268 del cmdoptions[n]
269
269
270 return (cmd, cmd and i[0] or None, args, options, cmdoptions)
270 return (cmd, cmd and i[0] or None, args, options, cmdoptions)
271
271
272 def _parseconfig(ui, config):
272 def _parseconfig(ui, config):
273 """parse the --config options from the command line"""
273 """parse the --config options from the command line"""
274 for cfg in config:
274 for cfg in config:
275 try:
275 try:
276 name, value = cfg.split('=', 1)
276 name, value = cfg.split('=', 1)
277 section, name = name.split('.', 1)
277 section, name = name.split('.', 1)
278 if not section or not name:
278 if not section or not name:
279 raise IndexError
279 raise IndexError
280 ui.setconfig(section, name, value)
280 ui.setconfig(section, name, value)
281 except (IndexError, ValueError):
281 except (IndexError, ValueError):
282 raise util.Abort(_('malformed --config option: %s') % cfg)
282 raise util.Abort(_('malformed --config option: %r '
283 '(use --config section.name=value)') % cfg)
283
284
284 def _earlygetopt(aliases, args):
285 def _earlygetopt(aliases, args):
285 """Return list of values for an option (or aliases).
286 """Return list of values for an option (or aliases).
286
287
287 The values are listed in the order they appear in args.
288 The values are listed in the order they appear in args.
288 The options and values are removed from args.
289 The options and values are removed from args.
289 """
290 """
290 try:
291 try:
291 argcount = args.index("--")
292 argcount = args.index("--")
292 except ValueError:
293 except ValueError:
293 argcount = len(args)
294 argcount = len(args)
294 shortopts = [opt for opt in aliases if len(opt) == 2]
295 shortopts = [opt for opt in aliases if len(opt) == 2]
295 values = []
296 values = []
296 pos = 0
297 pos = 0
297 while pos < argcount:
298 while pos < argcount:
298 if args[pos] in aliases:
299 if args[pos] in aliases:
299 if pos + 1 >= argcount:
300 if pos + 1 >= argcount:
300 # ignore and let getopt report an error if there is no value
301 # ignore and let getopt report an error if there is no value
301 break
302 break
302 del args[pos]
303 del args[pos]
303 values.append(args.pop(pos))
304 values.append(args.pop(pos))
304 argcount -= 2
305 argcount -= 2
305 elif args[pos][:2] in shortopts:
306 elif args[pos][:2] in shortopts:
306 # short option can have no following space, e.g. hg log -Rfoo
307 # short option can have no following space, e.g. hg log -Rfoo
307 values.append(args.pop(pos)[2:])
308 values.append(args.pop(pos)[2:])
308 argcount -= 1
309 argcount -= 1
309 else:
310 else:
310 pos += 1
311 pos += 1
311 return values
312 return values
312
313
313 def runcommand(lui, repo, cmd, fullargs, ui, options, d):
314 def runcommand(lui, repo, cmd, fullargs, ui, options, d):
314 # run pre-hook, and abort if it fails
315 # run pre-hook, and abort if it fails
315 ret = hook.hook(lui, repo, "pre-%s" % cmd, False, args=" ".join(fullargs))
316 ret = hook.hook(lui, repo, "pre-%s" % cmd, False, args=" ".join(fullargs))
316 if ret:
317 if ret:
317 return ret
318 return ret
318 ret = _runcommand(ui, options, cmd, d)
319 ret = _runcommand(ui, options, cmd, d)
319 # run post-hook, passing command result
320 # run post-hook, passing command result
320 hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs),
321 hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs),
321 result = ret)
322 result = ret)
322 return ret
323 return ret
323
324
324 _loaded = set()
325 _loaded = set()
325 def _dispatch(ui, args):
326 def _dispatch(ui, args):
326 # read --config before doing anything else
327 # read --config before doing anything else
327 # (e.g. to change trust settings for reading .hg/hgrc)
328 # (e.g. to change trust settings for reading .hg/hgrc)
328 _parseconfig(ui, _earlygetopt(['--config'], args))
329 _parseconfig(ui, _earlygetopt(['--config'], args))
329
330
330 # check for cwd
331 # check for cwd
331 cwd = _earlygetopt(['--cwd'], args)
332 cwd = _earlygetopt(['--cwd'], args)
332 if cwd:
333 if cwd:
333 os.chdir(cwd[-1])
334 os.chdir(cwd[-1])
334
335
335 # read the local repository .hgrc into a local ui object
336 # read the local repository .hgrc into a local ui object
336 path = _findrepo(os.getcwd()) or ""
337 path = _findrepo(os.getcwd()) or ""
337 if not path:
338 if not path:
338 lui = ui
339 lui = ui
339 else:
340 else:
340 try:
341 try:
341 lui = ui.copy()
342 lui = ui.copy()
342 lui.readconfig(os.path.join(path, ".hg", "hgrc"))
343 lui.readconfig(os.path.join(path, ".hg", "hgrc"))
343 except IOError:
344 except IOError:
344 pass
345 pass
345
346
346 # now we can expand paths, even ones in .hg/hgrc
347 # now we can expand paths, even ones in .hg/hgrc
347 rpath = _earlygetopt(["-R", "--repository", "--repo"], args)
348 rpath = _earlygetopt(["-R", "--repository", "--repo"], args)
348 if rpath:
349 if rpath:
349 path = lui.expandpath(rpath[-1])
350 path = lui.expandpath(rpath[-1])
350 lui = ui.copy()
351 lui = ui.copy()
351 lui.readconfig(os.path.join(path, ".hg", "hgrc"))
352 lui.readconfig(os.path.join(path, ".hg", "hgrc"))
352
353
353 # Configure extensions in phases: uisetup, extsetup, cmdtable, and
354 # Configure extensions in phases: uisetup, extsetup, cmdtable, and
354 # reposetup. Programs like TortoiseHg will call _dispatch several
355 # reposetup. Programs like TortoiseHg will call _dispatch several
355 # times so we keep track of configured extensions in _loaded.
356 # times so we keep track of configured extensions in _loaded.
356 extensions.loadall(lui)
357 extensions.loadall(lui)
357 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded]
358 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded]
358
359
359 # (uisetup and extsetup are handled in extensions.loadall)
360 # (uisetup and extsetup are handled in extensions.loadall)
360
361
361 for name, module in exts:
362 for name, module in exts:
362 cmdtable = getattr(module, 'cmdtable', {})
363 cmdtable = getattr(module, 'cmdtable', {})
363 overrides = [cmd for cmd in cmdtable if cmd in commands.table]
364 overrides = [cmd for cmd in cmdtable if cmd in commands.table]
364 if overrides:
365 if overrides:
365 ui.warn(_("extension '%s' overrides commands: %s\n")
366 ui.warn(_("extension '%s' overrides commands: %s\n")
366 % (name, " ".join(overrides)))
367 % (name, " ".join(overrides)))
367 commands.table.update(cmdtable)
368 commands.table.update(cmdtable)
368 _loaded.add(name)
369 _loaded.add(name)
369
370
370 # (reposetup is handled in hg.repository)
371 # (reposetup is handled in hg.repository)
371
372
372 addaliases(lui, commands.table)
373 addaliases(lui, commands.table)
373
374
374 # check for fallback encoding
375 # check for fallback encoding
375 fallback = lui.config('ui', 'fallbackencoding')
376 fallback = lui.config('ui', 'fallbackencoding')
376 if fallback:
377 if fallback:
377 encoding.fallbackencoding = fallback
378 encoding.fallbackencoding = fallback
378
379
379 fullargs = args
380 fullargs = args
380 cmd, func, args, options, cmdoptions = _parse(lui, args)
381 cmd, func, args, options, cmdoptions = _parse(lui, args)
381
382
382 if options["config"]:
383 if options["config"]:
383 raise util.Abort(_("Option --config may not be abbreviated!"))
384 raise util.Abort(_("Option --config may not be abbreviated!"))
384 if options["cwd"]:
385 if options["cwd"]:
385 raise util.Abort(_("Option --cwd may not be abbreviated!"))
386 raise util.Abort(_("Option --cwd may not be abbreviated!"))
386 if options["repository"]:
387 if options["repository"]:
387 raise util.Abort(_(
388 raise util.Abort(_(
388 "Option -R has to be separated from other options (e.g. not -qR) "
389 "Option -R has to be separated from other options (e.g. not -qR) "
389 "and --repository may only be abbreviated as --repo!"))
390 "and --repository may only be abbreviated as --repo!"))
390
391
391 if options["encoding"]:
392 if options["encoding"]:
392 encoding.encoding = options["encoding"]
393 encoding.encoding = options["encoding"]
393 if options["encodingmode"]:
394 if options["encodingmode"]:
394 encoding.encodingmode = options["encodingmode"]
395 encoding.encodingmode = options["encodingmode"]
395 if options["time"]:
396 if options["time"]:
396 def get_times():
397 def get_times():
397 t = os.times()
398 t = os.times()
398 if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
399 if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
399 t = (t[0], t[1], t[2], t[3], time.clock())
400 t = (t[0], t[1], t[2], t[3], time.clock())
400 return t
401 return t
401 s = get_times()
402 s = get_times()
402 def print_time():
403 def print_time():
403 t = get_times()
404 t = get_times()
404 ui.warn(_("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
405 ui.warn(_("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
405 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
406 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
406 atexit.register(print_time)
407 atexit.register(print_time)
407
408
408 if options['verbose'] or options['debug'] or options['quiet']:
409 if options['verbose'] or options['debug'] or options['quiet']:
409 ui.setconfig('ui', 'verbose', str(bool(options['verbose'])))
410 ui.setconfig('ui', 'verbose', str(bool(options['verbose'])))
410 ui.setconfig('ui', 'debug', str(bool(options['debug'])))
411 ui.setconfig('ui', 'debug', str(bool(options['debug'])))
411 ui.setconfig('ui', 'quiet', str(bool(options['quiet'])))
412 ui.setconfig('ui', 'quiet', str(bool(options['quiet'])))
412 if options['traceback']:
413 if options['traceback']:
413 ui.setconfig('ui', 'traceback', 'on')
414 ui.setconfig('ui', 'traceback', 'on')
414 if options['noninteractive']:
415 if options['noninteractive']:
415 ui.setconfig('ui', 'interactive', 'off')
416 ui.setconfig('ui', 'interactive', 'off')
416
417
417 if options['help']:
418 if options['help']:
418 return commands.help_(ui, cmd, options['version'])
419 return commands.help_(ui, cmd, options['version'])
419 elif options['version']:
420 elif options['version']:
420 return commands.version_(ui)
421 return commands.version_(ui)
421 elif not cmd:
422 elif not cmd:
422 return commands.help_(ui, 'shortlist')
423 return commands.help_(ui, 'shortlist')
423
424
424 repo = None
425 repo = None
425 if cmd not in commands.norepo.split():
426 if cmd not in commands.norepo.split():
426 try:
427 try:
427 repo = hg.repository(ui, path=path)
428 repo = hg.repository(ui, path=path)
428 ui = repo.ui
429 ui = repo.ui
429 if not repo.local():
430 if not repo.local():
430 raise util.Abort(_("repository '%s' is not local") % path)
431 raise util.Abort(_("repository '%s' is not local") % path)
431 ui.setconfig("bundle", "mainreporoot", repo.root)
432 ui.setconfig("bundle", "mainreporoot", repo.root)
432 except error.RepoError:
433 except error.RepoError:
433 if cmd not in commands.optionalrepo.split():
434 if cmd not in commands.optionalrepo.split():
434 if args and not path: # try to infer -R from command args
435 if args and not path: # try to infer -R from command args
435 repos = map(_findrepo, args)
436 repos = map(_findrepo, args)
436 guess = repos[0]
437 guess = repos[0]
437 if guess and repos.count(guess) == len(repos):
438 if guess and repos.count(guess) == len(repos):
438 return _dispatch(ui, ['--repository', guess] + fullargs)
439 return _dispatch(ui, ['--repository', guess] + fullargs)
439 if not path:
440 if not path:
440 raise error.RepoError(_("There is no Mercurial repository"
441 raise error.RepoError(_("There is no Mercurial repository"
441 " here (.hg not found)"))
442 " here (.hg not found)"))
442 raise
443 raise
443 args.insert(0, repo)
444 args.insert(0, repo)
444 elif rpath:
445 elif rpath:
445 ui.warn("warning: --repository ignored\n")
446 ui.warn("warning: --repository ignored\n")
446
447
447 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
448 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
448 return runcommand(lui, repo, cmd, fullargs, ui, options, d)
449 return runcommand(lui, repo, cmd, fullargs, ui, options, d)
449
450
450 def _runcommand(ui, options, cmd, cmdfunc):
451 def _runcommand(ui, options, cmd, cmdfunc):
451 def checkargs():
452 def checkargs():
452 try:
453 try:
453 return cmdfunc()
454 return cmdfunc()
454 except error.SignatureError:
455 except error.SignatureError:
455 raise error.ParseError(cmd, _("invalid arguments"))
456 raise error.ParseError(cmd, _("invalid arguments"))
456
457
457 if options['profile']:
458 if options['profile']:
458 format = ui.config('profiling', 'format', default='text')
459 format = ui.config('profiling', 'format', default='text')
459
460
460 if not format in ['text', 'kcachegrind']:
461 if not format in ['text', 'kcachegrind']:
461 ui.warn(_("unrecognized profiling format '%s'"
462 ui.warn(_("unrecognized profiling format '%s'"
462 " - Ignored\n") % format)
463 " - Ignored\n") % format)
463 format = 'text'
464 format = 'text'
464
465
465 output = ui.config('profiling', 'output')
466 output = ui.config('profiling', 'output')
466
467
467 if output:
468 if output:
468 path = ui.expandpath(output)
469 path = ui.expandpath(output)
469 ostream = open(path, 'wb')
470 ostream = open(path, 'wb')
470 else:
471 else:
471 ostream = sys.stderr
472 ostream = sys.stderr
472
473
473 try:
474 try:
474 from mercurial import lsprof
475 from mercurial import lsprof
475 except ImportError:
476 except ImportError:
476 raise util.Abort(_(
477 raise util.Abort(_(
477 'lsprof not available - install from '
478 'lsprof not available - install from '
478 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/'))
479 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/'))
479 p = lsprof.Profiler()
480 p = lsprof.Profiler()
480 p.enable(subcalls=True)
481 p.enable(subcalls=True)
481 try:
482 try:
482 return checkargs()
483 return checkargs()
483 finally:
484 finally:
484 p.disable()
485 p.disable()
485
486
486 if format == 'kcachegrind':
487 if format == 'kcachegrind':
487 import lsprofcalltree
488 import lsprofcalltree
488 calltree = lsprofcalltree.KCacheGrind(p)
489 calltree = lsprofcalltree.KCacheGrind(p)
489 calltree.output(ostream)
490 calltree.output(ostream)
490 else:
491 else:
491 # format == 'text'
492 # format == 'text'
492 stats = lsprof.Stats(p.getstats())
493 stats = lsprof.Stats(p.getstats())
493 stats.sort()
494 stats.sort()
494 stats.pprint(top=10, file=ostream, climit=5)
495 stats.pprint(top=10, file=ostream, climit=5)
495
496
496 if output:
497 if output:
497 ostream.close()
498 ostream.close()
498 else:
499 else:
499 return checkargs()
500 return checkargs()
@@ -1,286 +1,286 b''
1 adding a
1 adding a
2 adding b
2 adding b
3 updating to branch default
3 updating to branch default
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
5 pulling from ../b
5 pulling from ../b
6 searching for changes
6 searching for changes
7 warning: repository is unrelated
7 warning: repository is unrelated
8 adding changesets
8 adding changesets
9 adding manifests
9 adding manifests
10 adding file changes
10 adding file changes
11 added 1 changesets with 1 changes to 1 files (+1 heads)
11 added 1 changesets with 1 changes to 1 files (+1 heads)
12 (run 'hg heads' to see heads, 'hg merge' to merge)
12 (run 'hg heads' to see heads, 'hg merge' to merge)
13 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
13 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
14 (branch merge, don't forget to commit)
14 (branch merge, don't forget to commit)
15 %% -R/--repository
15 %% -R/--repository
16 changeset: 0:8580ff50825a
16 changeset: 0:8580ff50825a
17 tag: tip
17 tag: tip
18 user: test
18 user: test
19 date: Thu Jan 01 00:00:01 1970 +0000
19 date: Thu Jan 01 00:00:01 1970 +0000
20 summary: a
20 summary: a
21
21
22 changeset: 0:b6c483daf290
22 changeset: 0:b6c483daf290
23 tag: tip
23 tag: tip
24 user: test
24 user: test
25 date: Thu Jan 01 00:00:01 1970 +0000
25 date: Thu Jan 01 00:00:01 1970 +0000
26 summary: b
26 summary: b
27
27
28 %% implicit -R
28 %% implicit -R
29 0: a
29 0: a
30 0: a
30 0: a
31 abort: There is no Mercurial repository here (.hg not found)!
31 abort: There is no Mercurial repository here (.hg not found)!
32 abort: a/a not under root
32 abort: a/a not under root
33 abort: There is no Mercurial repository here (.hg not found)!
33 abort: There is no Mercurial repository here (.hg not found)!
34 %% abbrev of long option
34 %% abbrev of long option
35 changeset: 1:b6c483daf290
35 changeset: 1:b6c483daf290
36 tag: tip
36 tag: tip
37 parent: -1:000000000000
37 parent: -1:000000000000
38 user: test
38 user: test
39 date: Thu Jan 01 00:00:01 1970 +0000
39 date: Thu Jan 01 00:00:01 1970 +0000
40 summary: b
40 summary: b
41
41
42 %% earlygetopt with duplicate options (36d23de02da1)
42 %% earlygetopt with duplicate options (36d23de02da1)
43 changeset: 1:b6c483daf290
43 changeset: 1:b6c483daf290
44 tag: tip
44 tag: tip
45 parent: -1:000000000000
45 parent: -1:000000000000
46 user: test
46 user: test
47 date: Thu Jan 01 00:00:01 1970 +0000
47 date: Thu Jan 01 00:00:01 1970 +0000
48 summary: b
48 summary: b
49
49
50 changeset: 0:8580ff50825a
50 changeset: 0:8580ff50825a
51 tag: tip
51 tag: tip
52 user: test
52 user: test
53 date: Thu Jan 01 00:00:01 1970 +0000
53 date: Thu Jan 01 00:00:01 1970 +0000
54 summary: a
54 summary: a
55
55
56 %% earlygetopt short option without following space
56 %% earlygetopt short option without following space
57 0:b6c483daf290
57 0:b6c483daf290
58 %% earlygetopt with illegal abbreviations
58 %% earlygetopt with illegal abbreviations
59 abort: Option --config may not be abbreviated!
59 abort: Option --config may not be abbreviated!
60 abort: Option --cwd may not be abbreviated!
60 abort: Option --cwd may not be abbreviated!
61 abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
61 abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
62 abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
62 abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
63 abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
63 abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
64 abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
64 abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
65 %% --cwd
65 %% --cwd
66 changeset: 0:8580ff50825a
66 changeset: 0:8580ff50825a
67 tag: tip
67 tag: tip
68 user: test
68 user: test
69 date: Thu Jan 01 00:00:01 1970 +0000
69 date: Thu Jan 01 00:00:01 1970 +0000
70 summary: a
70 summary: a
71
71
72 %% -y/--noninteractive - just be sure it is parsed
72 %% -y/--noninteractive - just be sure it is parsed
73 0:8580ff50825a
73 0:8580ff50825a
74 0:8580ff50825a
74 0:8580ff50825a
75 %% -q/--quiet
75 %% -q/--quiet
76 0:8580ff50825a
76 0:8580ff50825a
77 0:b6c483daf290
77 0:b6c483daf290
78 0:8580ff50825a
78 0:8580ff50825a
79 1:b6c483daf290
79 1:b6c483daf290
80 %% -v/--verbose
80 %% -v/--verbose
81 changeset: 1:b6c483daf290
81 changeset: 1:b6c483daf290
82 tag: tip
82 tag: tip
83 parent: -1:000000000000
83 parent: -1:000000000000
84 user: test
84 user: test
85 date: Thu Jan 01 00:00:01 1970 +0000
85 date: Thu Jan 01 00:00:01 1970 +0000
86 files: b
86 files: b
87 description:
87 description:
88 b
88 b
89
89
90
90
91 changeset: 0:8580ff50825a
91 changeset: 0:8580ff50825a
92 user: test
92 user: test
93 date: Thu Jan 01 00:00:01 1970 +0000
93 date: Thu Jan 01 00:00:01 1970 +0000
94 files: a
94 files: a
95 description:
95 description:
96 a
96 a
97
97
98
98
99 changeset: 0:b6c483daf290
99 changeset: 0:b6c483daf290
100 tag: tip
100 tag: tip
101 user: test
101 user: test
102 date: Thu Jan 01 00:00:01 1970 +0000
102 date: Thu Jan 01 00:00:01 1970 +0000
103 files: b
103 files: b
104 description:
104 description:
105 b
105 b
106
106
107
107
108 %% --config
108 %% --config
109 quuxfoo
109 quuxfoo
110 abort: malformed --config option:
110 abort: malformed --config option: '' (use --config section.name=value)
111 abort: malformed --config option: a.b
111 abort: malformed --config option: 'a.b' (use --config section.name=value)
112 abort: malformed --config option: a
112 abort: malformed --config option: 'a' (use --config section.name=value)
113 abort: malformed --config option: a.=
113 abort: malformed --config option: 'a.=' (use --config section.name=value)
114 abort: malformed --config option: .b=
114 abort: malformed --config option: '.b=' (use --config section.name=value)
115 %% --debug
115 %% --debug
116 changeset: 1:b6c483daf2907ce5825c0bb50f5716226281cc1a
116 changeset: 1:b6c483daf2907ce5825c0bb50f5716226281cc1a
117 tag: tip
117 tag: tip
118 parent: -1:0000000000000000000000000000000000000000
118 parent: -1:0000000000000000000000000000000000000000
119 parent: -1:0000000000000000000000000000000000000000
119 parent: -1:0000000000000000000000000000000000000000
120 manifest: 1:23226e7a252cacdc2d99e4fbdc3653441056de49
120 manifest: 1:23226e7a252cacdc2d99e4fbdc3653441056de49
121 user: test
121 user: test
122 date: Thu Jan 01 00:00:01 1970 +0000
122 date: Thu Jan 01 00:00:01 1970 +0000
123 files+: b
123 files+: b
124 extra: branch=default
124 extra: branch=default
125 description:
125 description:
126 b
126 b
127
127
128
128
129 changeset: 0:8580ff50825a50c8f716709acdf8de0deddcd6ab
129 changeset: 0:8580ff50825a50c8f716709acdf8de0deddcd6ab
130 parent: -1:0000000000000000000000000000000000000000
130 parent: -1:0000000000000000000000000000000000000000
131 parent: -1:0000000000000000000000000000000000000000
131 parent: -1:0000000000000000000000000000000000000000
132 manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
132 manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
133 user: test
133 user: test
134 date: Thu Jan 01 00:00:01 1970 +0000
134 date: Thu Jan 01 00:00:01 1970 +0000
135 files+: a
135 files+: a
136 extra: branch=default
136 extra: branch=default
137 description:
137 description:
138 a
138 a
139
139
140
140
141 %% --traceback
141 %% --traceback
142 Traceback (most recent call last):
142 Traceback (most recent call last):
143 %% --time
143 %% --time
144 Time: real x.x secs (user x.x+x.x sys x.x+x.x)
144 Time: real x.x secs (user x.x+x.x sys x.x+x.x)
145 %% --version
145 %% --version
146 Mercurial Distributed SCM (version xxx)
146 Mercurial Distributed SCM (version xxx)
147 %% -h/--help
147 %% -h/--help
148 Mercurial Distributed SCM
148 Mercurial Distributed SCM
149
149
150 list of commands:
150 list of commands:
151
151
152 add add the specified files on the next commit
152 add add the specified files on the next commit
153 addremove add all new files, delete all missing files
153 addremove add all new files, delete all missing files
154 annotate show changeset information by line for each file
154 annotate show changeset information by line for each file
155 archive create an unversioned archive of a repository revision
155 archive create an unversioned archive of a repository revision
156 backout reverse effect of earlier changeset
156 backout reverse effect of earlier changeset
157 bisect subdivision search of changesets
157 bisect subdivision search of changesets
158 branch set or show the current branch name
158 branch set or show the current branch name
159 branches list repository named branches
159 branches list repository named branches
160 bundle create a changegroup file
160 bundle create a changegroup file
161 cat output the current or given revision of files
161 cat output the current or given revision of files
162 clone make a copy of an existing repository
162 clone make a copy of an existing repository
163 commit commit the specified files or all outstanding changes
163 commit commit the specified files or all outstanding changes
164 copy mark files as copied for the next commit
164 copy mark files as copied for the next commit
165 diff diff repository (or selected files)
165 diff diff repository (or selected files)
166 export dump the header and diffs for one or more changesets
166 export dump the header and diffs for one or more changesets
167 forget forget the specified files on the next commit
167 forget forget the specified files on the next commit
168 grep search for a pattern in specified files and revisions
168 grep search for a pattern in specified files and revisions
169 heads show current repository heads or show branch heads
169 heads show current repository heads or show branch heads
170 help show help for a given topic or a help overview
170 help show help for a given topic or a help overview
171 identify identify the working copy or specified revision
171 identify identify the working copy or specified revision
172 import import an ordered set of patches
172 import import an ordered set of patches
173 incoming show new changesets found in source
173 incoming show new changesets found in source
174 init create a new repository in the given directory
174 init create a new repository in the given directory
175 locate locate files matching specific patterns
175 locate locate files matching specific patterns
176 log show revision history of entire repository or files
176 log show revision history of entire repository or files
177 manifest output the current or given revision of the project manifest
177 manifest output the current or given revision of the project manifest
178 merge merge working directory with another revision
178 merge merge working directory with another revision
179 outgoing show changesets not found in destination
179 outgoing show changesets not found in destination
180 parents show the parents of the working directory or revision
180 parents show the parents of the working directory or revision
181 paths show aliases for remote repositories
181 paths show aliases for remote repositories
182 pull pull changes from the specified source
182 pull pull changes from the specified source
183 push push changes to the specified destination
183 push push changes to the specified destination
184 recover roll back an interrupted transaction
184 recover roll back an interrupted transaction
185 remove remove the specified files on the next commit
185 remove remove the specified files on the next commit
186 rename rename files; equivalent of copy + remove
186 rename rename files; equivalent of copy + remove
187 resolve retry file merges from a merge or update
187 resolve retry file merges from a merge or update
188 revert restore individual files or directories to an earlier state
188 revert restore individual files or directories to an earlier state
189 rollback roll back the last transaction
189 rollback roll back the last transaction
190 root print the root (top) of the current working directory
190 root print the root (top) of the current working directory
191 serve export the repository via HTTP
191 serve export the repository via HTTP
192 showconfig show combined config settings from all hgrc files
192 showconfig show combined config settings from all hgrc files
193 status show changed files in the working directory
193 status show changed files in the working directory
194 summary summarize working directory state
194 summary summarize working directory state
195 tag add one or more tags for the current or given revision
195 tag add one or more tags for the current or given revision
196 tags list repository tags
196 tags list repository tags
197 tip show the tip revision
197 tip show the tip revision
198 unbundle apply one or more changegroup files
198 unbundle apply one or more changegroup files
199 update update working directory
199 update update working directory
200 verify verify the integrity of the repository
200 verify verify the integrity of the repository
201 version output version and copyright information
201 version output version and copyright information
202
202
203 additional help topics:
203 additional help topics:
204
204
205 config Configuration Files
205 config Configuration Files
206 dates Date Formats
206 dates Date Formats
207 patterns File Name Patterns
207 patterns File Name Patterns
208 environment Environment Variables
208 environment Environment Variables
209 revisions Specifying Single Revisions
209 revisions Specifying Single Revisions
210 multirevs Specifying Multiple Revisions
210 multirevs Specifying Multiple Revisions
211 diffs Diff Formats
211 diffs Diff Formats
212 templating Template Usage
212 templating Template Usage
213 urls URL Paths
213 urls URL Paths
214 extensions Using additional features
214 extensions Using additional features
215
215
216 use "hg -v help" to show aliases and global options
216 use "hg -v help" to show aliases and global options
217 Mercurial Distributed SCM
217 Mercurial Distributed SCM
218
218
219 list of commands:
219 list of commands:
220
220
221 add add the specified files on the next commit
221 add add the specified files on the next commit
222 addremove add all new files, delete all missing files
222 addremove add all new files, delete all missing files
223 annotate show changeset information by line for each file
223 annotate show changeset information by line for each file
224 archive create an unversioned archive of a repository revision
224 archive create an unversioned archive of a repository revision
225 backout reverse effect of earlier changeset
225 backout reverse effect of earlier changeset
226 bisect subdivision search of changesets
226 bisect subdivision search of changesets
227 branch set or show the current branch name
227 branch set or show the current branch name
228 branches list repository named branches
228 branches list repository named branches
229 bundle create a changegroup file
229 bundle create a changegroup file
230 cat output the current or given revision of files
230 cat output the current or given revision of files
231 clone make a copy of an existing repository
231 clone make a copy of an existing repository
232 commit commit the specified files or all outstanding changes
232 commit commit the specified files or all outstanding changes
233 copy mark files as copied for the next commit
233 copy mark files as copied for the next commit
234 diff diff repository (or selected files)
234 diff diff repository (or selected files)
235 export dump the header and diffs for one or more changesets
235 export dump the header and diffs for one or more changesets
236 forget forget the specified files on the next commit
236 forget forget the specified files on the next commit
237 grep search for a pattern in specified files and revisions
237 grep search for a pattern in specified files and revisions
238 heads show current repository heads or show branch heads
238 heads show current repository heads or show branch heads
239 help show help for a given topic or a help overview
239 help show help for a given topic or a help overview
240 identify identify the working copy or specified revision
240 identify identify the working copy or specified revision
241 import import an ordered set of patches
241 import import an ordered set of patches
242 incoming show new changesets found in source
242 incoming show new changesets found in source
243 init create a new repository in the given directory
243 init create a new repository in the given directory
244 locate locate files matching specific patterns
244 locate locate files matching specific patterns
245 log show revision history of entire repository or files
245 log show revision history of entire repository or files
246 manifest output the current or given revision of the project manifest
246 manifest output the current or given revision of the project manifest
247 merge merge working directory with another revision
247 merge merge working directory with another revision
248 outgoing show changesets not found in destination
248 outgoing show changesets not found in destination
249 parents show the parents of the working directory or revision
249 parents show the parents of the working directory or revision
250 paths show aliases for remote repositories
250 paths show aliases for remote repositories
251 pull pull changes from the specified source
251 pull pull changes from the specified source
252 push push changes to the specified destination
252 push push changes to the specified destination
253 recover roll back an interrupted transaction
253 recover roll back an interrupted transaction
254 remove remove the specified files on the next commit
254 remove remove the specified files on the next commit
255 rename rename files; equivalent of copy + remove
255 rename rename files; equivalent of copy + remove
256 resolve retry file merges from a merge or update
256 resolve retry file merges from a merge or update
257 revert restore individual files or directories to an earlier state
257 revert restore individual files or directories to an earlier state
258 rollback roll back the last transaction
258 rollback roll back the last transaction
259 root print the root (top) of the current working directory
259 root print the root (top) of the current working directory
260 serve export the repository via HTTP
260 serve export the repository via HTTP
261 showconfig show combined config settings from all hgrc files
261 showconfig show combined config settings from all hgrc files
262 status show changed files in the working directory
262 status show changed files in the working directory
263 summary summarize working directory state
263 summary summarize working directory state
264 tag add one or more tags for the current or given revision
264 tag add one or more tags for the current or given revision
265 tags list repository tags
265 tags list repository tags
266 tip show the tip revision
266 tip show the tip revision
267 unbundle apply one or more changegroup files
267 unbundle apply one or more changegroup files
268 update update working directory
268 update update working directory
269 verify verify the integrity of the repository
269 verify verify the integrity of the repository
270 version output version and copyright information
270 version output version and copyright information
271
271
272 additional help topics:
272 additional help topics:
273
273
274 config Configuration Files
274 config Configuration Files
275 dates Date Formats
275 dates Date Formats
276 patterns File Name Patterns
276 patterns File Name Patterns
277 environment Environment Variables
277 environment Environment Variables
278 revisions Specifying Single Revisions
278 revisions Specifying Single Revisions
279 multirevs Specifying Multiple Revisions
279 multirevs Specifying Multiple Revisions
280 diffs Diff Formats
280 diffs Diff Formats
281 templating Template Usage
281 templating Template Usage
282 urls URL Paths
282 urls URL Paths
283 extensions Using additional features
283 extensions Using additional features
284
284
285 use "hg -v help" to show aliases and global options
285 use "hg -v help" to show aliases and global options
286 %% not tested: --debugger
286 %% not tested: --debugger
General Comments 0
You need to be logged in to leave comments. Login now