##// END OF EJS Templates
dispatch: add fail-* family of hooks...
Jordi Gutiérrez Hermoso -
r29129:e6dfb0e4 default
parent child Browse files
Show More
@@ -1,1088 +1,1094 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 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from __future__ import absolute_import, print_function
8 from __future__ import absolute_import, print_function
9
9
10 import atexit
10 import atexit
11 import difflib
11 import difflib
12 import errno
12 import errno
13 import os
13 import os
14 import pdb
14 import pdb
15 import re
15 import re
16 import shlex
16 import shlex
17 import signal
17 import signal
18 import socket
18 import socket
19 import sys
19 import sys
20 import time
20 import time
21 import traceback
21 import traceback
22
22
23
23
24 from .i18n import _
24 from .i18n import _
25
25
26 from . import (
26 from . import (
27 cmdutil,
27 cmdutil,
28 commands,
28 commands,
29 demandimport,
29 demandimport,
30 encoding,
30 encoding,
31 error,
31 error,
32 extensions,
32 extensions,
33 fancyopts,
33 fancyopts,
34 fileset,
34 fileset,
35 hg,
35 hg,
36 hook,
36 hook,
37 revset,
37 revset,
38 templatefilters,
38 templatefilters,
39 templatekw,
39 templatekw,
40 templater,
40 templater,
41 ui as uimod,
41 ui as uimod,
42 util,
42 util,
43 )
43 )
44
44
45 class request(object):
45 class request(object):
46 def __init__(self, args, ui=None, repo=None, fin=None, fout=None,
46 def __init__(self, args, ui=None, repo=None, fin=None, fout=None,
47 ferr=None):
47 ferr=None):
48 self.args = args
48 self.args = args
49 self.ui = ui
49 self.ui = ui
50 self.repo = repo
50 self.repo = repo
51
51
52 # input/output/error streams
52 # input/output/error streams
53 self.fin = fin
53 self.fin = fin
54 self.fout = fout
54 self.fout = fout
55 self.ferr = ferr
55 self.ferr = ferr
56
56
57 def run():
57 def run():
58 "run the command in sys.argv"
58 "run the command in sys.argv"
59 sys.exit((dispatch(request(sys.argv[1:])) or 0) & 255)
59 sys.exit((dispatch(request(sys.argv[1:])) or 0) & 255)
60
60
61 def _getsimilar(symbols, value):
61 def _getsimilar(symbols, value):
62 sim = lambda x: difflib.SequenceMatcher(None, value, x).ratio()
62 sim = lambda x: difflib.SequenceMatcher(None, value, x).ratio()
63 # The cutoff for similarity here is pretty arbitrary. It should
63 # The cutoff for similarity here is pretty arbitrary. It should
64 # probably be investigated and tweaked.
64 # probably be investigated and tweaked.
65 return [s for s in symbols if sim(s) > 0.6]
65 return [s for s in symbols if sim(s) > 0.6]
66
66
67 def _reportsimilar(write, similar):
67 def _reportsimilar(write, similar):
68 if len(similar) == 1:
68 if len(similar) == 1:
69 write(_("(did you mean %s?)\n") % similar[0])
69 write(_("(did you mean %s?)\n") % similar[0])
70 elif similar:
70 elif similar:
71 ss = ", ".join(sorted(similar))
71 ss = ", ".join(sorted(similar))
72 write(_("(did you mean one of %s?)\n") % ss)
72 write(_("(did you mean one of %s?)\n") % ss)
73
73
74 def _formatparse(write, inst):
74 def _formatparse(write, inst):
75 similar = []
75 similar = []
76 if isinstance(inst, error.UnknownIdentifier):
76 if isinstance(inst, error.UnknownIdentifier):
77 # make sure to check fileset first, as revset can invoke fileset
77 # make sure to check fileset first, as revset can invoke fileset
78 similar = _getsimilar(inst.symbols, inst.function)
78 similar = _getsimilar(inst.symbols, inst.function)
79 if len(inst.args) > 1:
79 if len(inst.args) > 1:
80 write(_("hg: parse error at %s: %s\n") %
80 write(_("hg: parse error at %s: %s\n") %
81 (inst.args[1], inst.args[0]))
81 (inst.args[1], inst.args[0]))
82 if (inst.args[0][0] == ' '):
82 if (inst.args[0][0] == ' '):
83 write(_("unexpected leading whitespace\n"))
83 write(_("unexpected leading whitespace\n"))
84 else:
84 else:
85 write(_("hg: parse error: %s\n") % inst.args[0])
85 write(_("hg: parse error: %s\n") % inst.args[0])
86 _reportsimilar(write, similar)
86 _reportsimilar(write, similar)
87 if inst.hint:
87 if inst.hint:
88 write(_("(%s)\n") % inst.hint)
88 write(_("(%s)\n") % inst.hint)
89
89
90 def dispatch(req):
90 def dispatch(req):
91 "run the command specified in req.args"
91 "run the command specified in req.args"
92 if req.ferr:
92 if req.ferr:
93 ferr = req.ferr
93 ferr = req.ferr
94 elif req.ui:
94 elif req.ui:
95 ferr = req.ui.ferr
95 ferr = req.ui.ferr
96 else:
96 else:
97 ferr = sys.stderr
97 ferr = sys.stderr
98
98
99 try:
99 try:
100 if not req.ui:
100 if not req.ui:
101 req.ui = uimod.ui()
101 req.ui = uimod.ui()
102 if '--traceback' in req.args:
102 if '--traceback' in req.args:
103 req.ui.setconfig('ui', 'traceback', 'on', '--traceback')
103 req.ui.setconfig('ui', 'traceback', 'on', '--traceback')
104
104
105 # set ui streams from the request
105 # set ui streams from the request
106 if req.fin:
106 if req.fin:
107 req.ui.fin = req.fin
107 req.ui.fin = req.fin
108 if req.fout:
108 if req.fout:
109 req.ui.fout = req.fout
109 req.ui.fout = req.fout
110 if req.ferr:
110 if req.ferr:
111 req.ui.ferr = req.ferr
111 req.ui.ferr = req.ferr
112 except error.Abort as inst:
112 except error.Abort as inst:
113 ferr.write(_("abort: %s\n") % inst)
113 ferr.write(_("abort: %s\n") % inst)
114 if inst.hint:
114 if inst.hint:
115 ferr.write(_("(%s)\n") % inst.hint)
115 ferr.write(_("(%s)\n") % inst.hint)
116 return -1
116 return -1
117 except error.ParseError as inst:
117 except error.ParseError as inst:
118 _formatparse(ferr.write, inst)
118 _formatparse(ferr.write, inst)
119 return -1
119 return -1
120
120
121 msg = ' '.join(' ' in a and repr(a) or a for a in req.args)
121 msg = ' '.join(' ' in a and repr(a) or a for a in req.args)
122 starttime = time.time()
122 starttime = time.time()
123 ret = None
123 ret = None
124 try:
124 try:
125 ret = _runcatch(req)
125 ret = _runcatch(req)
126 except KeyboardInterrupt:
126 except KeyboardInterrupt:
127 try:
127 try:
128 req.ui.warn(_("interrupted!\n"))
128 req.ui.warn(_("interrupted!\n"))
129 except IOError as inst:
129 except IOError as inst:
130 if inst.errno != errno.EPIPE:
130 if inst.errno != errno.EPIPE:
131 raise
131 raise
132 ret = -1
132 ret = -1
133 finally:
133 finally:
134 duration = time.time() - starttime
134 duration = time.time() - starttime
135 req.ui.flush()
135 req.ui.flush()
136 req.ui.log("commandfinish", "%s exited %s after %0.2f seconds\n",
136 req.ui.log("commandfinish", "%s exited %s after %0.2f seconds\n",
137 msg, ret or 0, duration)
137 msg, ret or 0, duration)
138 return ret
138 return ret
139
139
140 def _runcatch(req):
140 def _runcatch(req):
141 def catchterm(*args):
141 def catchterm(*args):
142 raise error.SignalInterrupt
142 raise error.SignalInterrupt
143
143
144 ui = req.ui
144 ui = req.ui
145 try:
145 try:
146 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
146 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
147 num = getattr(signal, name, None)
147 num = getattr(signal, name, None)
148 if num:
148 if num:
149 signal.signal(num, catchterm)
149 signal.signal(num, catchterm)
150 except ValueError:
150 except ValueError:
151 pass # happens if called in a thread
151 pass # happens if called in a thread
152
152
153 try:
153 try:
154 try:
154 try:
155 debugger = 'pdb'
155 debugger = 'pdb'
156 debugtrace = {
156 debugtrace = {
157 'pdb' : pdb.set_trace
157 'pdb' : pdb.set_trace
158 }
158 }
159 debugmortem = {
159 debugmortem = {
160 'pdb' : pdb.post_mortem
160 'pdb' : pdb.post_mortem
161 }
161 }
162
162
163 # read --config before doing anything else
163 # read --config before doing anything else
164 # (e.g. to change trust settings for reading .hg/hgrc)
164 # (e.g. to change trust settings for reading .hg/hgrc)
165 cfgs = _parseconfig(req.ui, _earlygetopt(['--config'], req.args))
165 cfgs = _parseconfig(req.ui, _earlygetopt(['--config'], req.args))
166
166
167 if req.repo:
167 if req.repo:
168 # copy configs that were passed on the cmdline (--config) to
168 # copy configs that were passed on the cmdline (--config) to
169 # the repo ui
169 # the repo ui
170 for sec, name, val in cfgs:
170 for sec, name, val in cfgs:
171 req.repo.ui.setconfig(sec, name, val, source='--config')
171 req.repo.ui.setconfig(sec, name, val, source='--config')
172
172
173 # developer config: ui.debugger
173 # developer config: ui.debugger
174 debugger = ui.config("ui", "debugger")
174 debugger = ui.config("ui", "debugger")
175 debugmod = pdb
175 debugmod = pdb
176 if not debugger or ui.plain():
176 if not debugger or ui.plain():
177 # if we are in HGPLAIN mode, then disable custom debugging
177 # if we are in HGPLAIN mode, then disable custom debugging
178 debugger = 'pdb'
178 debugger = 'pdb'
179 elif '--debugger' in req.args:
179 elif '--debugger' in req.args:
180 # This import can be slow for fancy debuggers, so only
180 # This import can be slow for fancy debuggers, so only
181 # do it when absolutely necessary, i.e. when actual
181 # do it when absolutely necessary, i.e. when actual
182 # debugging has been requested
182 # debugging has been requested
183 with demandimport.deactivated():
183 with demandimport.deactivated():
184 try:
184 try:
185 debugmod = __import__(debugger)
185 debugmod = __import__(debugger)
186 except ImportError:
186 except ImportError:
187 pass # Leave debugmod = pdb
187 pass # Leave debugmod = pdb
188
188
189 debugtrace[debugger] = debugmod.set_trace
189 debugtrace[debugger] = debugmod.set_trace
190 debugmortem[debugger] = debugmod.post_mortem
190 debugmortem[debugger] = debugmod.post_mortem
191
191
192 # enter the debugger before command execution
192 # enter the debugger before command execution
193 if '--debugger' in req.args:
193 if '--debugger' in req.args:
194 ui.warn(_("entering debugger - "
194 ui.warn(_("entering debugger - "
195 "type c to continue starting hg or h for help\n"))
195 "type c to continue starting hg or h for help\n"))
196
196
197 if (debugger != 'pdb' and
197 if (debugger != 'pdb' and
198 debugtrace[debugger] == debugtrace['pdb']):
198 debugtrace[debugger] == debugtrace['pdb']):
199 ui.warn(_("%s debugger specified "
199 ui.warn(_("%s debugger specified "
200 "but its module was not found\n") % debugger)
200 "but its module was not found\n") % debugger)
201 with demandimport.deactivated():
201 with demandimport.deactivated():
202 debugtrace[debugger]()
202 debugtrace[debugger]()
203 try:
203 try:
204 return _dispatch(req)
204 return _dispatch(req)
205 finally:
205 finally:
206 ui.flush()
206 ui.flush()
207 except: # re-raises
207 except: # re-raises
208 # enter the debugger when we hit an exception
208 # enter the debugger when we hit an exception
209 if '--debugger' in req.args:
209 if '--debugger' in req.args:
210 traceback.print_exc()
210 traceback.print_exc()
211 debugmortem[debugger](sys.exc_info()[2])
211 debugmortem[debugger](sys.exc_info()[2])
212 ui.traceback()
212 ui.traceback()
213 raise
213 raise
214
214
215 # Global exception handling, alphabetically
215 # Global exception handling, alphabetically
216 # Mercurial-specific first, followed by built-in and library exceptions
216 # Mercurial-specific first, followed by built-in and library exceptions
217 except error.AmbiguousCommand as inst:
217 except error.AmbiguousCommand as inst:
218 ui.warn(_("hg: command '%s' is ambiguous:\n %s\n") %
218 ui.warn(_("hg: command '%s' is ambiguous:\n %s\n") %
219 (inst.args[0], " ".join(inst.args[1])))
219 (inst.args[0], " ".join(inst.args[1])))
220 except error.ParseError as inst:
220 except error.ParseError as inst:
221 _formatparse(ui.warn, inst)
221 _formatparse(ui.warn, inst)
222 return -1
222 return -1
223 except error.LockHeld as inst:
223 except error.LockHeld as inst:
224 if inst.errno == errno.ETIMEDOUT:
224 if inst.errno == errno.ETIMEDOUT:
225 reason = _('timed out waiting for lock held by %s') % inst.locker
225 reason = _('timed out waiting for lock held by %s') % inst.locker
226 else:
226 else:
227 reason = _('lock held by %s') % inst.locker
227 reason = _('lock held by %s') % inst.locker
228 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
228 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
229 except error.LockUnavailable as inst:
229 except error.LockUnavailable as inst:
230 ui.warn(_("abort: could not lock %s: %s\n") %
230 ui.warn(_("abort: could not lock %s: %s\n") %
231 (inst.desc or inst.filename, inst.strerror))
231 (inst.desc or inst.filename, inst.strerror))
232 except error.CommandError as inst:
232 except error.CommandError as inst:
233 if inst.args[0]:
233 if inst.args[0]:
234 ui.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
234 ui.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
235 commands.help_(ui, inst.args[0], full=False, command=True)
235 commands.help_(ui, inst.args[0], full=False, command=True)
236 else:
236 else:
237 ui.warn(_("hg: %s\n") % inst.args[1])
237 ui.warn(_("hg: %s\n") % inst.args[1])
238 commands.help_(ui, 'shortlist')
238 commands.help_(ui, 'shortlist')
239 except error.OutOfBandError as inst:
239 except error.OutOfBandError as inst:
240 if inst.args:
240 if inst.args:
241 msg = _("abort: remote error:\n")
241 msg = _("abort: remote error:\n")
242 else:
242 else:
243 msg = _("abort: remote error\n")
243 msg = _("abort: remote error\n")
244 ui.warn(msg)
244 ui.warn(msg)
245 if inst.args:
245 if inst.args:
246 ui.warn(''.join(inst.args))
246 ui.warn(''.join(inst.args))
247 if inst.hint:
247 if inst.hint:
248 ui.warn('(%s)\n' % inst.hint)
248 ui.warn('(%s)\n' % inst.hint)
249 except error.RepoError as inst:
249 except error.RepoError as inst:
250 ui.warn(_("abort: %s!\n") % inst)
250 ui.warn(_("abort: %s!\n") % inst)
251 if inst.hint:
251 if inst.hint:
252 ui.warn(_("(%s)\n") % inst.hint)
252 ui.warn(_("(%s)\n") % inst.hint)
253 except error.ResponseError as inst:
253 except error.ResponseError as inst:
254 ui.warn(_("abort: %s") % inst.args[0])
254 ui.warn(_("abort: %s") % inst.args[0])
255 if not isinstance(inst.args[1], basestring):
255 if not isinstance(inst.args[1], basestring):
256 ui.warn(" %r\n" % (inst.args[1],))
256 ui.warn(" %r\n" % (inst.args[1],))
257 elif not inst.args[1]:
257 elif not inst.args[1]:
258 ui.warn(_(" empty string\n"))
258 ui.warn(_(" empty string\n"))
259 else:
259 else:
260 ui.warn("\n%r\n" % util.ellipsis(inst.args[1]))
260 ui.warn("\n%r\n" % util.ellipsis(inst.args[1]))
261 except error.CensoredNodeError as inst:
261 except error.CensoredNodeError as inst:
262 ui.warn(_("abort: file censored %s!\n") % inst)
262 ui.warn(_("abort: file censored %s!\n") % inst)
263 except error.RevlogError as inst:
263 except error.RevlogError as inst:
264 ui.warn(_("abort: %s!\n") % inst)
264 ui.warn(_("abort: %s!\n") % inst)
265 except error.SignalInterrupt:
265 except error.SignalInterrupt:
266 ui.warn(_("killed!\n"))
266 ui.warn(_("killed!\n"))
267 except error.UnknownCommand as inst:
267 except error.UnknownCommand as inst:
268 ui.warn(_("hg: unknown command '%s'\n") % inst.args[0])
268 ui.warn(_("hg: unknown command '%s'\n") % inst.args[0])
269 try:
269 try:
270 # check if the command is in a disabled extension
270 # check if the command is in a disabled extension
271 # (but don't check for extensions themselves)
271 # (but don't check for extensions themselves)
272 commands.help_(ui, inst.args[0], unknowncmd=True)
272 commands.help_(ui, inst.args[0], unknowncmd=True)
273 except (error.UnknownCommand, error.Abort):
273 except (error.UnknownCommand, error.Abort):
274 suggested = False
274 suggested = False
275 if len(inst.args) == 2:
275 if len(inst.args) == 2:
276 sim = _getsimilar(inst.args[1], inst.args[0])
276 sim = _getsimilar(inst.args[1], inst.args[0])
277 if sim:
277 if sim:
278 _reportsimilar(ui.warn, sim)
278 _reportsimilar(ui.warn, sim)
279 suggested = True
279 suggested = True
280 if not suggested:
280 if not suggested:
281 commands.help_(ui, 'shortlist')
281 commands.help_(ui, 'shortlist')
282 except error.InterventionRequired as inst:
282 except error.InterventionRequired as inst:
283 ui.warn("%s\n" % inst)
283 ui.warn("%s\n" % inst)
284 if inst.hint:
284 if inst.hint:
285 ui.warn(_("(%s)\n") % inst.hint)
285 ui.warn(_("(%s)\n") % inst.hint)
286 return 1
286 return 1
287 except error.Abort as inst:
287 except error.Abort as inst:
288 ui.warn(_("abort: %s\n") % inst)
288 ui.warn(_("abort: %s\n") % inst)
289 if inst.hint:
289 if inst.hint:
290 ui.warn(_("(%s)\n") % inst.hint)
290 ui.warn(_("(%s)\n") % inst.hint)
291 except ImportError as inst:
291 except ImportError as inst:
292 ui.warn(_("abort: %s!\n") % inst)
292 ui.warn(_("abort: %s!\n") % inst)
293 m = str(inst).split()[-1]
293 m = str(inst).split()[-1]
294 if m in "mpatch bdiff".split():
294 if m in "mpatch bdiff".split():
295 ui.warn(_("(did you forget to compile extensions?)\n"))
295 ui.warn(_("(did you forget to compile extensions?)\n"))
296 elif m in "zlib".split():
296 elif m in "zlib".split():
297 ui.warn(_("(is your Python install correct?)\n"))
297 ui.warn(_("(is your Python install correct?)\n"))
298 except IOError as inst:
298 except IOError as inst:
299 if util.safehasattr(inst, "code"):
299 if util.safehasattr(inst, "code"):
300 ui.warn(_("abort: %s\n") % inst)
300 ui.warn(_("abort: %s\n") % inst)
301 elif util.safehasattr(inst, "reason"):
301 elif util.safehasattr(inst, "reason"):
302 try: # usually it is in the form (errno, strerror)
302 try: # usually it is in the form (errno, strerror)
303 reason = inst.reason.args[1]
303 reason = inst.reason.args[1]
304 except (AttributeError, IndexError):
304 except (AttributeError, IndexError):
305 # it might be anything, for example a string
305 # it might be anything, for example a string
306 reason = inst.reason
306 reason = inst.reason
307 if isinstance(reason, unicode):
307 if isinstance(reason, unicode):
308 # SSLError of Python 2.7.9 contains a unicode
308 # SSLError of Python 2.7.9 contains a unicode
309 reason = reason.encode(encoding.encoding, 'replace')
309 reason = reason.encode(encoding.encoding, 'replace')
310 ui.warn(_("abort: error: %s\n") % reason)
310 ui.warn(_("abort: error: %s\n") % reason)
311 elif (util.safehasattr(inst, "args")
311 elif (util.safehasattr(inst, "args")
312 and inst.args and inst.args[0] == errno.EPIPE):
312 and inst.args and inst.args[0] == errno.EPIPE):
313 pass
313 pass
314 elif getattr(inst, "strerror", None):
314 elif getattr(inst, "strerror", None):
315 if getattr(inst, "filename", None):
315 if getattr(inst, "filename", None):
316 ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
316 ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
317 else:
317 else:
318 ui.warn(_("abort: %s\n") % inst.strerror)
318 ui.warn(_("abort: %s\n") % inst.strerror)
319 else:
319 else:
320 raise
320 raise
321 except OSError as inst:
321 except OSError as inst:
322 if getattr(inst, "filename", None) is not None:
322 if getattr(inst, "filename", None) is not None:
323 ui.warn(_("abort: %s: '%s'\n") % (inst.strerror, inst.filename))
323 ui.warn(_("abort: %s: '%s'\n") % (inst.strerror, inst.filename))
324 else:
324 else:
325 ui.warn(_("abort: %s\n") % inst.strerror)
325 ui.warn(_("abort: %s\n") % inst.strerror)
326 except KeyboardInterrupt:
326 except KeyboardInterrupt:
327 raise
327 raise
328 except MemoryError:
328 except MemoryError:
329 ui.warn(_("abort: out of memory\n"))
329 ui.warn(_("abort: out of memory\n"))
330 except SystemExit as inst:
330 except SystemExit as inst:
331 # Commands shouldn't sys.exit directly, but give a return code.
331 # Commands shouldn't sys.exit directly, but give a return code.
332 # Just in case catch this and and pass exit code to caller.
332 # Just in case catch this and and pass exit code to caller.
333 return inst.code
333 return inst.code
334 except socket.error as inst:
334 except socket.error as inst:
335 ui.warn(_("abort: %s\n") % inst.args[-1])
335 ui.warn(_("abort: %s\n") % inst.args[-1])
336 except: # perhaps re-raises
336 except: # perhaps re-raises
337 if not handlecommandexception(ui):
337 if not handlecommandexception(ui):
338 raise
338 raise
339
339
340 return -1
340 return -1
341
341
342 def aliasargs(fn, givenargs):
342 def aliasargs(fn, givenargs):
343 args = getattr(fn, 'args', [])
343 args = getattr(fn, 'args', [])
344 if args:
344 if args:
345 cmd = ' '.join(map(util.shellquote, args))
345 cmd = ' '.join(map(util.shellquote, args))
346
346
347 nums = []
347 nums = []
348 def replacer(m):
348 def replacer(m):
349 num = int(m.group(1)) - 1
349 num = int(m.group(1)) - 1
350 nums.append(num)
350 nums.append(num)
351 if num < len(givenargs):
351 if num < len(givenargs):
352 return givenargs[num]
352 return givenargs[num]
353 raise error.Abort(_('too few arguments for command alias'))
353 raise error.Abort(_('too few arguments for command alias'))
354 cmd = re.sub(r'\$(\d+|\$)', replacer, cmd)
354 cmd = re.sub(r'\$(\d+|\$)', replacer, cmd)
355 givenargs = [x for i, x in enumerate(givenargs)
355 givenargs = [x for i, x in enumerate(givenargs)
356 if i not in nums]
356 if i not in nums]
357 args = shlex.split(cmd)
357 args = shlex.split(cmd)
358 return args + givenargs
358 return args + givenargs
359
359
360 def aliasinterpolate(name, args, cmd):
360 def aliasinterpolate(name, args, cmd):
361 '''interpolate args into cmd for shell aliases
361 '''interpolate args into cmd for shell aliases
362
362
363 This also handles $0, $@ and "$@".
363 This also handles $0, $@ and "$@".
364 '''
364 '''
365 # util.interpolate can't deal with "$@" (with quotes) because it's only
365 # util.interpolate can't deal with "$@" (with quotes) because it's only
366 # built to match prefix + patterns.
366 # built to match prefix + patterns.
367 replacemap = dict(('$%d' % (i + 1), arg) for i, arg in enumerate(args))
367 replacemap = dict(('$%d' % (i + 1), arg) for i, arg in enumerate(args))
368 replacemap['$0'] = name
368 replacemap['$0'] = name
369 replacemap['$$'] = '$'
369 replacemap['$$'] = '$'
370 replacemap['$@'] = ' '.join(args)
370 replacemap['$@'] = ' '.join(args)
371 # Typical Unix shells interpolate "$@" (with quotes) as all the positional
371 # Typical Unix shells interpolate "$@" (with quotes) as all the positional
372 # parameters, separated out into words. Emulate the same behavior here by
372 # parameters, separated out into words. Emulate the same behavior here by
373 # quoting the arguments individually. POSIX shells will then typically
373 # quoting the arguments individually. POSIX shells will then typically
374 # tokenize each argument into exactly one word.
374 # tokenize each argument into exactly one word.
375 replacemap['"$@"'] = ' '.join(util.shellquote(arg) for arg in args)
375 replacemap['"$@"'] = ' '.join(util.shellquote(arg) for arg in args)
376 # escape '\$' for regex
376 # escape '\$' for regex
377 regex = '|'.join(replacemap.keys()).replace('$', r'\$')
377 regex = '|'.join(replacemap.keys()).replace('$', r'\$')
378 r = re.compile(regex)
378 r = re.compile(regex)
379 return r.sub(lambda x: replacemap[x.group()], cmd)
379 return r.sub(lambda x: replacemap[x.group()], cmd)
380
380
381 class cmdalias(object):
381 class cmdalias(object):
382 def __init__(self, name, definition, cmdtable, source):
382 def __init__(self, name, definition, cmdtable, source):
383 self.name = self.cmd = name
383 self.name = self.cmd = name
384 self.cmdname = ''
384 self.cmdname = ''
385 self.definition = definition
385 self.definition = definition
386 self.fn = None
386 self.fn = None
387 self.givenargs = []
387 self.givenargs = []
388 self.opts = []
388 self.opts = []
389 self.help = ''
389 self.help = ''
390 self.badalias = None
390 self.badalias = None
391 self.unknowncmd = False
391 self.unknowncmd = False
392 self.source = source
392 self.source = source
393
393
394 try:
394 try:
395 aliases, entry = cmdutil.findcmd(self.name, cmdtable)
395 aliases, entry = cmdutil.findcmd(self.name, cmdtable)
396 for alias, e in cmdtable.iteritems():
396 for alias, e in cmdtable.iteritems():
397 if e is entry:
397 if e is entry:
398 self.cmd = alias
398 self.cmd = alias
399 break
399 break
400 self.shadows = True
400 self.shadows = True
401 except error.UnknownCommand:
401 except error.UnknownCommand:
402 self.shadows = False
402 self.shadows = False
403
403
404 if not self.definition:
404 if not self.definition:
405 self.badalias = _("no definition for alias '%s'") % self.name
405 self.badalias = _("no definition for alias '%s'") % self.name
406 return
406 return
407
407
408 if self.definition.startswith('!'):
408 if self.definition.startswith('!'):
409 self.shell = True
409 self.shell = True
410 def fn(ui, *args):
410 def fn(ui, *args):
411 env = {'HG_ARGS': ' '.join((self.name,) + args)}
411 env = {'HG_ARGS': ' '.join((self.name,) + args)}
412 def _checkvar(m):
412 def _checkvar(m):
413 if m.groups()[0] == '$':
413 if m.groups()[0] == '$':
414 return m.group()
414 return m.group()
415 elif int(m.groups()[0]) <= len(args):
415 elif int(m.groups()[0]) <= len(args):
416 return m.group()
416 return m.group()
417 else:
417 else:
418 ui.debug("No argument found for substitution "
418 ui.debug("No argument found for substitution "
419 "of %i variable in alias '%s' definition."
419 "of %i variable in alias '%s' definition."
420 % (int(m.groups()[0]), self.name))
420 % (int(m.groups()[0]), self.name))
421 return ''
421 return ''
422 cmd = re.sub(r'\$(\d+|\$)', _checkvar, self.definition[1:])
422 cmd = re.sub(r'\$(\d+|\$)', _checkvar, self.definition[1:])
423 cmd = aliasinterpolate(self.name, args, cmd)
423 cmd = aliasinterpolate(self.name, args, cmd)
424 return ui.system(cmd, environ=env)
424 return ui.system(cmd, environ=env)
425 self.fn = fn
425 self.fn = fn
426 return
426 return
427
427
428 try:
428 try:
429 args = shlex.split(self.definition)
429 args = shlex.split(self.definition)
430 except ValueError as inst:
430 except ValueError as inst:
431 self.badalias = (_("error in definition for alias '%s': %s")
431 self.badalias = (_("error in definition for alias '%s': %s")
432 % (self.name, inst))
432 % (self.name, inst))
433 return
433 return
434 self.cmdname = cmd = args.pop(0)
434 self.cmdname = cmd = args.pop(0)
435 self.givenargs = args
435 self.givenargs = args
436
436
437 for invalidarg in ("--cwd", "-R", "--repository", "--repo", "--config"):
437 for invalidarg in ("--cwd", "-R", "--repository", "--repo", "--config"):
438 if _earlygetopt([invalidarg], args):
438 if _earlygetopt([invalidarg], args):
439 self.badalias = (_("error in definition for alias '%s': %s may "
439 self.badalias = (_("error in definition for alias '%s': %s may "
440 "only be given on the command line")
440 "only be given on the command line")
441 % (self.name, invalidarg))
441 % (self.name, invalidarg))
442 return
442 return
443
443
444 try:
444 try:
445 tableentry = cmdutil.findcmd(cmd, cmdtable, False)[1]
445 tableentry = cmdutil.findcmd(cmd, cmdtable, False)[1]
446 if len(tableentry) > 2:
446 if len(tableentry) > 2:
447 self.fn, self.opts, self.help = tableentry
447 self.fn, self.opts, self.help = tableentry
448 else:
448 else:
449 self.fn, self.opts = tableentry
449 self.fn, self.opts = tableentry
450
450
451 if self.help.startswith("hg " + cmd):
451 if self.help.startswith("hg " + cmd):
452 # drop prefix in old-style help lines so hg shows the alias
452 # drop prefix in old-style help lines so hg shows the alias
453 self.help = self.help[4 + len(cmd):]
453 self.help = self.help[4 + len(cmd):]
454 self.__doc__ = self.fn.__doc__
454 self.__doc__ = self.fn.__doc__
455
455
456 except error.UnknownCommand:
456 except error.UnknownCommand:
457 self.badalias = (_("alias '%s' resolves to unknown command '%s'")
457 self.badalias = (_("alias '%s' resolves to unknown command '%s'")
458 % (self.name, cmd))
458 % (self.name, cmd))
459 self.unknowncmd = True
459 self.unknowncmd = True
460 except error.AmbiguousCommand:
460 except error.AmbiguousCommand:
461 self.badalias = (_("alias '%s' resolves to ambiguous command '%s'")
461 self.badalias = (_("alias '%s' resolves to ambiguous command '%s'")
462 % (self.name, cmd))
462 % (self.name, cmd))
463
463
464 @property
464 @property
465 def args(self):
465 def args(self):
466 args = map(util.expandpath, self.givenargs)
466 args = map(util.expandpath, self.givenargs)
467 return aliasargs(self.fn, args)
467 return aliasargs(self.fn, args)
468
468
469 def __getattr__(self, name):
469 def __getattr__(self, name):
470 adefaults = {'norepo': True, 'optionalrepo': False, 'inferrepo': False}
470 adefaults = {'norepo': True, 'optionalrepo': False, 'inferrepo': False}
471 if name not in adefaults:
471 if name not in adefaults:
472 raise AttributeError(name)
472 raise AttributeError(name)
473 if self.badalias or util.safehasattr(self, 'shell'):
473 if self.badalias or util.safehasattr(self, 'shell'):
474 return adefaults[name]
474 return adefaults[name]
475 return getattr(self.fn, name)
475 return getattr(self.fn, name)
476
476
477 def __call__(self, ui, *args, **opts):
477 def __call__(self, ui, *args, **opts):
478 if self.badalias:
478 if self.badalias:
479 hint = None
479 hint = None
480 if self.unknowncmd:
480 if self.unknowncmd:
481 try:
481 try:
482 # check if the command is in a disabled extension
482 # check if the command is in a disabled extension
483 cmd, ext = extensions.disabledcmd(ui, self.cmdname)[:2]
483 cmd, ext = extensions.disabledcmd(ui, self.cmdname)[:2]
484 hint = _("'%s' is provided by '%s' extension") % (cmd, ext)
484 hint = _("'%s' is provided by '%s' extension") % (cmd, ext)
485 except error.UnknownCommand:
485 except error.UnknownCommand:
486 pass
486 pass
487 raise error.Abort(self.badalias, hint=hint)
487 raise error.Abort(self.badalias, hint=hint)
488 if self.shadows:
488 if self.shadows:
489 ui.debug("alias '%s' shadows command '%s'\n" %
489 ui.debug("alias '%s' shadows command '%s'\n" %
490 (self.name, self.cmdname))
490 (self.name, self.cmdname))
491
491
492 if util.safehasattr(self, 'shell'):
492 if util.safehasattr(self, 'shell'):
493 return self.fn(ui, *args, **opts)
493 return self.fn(ui, *args, **opts)
494 else:
494 else:
495 try:
495 try:
496 return util.checksignature(self.fn)(ui, *args, **opts)
496 return util.checksignature(self.fn)(ui, *args, **opts)
497 except error.SignatureError:
497 except error.SignatureError:
498 args = ' '.join([self.cmdname] + self.args)
498 args = ' '.join([self.cmdname] + self.args)
499 ui.debug("alias '%s' expands to '%s'\n" % (self.name, args))
499 ui.debug("alias '%s' expands to '%s'\n" % (self.name, args))
500 raise
500 raise
501
501
502 def addaliases(ui, cmdtable):
502 def addaliases(ui, cmdtable):
503 # aliases are processed after extensions have been loaded, so they
503 # aliases are processed after extensions have been loaded, so they
504 # may use extension commands. Aliases can also use other alias definitions,
504 # may use extension commands. Aliases can also use other alias definitions,
505 # but only if they have been defined prior to the current definition.
505 # but only if they have been defined prior to the current definition.
506 for alias, definition in ui.configitems('alias'):
506 for alias, definition in ui.configitems('alias'):
507 source = ui.configsource('alias', alias)
507 source = ui.configsource('alias', alias)
508 aliasdef = cmdalias(alias, definition, cmdtable, source)
508 aliasdef = cmdalias(alias, definition, cmdtable, source)
509
509
510 try:
510 try:
511 olddef = cmdtable[aliasdef.cmd][0]
511 olddef = cmdtable[aliasdef.cmd][0]
512 if olddef.definition == aliasdef.definition:
512 if olddef.definition == aliasdef.definition:
513 continue
513 continue
514 except (KeyError, AttributeError):
514 except (KeyError, AttributeError):
515 # definition might not exist or it might not be a cmdalias
515 # definition might not exist or it might not be a cmdalias
516 pass
516 pass
517
517
518 cmdtable[aliasdef.name] = (aliasdef, aliasdef.opts, aliasdef.help)
518 cmdtable[aliasdef.name] = (aliasdef, aliasdef.opts, aliasdef.help)
519
519
520 def _parse(ui, args):
520 def _parse(ui, args):
521 options = {}
521 options = {}
522 cmdoptions = {}
522 cmdoptions = {}
523
523
524 try:
524 try:
525 args = fancyopts.fancyopts(args, commands.globalopts, options)
525 args = fancyopts.fancyopts(args, commands.globalopts, options)
526 except fancyopts.getopt.GetoptError as inst:
526 except fancyopts.getopt.GetoptError as inst:
527 raise error.CommandError(None, inst)
527 raise error.CommandError(None, inst)
528
528
529 if args:
529 if args:
530 cmd, args = args[0], args[1:]
530 cmd, args = args[0], args[1:]
531 aliases, entry = cmdutil.findcmd(cmd, commands.table,
531 aliases, entry = cmdutil.findcmd(cmd, commands.table,
532 ui.configbool("ui", "strict"))
532 ui.configbool("ui", "strict"))
533 cmd = aliases[0]
533 cmd = aliases[0]
534 args = aliasargs(entry[0], args)
534 args = aliasargs(entry[0], args)
535 defaults = ui.config("defaults", cmd)
535 defaults = ui.config("defaults", cmd)
536 if defaults:
536 if defaults:
537 args = map(util.expandpath, shlex.split(defaults)) + args
537 args = map(util.expandpath, shlex.split(defaults)) + args
538 c = list(entry[1])
538 c = list(entry[1])
539 else:
539 else:
540 cmd = None
540 cmd = None
541 c = []
541 c = []
542
542
543 # combine global options into local
543 # combine global options into local
544 for o in commands.globalopts:
544 for o in commands.globalopts:
545 c.append((o[0], o[1], options[o[1]], o[3]))
545 c.append((o[0], o[1], options[o[1]], o[3]))
546
546
547 try:
547 try:
548 args = fancyopts.fancyopts(args, c, cmdoptions, True)
548 args = fancyopts.fancyopts(args, c, cmdoptions, True)
549 except fancyopts.getopt.GetoptError as inst:
549 except fancyopts.getopt.GetoptError as inst:
550 raise error.CommandError(cmd, inst)
550 raise error.CommandError(cmd, inst)
551
551
552 # separate global options back out
552 # separate global options back out
553 for o in commands.globalopts:
553 for o in commands.globalopts:
554 n = o[1]
554 n = o[1]
555 options[n] = cmdoptions[n]
555 options[n] = cmdoptions[n]
556 del cmdoptions[n]
556 del cmdoptions[n]
557
557
558 return (cmd, cmd and entry[0] or None, args, options, cmdoptions)
558 return (cmd, cmd and entry[0] or None, args, options, cmdoptions)
559
559
560 def _parseconfig(ui, config):
560 def _parseconfig(ui, config):
561 """parse the --config options from the command line"""
561 """parse the --config options from the command line"""
562 configs = []
562 configs = []
563
563
564 for cfg in config:
564 for cfg in config:
565 try:
565 try:
566 name, value = [cfgelem.strip()
566 name, value = [cfgelem.strip()
567 for cfgelem in cfg.split('=', 1)]
567 for cfgelem in cfg.split('=', 1)]
568 section, name = name.split('.', 1)
568 section, name = name.split('.', 1)
569 if not section or not name:
569 if not section or not name:
570 raise IndexError
570 raise IndexError
571 ui.setconfig(section, name, value, '--config')
571 ui.setconfig(section, name, value, '--config')
572 configs.append((section, name, value))
572 configs.append((section, name, value))
573 except (IndexError, ValueError):
573 except (IndexError, ValueError):
574 raise error.Abort(_('malformed --config option: %r '
574 raise error.Abort(_('malformed --config option: %r '
575 '(use --config section.name=value)') % cfg)
575 '(use --config section.name=value)') % cfg)
576
576
577 return configs
577 return configs
578
578
579 def _earlygetopt(aliases, args):
579 def _earlygetopt(aliases, args):
580 """Return list of values for an option (or aliases).
580 """Return list of values for an option (or aliases).
581
581
582 The values are listed in the order they appear in args.
582 The values are listed in the order they appear in args.
583 The options and values are removed from args.
583 The options and values are removed from args.
584
584
585 >>> args = ['x', '--cwd', 'foo', 'y']
585 >>> args = ['x', '--cwd', 'foo', 'y']
586 >>> _earlygetopt(['--cwd'], args), args
586 >>> _earlygetopt(['--cwd'], args), args
587 (['foo'], ['x', 'y'])
587 (['foo'], ['x', 'y'])
588
588
589 >>> args = ['x', '--cwd=bar', 'y']
589 >>> args = ['x', '--cwd=bar', 'y']
590 >>> _earlygetopt(['--cwd'], args), args
590 >>> _earlygetopt(['--cwd'], args), args
591 (['bar'], ['x', 'y'])
591 (['bar'], ['x', 'y'])
592
592
593 >>> args = ['x', '-R', 'foo', 'y']
593 >>> args = ['x', '-R', 'foo', 'y']
594 >>> _earlygetopt(['-R'], args), args
594 >>> _earlygetopt(['-R'], args), args
595 (['foo'], ['x', 'y'])
595 (['foo'], ['x', 'y'])
596
596
597 >>> args = ['x', '-Rbar', 'y']
597 >>> args = ['x', '-Rbar', 'y']
598 >>> _earlygetopt(['-R'], args), args
598 >>> _earlygetopt(['-R'], args), args
599 (['bar'], ['x', 'y'])
599 (['bar'], ['x', 'y'])
600 """
600 """
601 try:
601 try:
602 argcount = args.index("--")
602 argcount = args.index("--")
603 except ValueError:
603 except ValueError:
604 argcount = len(args)
604 argcount = len(args)
605 shortopts = [opt for opt in aliases if len(opt) == 2]
605 shortopts = [opt for opt in aliases if len(opt) == 2]
606 values = []
606 values = []
607 pos = 0
607 pos = 0
608 while pos < argcount:
608 while pos < argcount:
609 fullarg = arg = args[pos]
609 fullarg = arg = args[pos]
610 equals = arg.find('=')
610 equals = arg.find('=')
611 if equals > -1:
611 if equals > -1:
612 arg = arg[:equals]
612 arg = arg[:equals]
613 if arg in aliases:
613 if arg in aliases:
614 del args[pos]
614 del args[pos]
615 if equals > -1:
615 if equals > -1:
616 values.append(fullarg[equals + 1:])
616 values.append(fullarg[equals + 1:])
617 argcount -= 1
617 argcount -= 1
618 else:
618 else:
619 if pos + 1 >= argcount:
619 if pos + 1 >= argcount:
620 # ignore and let getopt report an error if there is no value
620 # ignore and let getopt report an error if there is no value
621 break
621 break
622 values.append(args.pop(pos))
622 values.append(args.pop(pos))
623 argcount -= 2
623 argcount -= 2
624 elif arg[:2] in shortopts:
624 elif arg[:2] in shortopts:
625 # short option can have no following space, e.g. hg log -Rfoo
625 # short option can have no following space, e.g. hg log -Rfoo
626 values.append(args.pop(pos)[2:])
626 values.append(args.pop(pos)[2:])
627 argcount -= 1
627 argcount -= 1
628 else:
628 else:
629 pos += 1
629 pos += 1
630 return values
630 return values
631
631
632 def runcommand(lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions):
632 def runcommand(lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions):
633 # run pre-hook, and abort if it fails
633 # run pre-hook, and abort if it fails
634 hook.hook(lui, repo, "pre-%s" % cmd, True, args=" ".join(fullargs),
634 hook.hook(lui, repo, "pre-%s" % cmd, True, args=" ".join(fullargs),
635 pats=cmdpats, opts=cmdoptions)
635 pats=cmdpats, opts=cmdoptions)
636 try:
636 ret = _runcommand(ui, options, cmd, d)
637 ret = _runcommand(ui, options, cmd, d)
637 # run post-hook, passing command result
638 # run post-hook, passing command result
638 hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs),
639 hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs),
639 result=ret, pats=cmdpats, opts=cmdoptions)
640 result=ret, pats=cmdpats, opts=cmdoptions)
641 except Exception:
642 # run failure hook and re-raise
643 hook.hook(lui, repo, "fail-%s" % cmd, False, args=" ".join(fullargs),
644 pats=cmdpats, opts=cmdoptions)
645 raise
640 return ret
646 return ret
641
647
642 def _getlocal(ui, rpath, wd=None):
648 def _getlocal(ui, rpath, wd=None):
643 """Return (path, local ui object) for the given target path.
649 """Return (path, local ui object) for the given target path.
644
650
645 Takes paths in [cwd]/.hg/hgrc into account."
651 Takes paths in [cwd]/.hg/hgrc into account."
646 """
652 """
647 if wd is None:
653 if wd is None:
648 try:
654 try:
649 wd = os.getcwd()
655 wd = os.getcwd()
650 except OSError as e:
656 except OSError as e:
651 raise error.Abort(_("error getting current working directory: %s") %
657 raise error.Abort(_("error getting current working directory: %s") %
652 e.strerror)
658 e.strerror)
653 path = cmdutil.findrepo(wd) or ""
659 path = cmdutil.findrepo(wd) or ""
654 if not path:
660 if not path:
655 lui = ui
661 lui = ui
656 else:
662 else:
657 lui = ui.copy()
663 lui = ui.copy()
658 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path)
664 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path)
659
665
660 if rpath and rpath[-1]:
666 if rpath and rpath[-1]:
661 path = lui.expandpath(rpath[-1])
667 path = lui.expandpath(rpath[-1])
662 lui = ui.copy()
668 lui = ui.copy()
663 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path)
669 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path)
664
670
665 return path, lui
671 return path, lui
666
672
667 def _checkshellalias(lui, ui, args, precheck=True):
673 def _checkshellalias(lui, ui, args, precheck=True):
668 """Return the function to run the shell alias, if it is required
674 """Return the function to run the shell alias, if it is required
669
675
670 'precheck' is whether this function is invoked before adding
676 'precheck' is whether this function is invoked before adding
671 aliases or not.
677 aliases or not.
672 """
678 """
673 options = {}
679 options = {}
674
680
675 try:
681 try:
676 args = fancyopts.fancyopts(args, commands.globalopts, options)
682 args = fancyopts.fancyopts(args, commands.globalopts, options)
677 except fancyopts.getopt.GetoptError:
683 except fancyopts.getopt.GetoptError:
678 return
684 return
679
685
680 if not args:
686 if not args:
681 return
687 return
682
688
683 if precheck:
689 if precheck:
684 strict = True
690 strict = True
685 cmdtable = commands.table.copy()
691 cmdtable = commands.table.copy()
686 addaliases(lui, cmdtable)
692 addaliases(lui, cmdtable)
687 else:
693 else:
688 strict = False
694 strict = False
689 cmdtable = commands.table
695 cmdtable = commands.table
690
696
691 cmd = args[0]
697 cmd = args[0]
692 try:
698 try:
693 aliases, entry = cmdutil.findcmd(cmd, cmdtable, strict)
699 aliases, entry = cmdutil.findcmd(cmd, cmdtable, strict)
694 except (error.AmbiguousCommand, error.UnknownCommand):
700 except (error.AmbiguousCommand, error.UnknownCommand):
695 return
701 return
696
702
697 cmd = aliases[0]
703 cmd = aliases[0]
698 fn = entry[0]
704 fn = entry[0]
699
705
700 if cmd and util.safehasattr(fn, 'shell'):
706 if cmd and util.safehasattr(fn, 'shell'):
701 d = lambda: fn(ui, *args[1:])
707 d = lambda: fn(ui, *args[1:])
702 return lambda: runcommand(lui, None, cmd, args[:1], ui, options, d,
708 return lambda: runcommand(lui, None, cmd, args[:1], ui, options, d,
703 [], {})
709 [], {})
704
710
705 def _cmdattr(ui, cmd, func, attr):
711 def _cmdattr(ui, cmd, func, attr):
706 try:
712 try:
707 return getattr(func, attr)
713 return getattr(func, attr)
708 except AttributeError:
714 except AttributeError:
709 ui.deprecwarn("missing attribute '%s', use @command decorator "
715 ui.deprecwarn("missing attribute '%s', use @command decorator "
710 "to register '%s'" % (attr, cmd), '3.8')
716 "to register '%s'" % (attr, cmd), '3.8')
711 return False
717 return False
712
718
713 _loaded = set()
719 _loaded = set()
714
720
715 # list of (objname, loadermod, loadername) tuple:
721 # list of (objname, loadermod, loadername) tuple:
716 # - objname is the name of an object in extension module, from which
722 # - objname is the name of an object in extension module, from which
717 # extra information is loaded
723 # extra information is loaded
718 # - loadermod is the module where loader is placed
724 # - loadermod is the module where loader is placed
719 # - loadername is the name of the function, which takes (ui, extensionname,
725 # - loadername is the name of the function, which takes (ui, extensionname,
720 # extraobj) arguments
726 # extraobj) arguments
721 extraloaders = [
727 extraloaders = [
722 ('cmdtable', commands, 'loadcmdtable'),
728 ('cmdtable', commands, 'loadcmdtable'),
723 ('filesetpredicate', fileset, 'loadpredicate'),
729 ('filesetpredicate', fileset, 'loadpredicate'),
724 ('revsetpredicate', revset, 'loadpredicate'),
730 ('revsetpredicate', revset, 'loadpredicate'),
725 ('templatefilter', templatefilters, 'loadfilter'),
731 ('templatefilter', templatefilters, 'loadfilter'),
726 ('templatefunc', templater, 'loadfunction'),
732 ('templatefunc', templater, 'loadfunction'),
727 ('templatekeyword', templatekw, 'loadkeyword'),
733 ('templatekeyword', templatekw, 'loadkeyword'),
728 ]
734 ]
729
735
730 def _dispatch(req):
736 def _dispatch(req):
731 args = req.args
737 args = req.args
732 ui = req.ui
738 ui = req.ui
733
739
734 # check for cwd
740 # check for cwd
735 cwd = _earlygetopt(['--cwd'], args)
741 cwd = _earlygetopt(['--cwd'], args)
736 if cwd:
742 if cwd:
737 os.chdir(cwd[-1])
743 os.chdir(cwd[-1])
738
744
739 rpath = _earlygetopt(["-R", "--repository", "--repo"], args)
745 rpath = _earlygetopt(["-R", "--repository", "--repo"], args)
740 path, lui = _getlocal(ui, rpath)
746 path, lui = _getlocal(ui, rpath)
741
747
742 # Now that we're operating in the right directory/repository with
748 # Now that we're operating in the right directory/repository with
743 # the right config settings, check for shell aliases
749 # the right config settings, check for shell aliases
744 shellaliasfn = _checkshellalias(lui, ui, args)
750 shellaliasfn = _checkshellalias(lui, ui, args)
745 if shellaliasfn:
751 if shellaliasfn:
746 return shellaliasfn()
752 return shellaliasfn()
747
753
748 # Configure extensions in phases: uisetup, extsetup, cmdtable, and
754 # Configure extensions in phases: uisetup, extsetup, cmdtable, and
749 # reposetup. Programs like TortoiseHg will call _dispatch several
755 # reposetup. Programs like TortoiseHg will call _dispatch several
750 # times so we keep track of configured extensions in _loaded.
756 # times so we keep track of configured extensions in _loaded.
751 extensions.loadall(lui)
757 extensions.loadall(lui)
752 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded]
758 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded]
753 # Propagate any changes to lui.__class__ by extensions
759 # Propagate any changes to lui.__class__ by extensions
754 ui.__class__ = lui.__class__
760 ui.__class__ = lui.__class__
755
761
756 # (uisetup and extsetup are handled in extensions.loadall)
762 # (uisetup and extsetup are handled in extensions.loadall)
757
763
758 for name, module in exts:
764 for name, module in exts:
759 for objname, loadermod, loadername in extraloaders:
765 for objname, loadermod, loadername in extraloaders:
760 extraobj = getattr(module, objname, None)
766 extraobj = getattr(module, objname, None)
761 if extraobj is not None:
767 if extraobj is not None:
762 getattr(loadermod, loadername)(ui, name, extraobj)
768 getattr(loadermod, loadername)(ui, name, extraobj)
763 _loaded.add(name)
769 _loaded.add(name)
764
770
765 # (reposetup is handled in hg.repository)
771 # (reposetup is handled in hg.repository)
766
772
767 addaliases(lui, commands.table)
773 addaliases(lui, commands.table)
768
774
769 if not lui.configbool("ui", "strict"):
775 if not lui.configbool("ui", "strict"):
770 # All aliases and commands are completely defined, now.
776 # All aliases and commands are completely defined, now.
771 # Check abbreviation/ambiguity of shell alias again, because shell
777 # Check abbreviation/ambiguity of shell alias again, because shell
772 # alias may cause failure of "_parse" (see issue4355)
778 # alias may cause failure of "_parse" (see issue4355)
773 shellaliasfn = _checkshellalias(lui, ui, args, precheck=False)
779 shellaliasfn = _checkshellalias(lui, ui, args, precheck=False)
774 if shellaliasfn:
780 if shellaliasfn:
775 return shellaliasfn()
781 return shellaliasfn()
776
782
777 # check for fallback encoding
783 # check for fallback encoding
778 fallback = lui.config('ui', 'fallbackencoding')
784 fallback = lui.config('ui', 'fallbackencoding')
779 if fallback:
785 if fallback:
780 encoding.fallbackencoding = fallback
786 encoding.fallbackencoding = fallback
781
787
782 fullargs = args
788 fullargs = args
783 cmd, func, args, options, cmdoptions = _parse(lui, args)
789 cmd, func, args, options, cmdoptions = _parse(lui, args)
784
790
785 if options["config"]:
791 if options["config"]:
786 raise error.Abort(_("option --config may not be abbreviated!"))
792 raise error.Abort(_("option --config may not be abbreviated!"))
787 if options["cwd"]:
793 if options["cwd"]:
788 raise error.Abort(_("option --cwd may not be abbreviated!"))
794 raise error.Abort(_("option --cwd may not be abbreviated!"))
789 if options["repository"]:
795 if options["repository"]:
790 raise error.Abort(_(
796 raise error.Abort(_(
791 "option -R has to be separated from other options (e.g. not -qR) "
797 "option -R has to be separated from other options (e.g. not -qR) "
792 "and --repository may only be abbreviated as --repo!"))
798 "and --repository may only be abbreviated as --repo!"))
793
799
794 if options["encoding"]:
800 if options["encoding"]:
795 encoding.encoding = options["encoding"]
801 encoding.encoding = options["encoding"]
796 if options["encodingmode"]:
802 if options["encodingmode"]:
797 encoding.encodingmode = options["encodingmode"]
803 encoding.encodingmode = options["encodingmode"]
798 if options["time"]:
804 if options["time"]:
799 def get_times():
805 def get_times():
800 t = os.times()
806 t = os.times()
801 if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
807 if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
802 t = (t[0], t[1], t[2], t[3], time.clock())
808 t = (t[0], t[1], t[2], t[3], time.clock())
803 return t
809 return t
804 s = get_times()
810 s = get_times()
805 def print_time():
811 def print_time():
806 t = get_times()
812 t = get_times()
807 ui.warn(_("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
813 ui.warn(_("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
808 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
814 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
809 atexit.register(print_time)
815 atexit.register(print_time)
810
816
811 uis = set([ui, lui])
817 uis = set([ui, lui])
812
818
813 if req.repo:
819 if req.repo:
814 uis.add(req.repo.ui)
820 uis.add(req.repo.ui)
815
821
816 if options['verbose'] or options['debug'] or options['quiet']:
822 if options['verbose'] or options['debug'] or options['quiet']:
817 for opt in ('verbose', 'debug', 'quiet'):
823 for opt in ('verbose', 'debug', 'quiet'):
818 val = str(bool(options[opt]))
824 val = str(bool(options[opt]))
819 for ui_ in uis:
825 for ui_ in uis:
820 ui_.setconfig('ui', opt, val, '--' + opt)
826 ui_.setconfig('ui', opt, val, '--' + opt)
821
827
822 if options['traceback']:
828 if options['traceback']:
823 for ui_ in uis:
829 for ui_ in uis:
824 ui_.setconfig('ui', 'traceback', 'on', '--traceback')
830 ui_.setconfig('ui', 'traceback', 'on', '--traceback')
825
831
826 if options['noninteractive']:
832 if options['noninteractive']:
827 for ui_ in uis:
833 for ui_ in uis:
828 ui_.setconfig('ui', 'interactive', 'off', '-y')
834 ui_.setconfig('ui', 'interactive', 'off', '-y')
829
835
830 if cmdoptions.get('insecure', False):
836 if cmdoptions.get('insecure', False):
831 for ui_ in uis:
837 for ui_ in uis:
832 ui_.insecureconnections = True
838 ui_.insecureconnections = True
833
839
834 if options['version']:
840 if options['version']:
835 return commands.version_(ui)
841 return commands.version_(ui)
836 if options['help']:
842 if options['help']:
837 return commands.help_(ui, cmd, command=cmd is not None)
843 return commands.help_(ui, cmd, command=cmd is not None)
838 elif not cmd:
844 elif not cmd:
839 return commands.help_(ui, 'shortlist')
845 return commands.help_(ui, 'shortlist')
840
846
841 repo = None
847 repo = None
842 cmdpats = args[:]
848 cmdpats = args[:]
843 if not _cmdattr(ui, cmd, func, 'norepo'):
849 if not _cmdattr(ui, cmd, func, 'norepo'):
844 # use the repo from the request only if we don't have -R
850 # use the repo from the request only if we don't have -R
845 if not rpath and not cwd:
851 if not rpath and not cwd:
846 repo = req.repo
852 repo = req.repo
847
853
848 if repo:
854 if repo:
849 # set the descriptors of the repo ui to those of ui
855 # set the descriptors of the repo ui to those of ui
850 repo.ui.fin = ui.fin
856 repo.ui.fin = ui.fin
851 repo.ui.fout = ui.fout
857 repo.ui.fout = ui.fout
852 repo.ui.ferr = ui.ferr
858 repo.ui.ferr = ui.ferr
853 else:
859 else:
854 try:
860 try:
855 repo = hg.repository(ui, path=path)
861 repo = hg.repository(ui, path=path)
856 if not repo.local():
862 if not repo.local():
857 raise error.Abort(_("repository '%s' is not local") % path)
863 raise error.Abort(_("repository '%s' is not local") % path)
858 repo.ui.setconfig("bundle", "mainreporoot", repo.root, 'repo')
864 repo.ui.setconfig("bundle", "mainreporoot", repo.root, 'repo')
859 except error.RequirementError:
865 except error.RequirementError:
860 raise
866 raise
861 except error.RepoError:
867 except error.RepoError:
862 if rpath and rpath[-1]: # invalid -R path
868 if rpath and rpath[-1]: # invalid -R path
863 raise
869 raise
864 if not _cmdattr(ui, cmd, func, 'optionalrepo'):
870 if not _cmdattr(ui, cmd, func, 'optionalrepo'):
865 if (_cmdattr(ui, cmd, func, 'inferrepo') and
871 if (_cmdattr(ui, cmd, func, 'inferrepo') and
866 args and not path):
872 args and not path):
867 # try to infer -R from command args
873 # try to infer -R from command args
868 repos = map(cmdutil.findrepo, args)
874 repos = map(cmdutil.findrepo, args)
869 guess = repos[0]
875 guess = repos[0]
870 if guess and repos.count(guess) == len(repos):
876 if guess and repos.count(guess) == len(repos):
871 req.args = ['--repository', guess] + fullargs
877 req.args = ['--repository', guess] + fullargs
872 return _dispatch(req)
878 return _dispatch(req)
873 if not path:
879 if not path:
874 raise error.RepoError(_("no repository found in '%s'"
880 raise error.RepoError(_("no repository found in '%s'"
875 " (.hg not found)")
881 " (.hg not found)")
876 % os.getcwd())
882 % os.getcwd())
877 raise
883 raise
878 if repo:
884 if repo:
879 ui = repo.ui
885 ui = repo.ui
880 if options['hidden']:
886 if options['hidden']:
881 repo = repo.unfiltered()
887 repo = repo.unfiltered()
882 args.insert(0, repo)
888 args.insert(0, repo)
883 elif rpath:
889 elif rpath:
884 ui.warn(_("warning: --repository ignored\n"))
890 ui.warn(_("warning: --repository ignored\n"))
885
891
886 msg = ' '.join(' ' in a and repr(a) or a for a in fullargs)
892 msg = ' '.join(' ' in a and repr(a) or a for a in fullargs)
887 ui.log("command", '%s\n', msg)
893 ui.log("command", '%s\n', msg)
888 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
894 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
889 try:
895 try:
890 return runcommand(lui, repo, cmd, fullargs, ui, options, d,
896 return runcommand(lui, repo, cmd, fullargs, ui, options, d,
891 cmdpats, cmdoptions)
897 cmdpats, cmdoptions)
892 finally:
898 finally:
893 if repo and repo != req.repo:
899 if repo and repo != req.repo:
894 repo.close()
900 repo.close()
895
901
896 def lsprofile(ui, func, fp):
902 def lsprofile(ui, func, fp):
897 format = ui.config('profiling', 'format', default='text')
903 format = ui.config('profiling', 'format', default='text')
898 field = ui.config('profiling', 'sort', default='inlinetime')
904 field = ui.config('profiling', 'sort', default='inlinetime')
899 limit = ui.configint('profiling', 'limit', default=30)
905 limit = ui.configint('profiling', 'limit', default=30)
900 climit = ui.configint('profiling', 'nested', default=0)
906 climit = ui.configint('profiling', 'nested', default=0)
901
907
902 if format not in ['text', 'kcachegrind']:
908 if format not in ['text', 'kcachegrind']:
903 ui.warn(_("unrecognized profiling format '%s'"
909 ui.warn(_("unrecognized profiling format '%s'"
904 " - Ignored\n") % format)
910 " - Ignored\n") % format)
905 format = 'text'
911 format = 'text'
906
912
907 try:
913 try:
908 from . import lsprof
914 from . import lsprof
909 except ImportError:
915 except ImportError:
910 raise error.Abort(_(
916 raise error.Abort(_(
911 'lsprof not available - install from '
917 'lsprof not available - install from '
912 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/'))
918 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/'))
913 p = lsprof.Profiler()
919 p = lsprof.Profiler()
914 p.enable(subcalls=True)
920 p.enable(subcalls=True)
915 try:
921 try:
916 return func()
922 return func()
917 finally:
923 finally:
918 p.disable()
924 p.disable()
919
925
920 if format == 'kcachegrind':
926 if format == 'kcachegrind':
921 from . import lsprofcalltree
927 from . import lsprofcalltree
922 calltree = lsprofcalltree.KCacheGrind(p)
928 calltree = lsprofcalltree.KCacheGrind(p)
923 calltree.output(fp)
929 calltree.output(fp)
924 else:
930 else:
925 # format == 'text'
931 # format == 'text'
926 stats = lsprof.Stats(p.getstats())
932 stats = lsprof.Stats(p.getstats())
927 stats.sort(field)
933 stats.sort(field)
928 stats.pprint(limit=limit, file=fp, climit=climit)
934 stats.pprint(limit=limit, file=fp, climit=climit)
929
935
930 def flameprofile(ui, func, fp):
936 def flameprofile(ui, func, fp):
931 try:
937 try:
932 from flamegraph import flamegraph
938 from flamegraph import flamegraph
933 except ImportError:
939 except ImportError:
934 raise error.Abort(_(
940 raise error.Abort(_(
935 'flamegraph not available - install from '
941 'flamegraph not available - install from '
936 'https://github.com/evanhempel/python-flamegraph'))
942 'https://github.com/evanhempel/python-flamegraph'))
937 # developer config: profiling.freq
943 # developer config: profiling.freq
938 freq = ui.configint('profiling', 'freq', default=1000)
944 freq = ui.configint('profiling', 'freq', default=1000)
939 filter_ = None
945 filter_ = None
940 collapse_recursion = True
946 collapse_recursion = True
941 thread = flamegraph.ProfileThread(fp, 1.0 / freq,
947 thread = flamegraph.ProfileThread(fp, 1.0 / freq,
942 filter_, collapse_recursion)
948 filter_, collapse_recursion)
943 start_time = time.clock()
949 start_time = time.clock()
944 try:
950 try:
945 thread.start()
951 thread.start()
946 func()
952 func()
947 finally:
953 finally:
948 thread.stop()
954 thread.stop()
949 thread.join()
955 thread.join()
950 print('Collected %d stack frames (%d unique) in %2.2f seconds.' % (
956 print('Collected %d stack frames (%d unique) in %2.2f seconds.' % (
951 time.clock() - start_time, thread.num_frames(),
957 time.clock() - start_time, thread.num_frames(),
952 thread.num_frames(unique=True)))
958 thread.num_frames(unique=True)))
953
959
954
960
955 def statprofile(ui, func, fp):
961 def statprofile(ui, func, fp):
956 try:
962 try:
957 import statprof
963 import statprof
958 except ImportError:
964 except ImportError:
959 raise error.Abort(_(
965 raise error.Abort(_(
960 'statprof not available - install using "easy_install statprof"'))
966 'statprof not available - install using "easy_install statprof"'))
961
967
962 freq = ui.configint('profiling', 'freq', default=1000)
968 freq = ui.configint('profiling', 'freq', default=1000)
963 if freq > 0:
969 if freq > 0:
964 statprof.reset(freq)
970 statprof.reset(freq)
965 else:
971 else:
966 ui.warn(_("invalid sampling frequency '%s' - ignoring\n") % freq)
972 ui.warn(_("invalid sampling frequency '%s' - ignoring\n") % freq)
967
973
968 statprof.start()
974 statprof.start()
969 try:
975 try:
970 return func()
976 return func()
971 finally:
977 finally:
972 statprof.stop()
978 statprof.stop()
973 statprof.display(fp)
979 statprof.display(fp)
974
980
975 def _runcommand(ui, options, cmd, cmdfunc):
981 def _runcommand(ui, options, cmd, cmdfunc):
976 """Enables the profiler if applicable.
982 """Enables the profiler if applicable.
977
983
978 ``profiling.enabled`` - boolean config that enables or disables profiling
984 ``profiling.enabled`` - boolean config that enables or disables profiling
979 """
985 """
980 def checkargs():
986 def checkargs():
981 try:
987 try:
982 return cmdfunc()
988 return cmdfunc()
983 except error.SignatureError:
989 except error.SignatureError:
984 raise error.CommandError(cmd, _("invalid arguments"))
990 raise error.CommandError(cmd, _("invalid arguments"))
985
991
986 if options['profile'] or ui.configbool('profiling', 'enabled'):
992 if options['profile'] or ui.configbool('profiling', 'enabled'):
987 profiler = os.getenv('HGPROF')
993 profiler = os.getenv('HGPROF')
988 if profiler is None:
994 if profiler is None:
989 profiler = ui.config('profiling', 'type', default='ls')
995 profiler = ui.config('profiling', 'type', default='ls')
990 if profiler not in ('ls', 'stat', 'flame'):
996 if profiler not in ('ls', 'stat', 'flame'):
991 ui.warn(_("unrecognized profiler '%s' - ignored\n") % profiler)
997 ui.warn(_("unrecognized profiler '%s' - ignored\n") % profiler)
992 profiler = 'ls'
998 profiler = 'ls'
993
999
994 output = ui.config('profiling', 'output')
1000 output = ui.config('profiling', 'output')
995
1001
996 if output == 'blackbox':
1002 if output == 'blackbox':
997 fp = util.stringio()
1003 fp = util.stringio()
998 elif output:
1004 elif output:
999 path = ui.expandpath(output)
1005 path = ui.expandpath(output)
1000 fp = open(path, 'wb')
1006 fp = open(path, 'wb')
1001 else:
1007 else:
1002 fp = sys.stderr
1008 fp = sys.stderr
1003
1009
1004 try:
1010 try:
1005 if profiler == 'ls':
1011 if profiler == 'ls':
1006 return lsprofile(ui, checkargs, fp)
1012 return lsprofile(ui, checkargs, fp)
1007 elif profiler == 'flame':
1013 elif profiler == 'flame':
1008 return flameprofile(ui, checkargs, fp)
1014 return flameprofile(ui, checkargs, fp)
1009 else:
1015 else:
1010 return statprofile(ui, checkargs, fp)
1016 return statprofile(ui, checkargs, fp)
1011 finally:
1017 finally:
1012 if output:
1018 if output:
1013 if output == 'blackbox':
1019 if output == 'blackbox':
1014 val = "Profile:\n%s" % fp.getvalue()
1020 val = "Profile:\n%s" % fp.getvalue()
1015 # ui.log treats the input as a format string,
1021 # ui.log treats the input as a format string,
1016 # so we need to escape any % signs.
1022 # so we need to escape any % signs.
1017 val = val.replace('%', '%%')
1023 val = val.replace('%', '%%')
1018 ui.log('profile', val)
1024 ui.log('profile', val)
1019 fp.close()
1025 fp.close()
1020 else:
1026 else:
1021 return checkargs()
1027 return checkargs()
1022
1028
1023 def _exceptionwarning(ui):
1029 def _exceptionwarning(ui):
1024 """Produce a warning message for the current active exception"""
1030 """Produce a warning message for the current active exception"""
1025
1031
1026 # For compatibility checking, we discard the portion of the hg
1032 # For compatibility checking, we discard the portion of the hg
1027 # version after the + on the assumption that if a "normal
1033 # version after the + on the assumption that if a "normal
1028 # user" is running a build with a + in it the packager
1034 # user" is running a build with a + in it the packager
1029 # probably built from fairly close to a tag and anyone with a
1035 # probably built from fairly close to a tag and anyone with a
1030 # 'make local' copy of hg (where the version number can be out
1036 # 'make local' copy of hg (where the version number can be out
1031 # of date) will be clueful enough to notice the implausible
1037 # of date) will be clueful enough to notice the implausible
1032 # version number and try updating.
1038 # version number and try updating.
1033 ct = util.versiontuple(n=2)
1039 ct = util.versiontuple(n=2)
1034 worst = None, ct, ''
1040 worst = None, ct, ''
1035 if ui.config('ui', 'supportcontact', None) is None:
1041 if ui.config('ui', 'supportcontact', None) is None:
1036 for name, mod in extensions.extensions():
1042 for name, mod in extensions.extensions():
1037 testedwith = getattr(mod, 'testedwith', '')
1043 testedwith = getattr(mod, 'testedwith', '')
1038 report = getattr(mod, 'buglink', _('the extension author.'))
1044 report = getattr(mod, 'buglink', _('the extension author.'))
1039 if not testedwith.strip():
1045 if not testedwith.strip():
1040 # We found an untested extension. It's likely the culprit.
1046 # We found an untested extension. It's likely the culprit.
1041 worst = name, 'unknown', report
1047 worst = name, 'unknown', report
1042 break
1048 break
1043
1049
1044 # Never blame on extensions bundled with Mercurial.
1050 # Never blame on extensions bundled with Mercurial.
1045 if testedwith == 'internal':
1051 if testedwith == 'internal':
1046 continue
1052 continue
1047
1053
1048 tested = [util.versiontuple(t, 2) for t in testedwith.split()]
1054 tested = [util.versiontuple(t, 2) for t in testedwith.split()]
1049 if ct in tested:
1055 if ct in tested:
1050 continue
1056 continue
1051
1057
1052 lower = [t for t in tested if t < ct]
1058 lower = [t for t in tested if t < ct]
1053 nearest = max(lower or tested)
1059 nearest = max(lower or tested)
1054 if worst[0] is None or nearest < worst[1]:
1060 if worst[0] is None or nearest < worst[1]:
1055 worst = name, nearest, report
1061 worst = name, nearest, report
1056 if worst[0] is not None:
1062 if worst[0] is not None:
1057 name, testedwith, report = worst
1063 name, testedwith, report = worst
1058 if not isinstance(testedwith, str):
1064 if not isinstance(testedwith, str):
1059 testedwith = '.'.join([str(c) for c in testedwith])
1065 testedwith = '.'.join([str(c) for c in testedwith])
1060 warning = (_('** Unknown exception encountered with '
1066 warning = (_('** Unknown exception encountered with '
1061 'possibly-broken third-party extension %s\n'
1067 'possibly-broken third-party extension %s\n'
1062 '** which supports versions %s of Mercurial.\n'
1068 '** which supports versions %s of Mercurial.\n'
1063 '** Please disable %s and try your action again.\n'
1069 '** Please disable %s and try your action again.\n'
1064 '** If that fixes the bug please report it to %s\n')
1070 '** If that fixes the bug please report it to %s\n')
1065 % (name, testedwith, name, report))
1071 % (name, testedwith, name, report))
1066 else:
1072 else:
1067 bugtracker = ui.config('ui', 'supportcontact', None)
1073 bugtracker = ui.config('ui', 'supportcontact', None)
1068 if bugtracker is None:
1074 if bugtracker is None:
1069 bugtracker = _("https://mercurial-scm.org/wiki/BugTracker")
1075 bugtracker = _("https://mercurial-scm.org/wiki/BugTracker")
1070 warning = (_("** unknown exception encountered, "
1076 warning = (_("** unknown exception encountered, "
1071 "please report by visiting\n** ") + bugtracker + '\n')
1077 "please report by visiting\n** ") + bugtracker + '\n')
1072 warning += ((_("** Python %s\n") % sys.version.replace('\n', '')) +
1078 warning += ((_("** Python %s\n") % sys.version.replace('\n', '')) +
1073 (_("** Mercurial Distributed SCM (version %s)\n") %
1079 (_("** Mercurial Distributed SCM (version %s)\n") %
1074 util.version()) +
1080 util.version()) +
1075 (_("** Extensions loaded: %s\n") %
1081 (_("** Extensions loaded: %s\n") %
1076 ", ".join([x[0] for x in extensions.extensions()])))
1082 ", ".join([x[0] for x in extensions.extensions()])))
1077 return warning
1083 return warning
1078
1084
1079 def handlecommandexception(ui):
1085 def handlecommandexception(ui):
1080 """Produce a warning message for broken commands
1086 """Produce a warning message for broken commands
1081
1087
1082 Called when handling an exception; the exception is reraised if
1088 Called when handling an exception; the exception is reraised if
1083 this function returns False, ignored otherwise.
1089 this function returns False, ignored otherwise.
1084 """
1090 """
1085 warning = _exceptionwarning(ui)
1091 warning = _exceptionwarning(ui)
1086 ui.log("commandexception", "%s\n%s\n", warning, traceback.format_exc())
1092 ui.log("commandexception", "%s\n%s\n", warning, traceback.format_exc())
1087 ui.warn(warning)
1093 ui.warn(warning)
1088 return False # re-raise the exception
1094 return False # re-raise the exception
@@ -1,2083 +1,2092 b''
1 The Mercurial system uses a set of configuration files to control
1 The Mercurial system uses a set of configuration files to control
2 aspects of its behavior.
2 aspects of its behavior.
3
3
4 Troubleshooting
4 Troubleshooting
5 ===============
5 ===============
6
6
7 If you're having problems with your configuration,
7 If you're having problems with your configuration,
8 :hg:`config --debug` can help you understand what is introducing
8 :hg:`config --debug` can help you understand what is introducing
9 a setting into your environment.
9 a setting into your environment.
10
10
11 See :hg:`help config.syntax` and :hg:`help config.files`
11 See :hg:`help config.syntax` and :hg:`help config.files`
12 for information about how and where to override things.
12 for information about how and where to override things.
13
13
14 Structure
14 Structure
15 =========
15 =========
16
16
17 The configuration files use a simple ini-file format. A configuration
17 The configuration files use a simple ini-file format. A configuration
18 file consists of sections, led by a ``[section]`` header and followed
18 file consists of sections, led by a ``[section]`` header and followed
19 by ``name = value`` entries::
19 by ``name = value`` entries::
20
20
21 [ui]
21 [ui]
22 username = Firstname Lastname <firstname.lastname@example.net>
22 username = Firstname Lastname <firstname.lastname@example.net>
23 verbose = True
23 verbose = True
24
24
25 The above entries will be referred to as ``ui.username`` and
25 The above entries will be referred to as ``ui.username`` and
26 ``ui.verbose``, respectively. See :hg:`help config.syntax`.
26 ``ui.verbose``, respectively. See :hg:`help config.syntax`.
27
27
28 Files
28 Files
29 =====
29 =====
30
30
31 Mercurial reads configuration data from several files, if they exist.
31 Mercurial reads configuration data from several files, if they exist.
32 These files do not exist by default and you will have to create the
32 These files do not exist by default and you will have to create the
33 appropriate configuration files yourself:
33 appropriate configuration files yourself:
34
34
35 Local configuration is put into the per-repository ``<repo>/.hg/hgrc`` file.
35 Local configuration is put into the per-repository ``<repo>/.hg/hgrc`` file.
36
36
37 Global configuration like the username setting is typically put into:
37 Global configuration like the username setting is typically put into:
38
38
39 .. container:: windows
39 .. container:: windows
40
40
41 - ``%USERPROFILE%\mercurial.ini`` (on Windows)
41 - ``%USERPROFILE%\mercurial.ini`` (on Windows)
42
42
43 .. container:: unix.plan9
43 .. container:: unix.plan9
44
44
45 - ``$HOME/.hgrc`` (on Unix, Plan9)
45 - ``$HOME/.hgrc`` (on Unix, Plan9)
46
46
47 The names of these files depend on the system on which Mercurial is
47 The names of these files depend on the system on which Mercurial is
48 installed. ``*.rc`` files from a single directory are read in
48 installed. ``*.rc`` files from a single directory are read in
49 alphabetical order, later ones overriding earlier ones. Where multiple
49 alphabetical order, later ones overriding earlier ones. Where multiple
50 paths are given below, settings from earlier paths override later
50 paths are given below, settings from earlier paths override later
51 ones.
51 ones.
52
52
53 .. container:: verbose.unix
53 .. container:: verbose.unix
54
54
55 On Unix, the following files are consulted:
55 On Unix, the following files are consulted:
56
56
57 - ``<repo>/.hg/hgrc`` (per-repository)
57 - ``<repo>/.hg/hgrc`` (per-repository)
58 - ``$HOME/.hgrc`` (per-user)
58 - ``$HOME/.hgrc`` (per-user)
59 - ``<install-root>/etc/mercurial/hgrc`` (per-installation)
59 - ``<install-root>/etc/mercurial/hgrc`` (per-installation)
60 - ``<install-root>/etc/mercurial/hgrc.d/*.rc`` (per-installation)
60 - ``<install-root>/etc/mercurial/hgrc.d/*.rc`` (per-installation)
61 - ``/etc/mercurial/hgrc`` (per-system)
61 - ``/etc/mercurial/hgrc`` (per-system)
62 - ``/etc/mercurial/hgrc.d/*.rc`` (per-system)
62 - ``/etc/mercurial/hgrc.d/*.rc`` (per-system)
63 - ``<internal>/default.d/*.rc`` (defaults)
63 - ``<internal>/default.d/*.rc`` (defaults)
64
64
65 .. container:: verbose.windows
65 .. container:: verbose.windows
66
66
67 On Windows, the following files are consulted:
67 On Windows, the following files are consulted:
68
68
69 - ``<repo>/.hg/hgrc`` (per-repository)
69 - ``<repo>/.hg/hgrc`` (per-repository)
70 - ``%USERPROFILE%\.hgrc`` (per-user)
70 - ``%USERPROFILE%\.hgrc`` (per-user)
71 - ``%USERPROFILE%\Mercurial.ini`` (per-user)
71 - ``%USERPROFILE%\Mercurial.ini`` (per-user)
72 - ``%HOME%\.hgrc`` (per-user)
72 - ``%HOME%\.hgrc`` (per-user)
73 - ``%HOME%\Mercurial.ini`` (per-user)
73 - ``%HOME%\Mercurial.ini`` (per-user)
74 - ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial`` (per-installation)
74 - ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial`` (per-installation)
75 - ``<install-dir>\hgrc.d\*.rc`` (per-installation)
75 - ``<install-dir>\hgrc.d\*.rc`` (per-installation)
76 - ``<install-dir>\Mercurial.ini`` (per-installation)
76 - ``<install-dir>\Mercurial.ini`` (per-installation)
77 - ``<internal>/default.d/*.rc`` (defaults)
77 - ``<internal>/default.d/*.rc`` (defaults)
78
78
79 .. note::
79 .. note::
80
80
81 The registry key ``HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mercurial``
81 The registry key ``HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mercurial``
82 is used when running 32-bit Python on 64-bit Windows.
82 is used when running 32-bit Python on 64-bit Windows.
83
83
84 .. container:: windows
84 .. container:: windows
85
85
86 On Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``.
86 On Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``.
87
87
88 .. container:: verbose.plan9
88 .. container:: verbose.plan9
89
89
90 On Plan9, the following files are consulted:
90 On Plan9, the following files are consulted:
91
91
92 - ``<repo>/.hg/hgrc`` (per-repository)
92 - ``<repo>/.hg/hgrc`` (per-repository)
93 - ``$home/lib/hgrc`` (per-user)
93 - ``$home/lib/hgrc`` (per-user)
94 - ``<install-root>/lib/mercurial/hgrc`` (per-installation)
94 - ``<install-root>/lib/mercurial/hgrc`` (per-installation)
95 - ``<install-root>/lib/mercurial/hgrc.d/*.rc`` (per-installation)
95 - ``<install-root>/lib/mercurial/hgrc.d/*.rc`` (per-installation)
96 - ``/lib/mercurial/hgrc`` (per-system)
96 - ``/lib/mercurial/hgrc`` (per-system)
97 - ``/lib/mercurial/hgrc.d/*.rc`` (per-system)
97 - ``/lib/mercurial/hgrc.d/*.rc`` (per-system)
98 - ``<internal>/default.d/*.rc`` (defaults)
98 - ``<internal>/default.d/*.rc`` (defaults)
99
99
100 Per-repository configuration options only apply in a
100 Per-repository configuration options only apply in a
101 particular repository. This file is not version-controlled, and
101 particular repository. This file is not version-controlled, and
102 will not get transferred during a "clone" operation. Options in
102 will not get transferred during a "clone" operation. Options in
103 this file override options in all other configuration files.
103 this file override options in all other configuration files.
104
104
105 .. container:: unix.plan9
105 .. container:: unix.plan9
106
106
107 On Plan 9 and Unix, most of this file will be ignored if it doesn't
107 On Plan 9 and Unix, most of this file will be ignored if it doesn't
108 belong to a trusted user or to a trusted group. See
108 belong to a trusted user or to a trusted group. See
109 :hg:`help config.trusted` for more details.
109 :hg:`help config.trusted` for more details.
110
110
111 Per-user configuration file(s) are for the user running Mercurial. Options
111 Per-user configuration file(s) are for the user running Mercurial. Options
112 in these files apply to all Mercurial commands executed by this user in any
112 in these files apply to all Mercurial commands executed by this user in any
113 directory. Options in these files override per-system and per-installation
113 directory. Options in these files override per-system and per-installation
114 options.
114 options.
115
115
116 Per-installation configuration files are searched for in the
116 Per-installation configuration files are searched for in the
117 directory where Mercurial is installed. ``<install-root>`` is the
117 directory where Mercurial is installed. ``<install-root>`` is the
118 parent directory of the **hg** executable (or symlink) being run.
118 parent directory of the **hg** executable (or symlink) being run.
119
119
120 .. container:: unix.plan9
120 .. container:: unix.plan9
121
121
122 For example, if installed in ``/shared/tools/bin/hg``, Mercurial
122 For example, if installed in ``/shared/tools/bin/hg``, Mercurial
123 will look in ``/shared/tools/etc/mercurial/hgrc``. Options in these
123 will look in ``/shared/tools/etc/mercurial/hgrc``. Options in these
124 files apply to all Mercurial commands executed by any user in any
124 files apply to all Mercurial commands executed by any user in any
125 directory.
125 directory.
126
126
127 Per-installation configuration files are for the system on
127 Per-installation configuration files are for the system on
128 which Mercurial is running. Options in these files apply to all
128 which Mercurial is running. Options in these files apply to all
129 Mercurial commands executed by any user in any directory. Registry
129 Mercurial commands executed by any user in any directory. Registry
130 keys contain PATH-like strings, every part of which must reference
130 keys contain PATH-like strings, every part of which must reference
131 a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
131 a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
132 be read. Mercurial checks each of these locations in the specified
132 be read. Mercurial checks each of these locations in the specified
133 order until one or more configuration files are detected.
133 order until one or more configuration files are detected.
134
134
135 Per-system configuration files are for the system on which Mercurial
135 Per-system configuration files are for the system on which Mercurial
136 is running. Options in these files apply to all Mercurial commands
136 is running. Options in these files apply to all Mercurial commands
137 executed by any user in any directory. Options in these files
137 executed by any user in any directory. Options in these files
138 override per-installation options.
138 override per-installation options.
139
139
140 Mercurial comes with some default configuration. The default configuration
140 Mercurial comes with some default configuration. The default configuration
141 files are installed with Mercurial and will be overwritten on upgrades. Default
141 files are installed with Mercurial and will be overwritten on upgrades. Default
142 configuration files should never be edited by users or administrators but can
142 configuration files should never be edited by users or administrators but can
143 be overridden in other configuration files. So far the directory only contains
143 be overridden in other configuration files. So far the directory only contains
144 merge tool configuration but packagers can also put other default configuration
144 merge tool configuration but packagers can also put other default configuration
145 there.
145 there.
146
146
147 Syntax
147 Syntax
148 ======
148 ======
149
149
150 A configuration file consists of sections, led by a ``[section]`` header
150 A configuration file consists of sections, led by a ``[section]`` header
151 and followed by ``name = value`` entries (sometimes called
151 and followed by ``name = value`` entries (sometimes called
152 ``configuration keys``)::
152 ``configuration keys``)::
153
153
154 [spam]
154 [spam]
155 eggs=ham
155 eggs=ham
156 green=
156 green=
157 eggs
157 eggs
158
158
159 Each line contains one entry. If the lines that follow are indented,
159 Each line contains one entry. If the lines that follow are indented,
160 they are treated as continuations of that entry. Leading whitespace is
160 they are treated as continuations of that entry. Leading whitespace is
161 removed from values. Empty lines are skipped. Lines beginning with
161 removed from values. Empty lines are skipped. Lines beginning with
162 ``#`` or ``;`` are ignored and may be used to provide comments.
162 ``#`` or ``;`` are ignored and may be used to provide comments.
163
163
164 Configuration keys can be set multiple times, in which case Mercurial
164 Configuration keys can be set multiple times, in which case Mercurial
165 will use the value that was configured last. As an example::
165 will use the value that was configured last. As an example::
166
166
167 [spam]
167 [spam]
168 eggs=large
168 eggs=large
169 ham=serrano
169 ham=serrano
170 eggs=small
170 eggs=small
171
171
172 This would set the configuration key named ``eggs`` to ``small``.
172 This would set the configuration key named ``eggs`` to ``small``.
173
173
174 It is also possible to define a section multiple times. A section can
174 It is also possible to define a section multiple times. A section can
175 be redefined on the same and/or on different configuration files. For
175 be redefined on the same and/or on different configuration files. For
176 example::
176 example::
177
177
178 [foo]
178 [foo]
179 eggs=large
179 eggs=large
180 ham=serrano
180 ham=serrano
181 eggs=small
181 eggs=small
182
182
183 [bar]
183 [bar]
184 eggs=ham
184 eggs=ham
185 green=
185 green=
186 eggs
186 eggs
187
187
188 [foo]
188 [foo]
189 ham=prosciutto
189 ham=prosciutto
190 eggs=medium
190 eggs=medium
191 bread=toasted
191 bread=toasted
192
192
193 This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
193 This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
194 of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
194 of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
195 respectively. As you can see there only thing that matters is the last
195 respectively. As you can see there only thing that matters is the last
196 value that was set for each of the configuration keys.
196 value that was set for each of the configuration keys.
197
197
198 If a configuration key is set multiple times in different
198 If a configuration key is set multiple times in different
199 configuration files the final value will depend on the order in which
199 configuration files the final value will depend on the order in which
200 the different configuration files are read, with settings from earlier
200 the different configuration files are read, with settings from earlier
201 paths overriding later ones as described on the ``Files`` section
201 paths overriding later ones as described on the ``Files`` section
202 above.
202 above.
203
203
204 A line of the form ``%include file`` will include ``file`` into the
204 A line of the form ``%include file`` will include ``file`` into the
205 current configuration file. The inclusion is recursive, which means
205 current configuration file. The inclusion is recursive, which means
206 that included files can include other files. Filenames are relative to
206 that included files can include other files. Filenames are relative to
207 the configuration file in which the ``%include`` directive is found.
207 the configuration file in which the ``%include`` directive is found.
208 Environment variables and ``~user`` constructs are expanded in
208 Environment variables and ``~user`` constructs are expanded in
209 ``file``. This lets you do something like::
209 ``file``. This lets you do something like::
210
210
211 %include ~/.hgrc.d/$HOST.rc
211 %include ~/.hgrc.d/$HOST.rc
212
212
213 to include a different configuration file on each computer you use.
213 to include a different configuration file on each computer you use.
214
214
215 A line with ``%unset name`` will remove ``name`` from the current
215 A line with ``%unset name`` will remove ``name`` from the current
216 section, if it has been set previously.
216 section, if it has been set previously.
217
217
218 The values are either free-form text strings, lists of text strings,
218 The values are either free-form text strings, lists of text strings,
219 or Boolean values. Boolean values can be set to true using any of "1",
219 or Boolean values. Boolean values can be set to true using any of "1",
220 "yes", "true", or "on" and to false using "0", "no", "false", or "off"
220 "yes", "true", or "on" and to false using "0", "no", "false", or "off"
221 (all case insensitive).
221 (all case insensitive).
222
222
223 List values are separated by whitespace or comma, except when values are
223 List values are separated by whitespace or comma, except when values are
224 placed in double quotation marks::
224 placed in double quotation marks::
225
225
226 allow_read = "John Doe, PhD", brian, betty
226 allow_read = "John Doe, PhD", brian, betty
227
227
228 Quotation marks can be escaped by prefixing them with a backslash. Only
228 Quotation marks can be escaped by prefixing them with a backslash. Only
229 quotation marks at the beginning of a word is counted as a quotation
229 quotation marks at the beginning of a word is counted as a quotation
230 (e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
230 (e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
231
231
232 Sections
232 Sections
233 ========
233 ========
234
234
235 This section describes the different sections that may appear in a
235 This section describes the different sections that may appear in a
236 Mercurial configuration file, the purpose of each section, its possible
236 Mercurial configuration file, the purpose of each section, its possible
237 keys, and their possible values.
237 keys, and their possible values.
238
238
239 ``alias``
239 ``alias``
240 ---------
240 ---------
241
241
242 Defines command aliases.
242 Defines command aliases.
243
243
244 Aliases allow you to define your own commands in terms of other
244 Aliases allow you to define your own commands in terms of other
245 commands (or aliases), optionally including arguments. Positional
245 commands (or aliases), optionally including arguments. Positional
246 arguments in the form of ``$1``, ``$2``, etc. in the alias definition
246 arguments in the form of ``$1``, ``$2``, etc. in the alias definition
247 are expanded by Mercurial before execution. Positional arguments not
247 are expanded by Mercurial before execution. Positional arguments not
248 already used by ``$N`` in the definition are put at the end of the
248 already used by ``$N`` in the definition are put at the end of the
249 command to be executed.
249 command to be executed.
250
250
251 Alias definitions consist of lines of the form::
251 Alias definitions consist of lines of the form::
252
252
253 <alias> = <command> [<argument>]...
253 <alias> = <command> [<argument>]...
254
254
255 For example, this definition::
255 For example, this definition::
256
256
257 latest = log --limit 5
257 latest = log --limit 5
258
258
259 creates a new command ``latest`` that shows only the five most recent
259 creates a new command ``latest`` that shows only the five most recent
260 changesets. You can define subsequent aliases using earlier ones::
260 changesets. You can define subsequent aliases using earlier ones::
261
261
262 stable5 = latest -b stable
262 stable5 = latest -b stable
263
263
264 .. note::
264 .. note::
265
265
266 It is possible to create aliases with the same names as
266 It is possible to create aliases with the same names as
267 existing commands, which will then override the original
267 existing commands, which will then override the original
268 definitions. This is almost always a bad idea!
268 definitions. This is almost always a bad idea!
269
269
270 An alias can start with an exclamation point (``!``) to make it a
270 An alias can start with an exclamation point (``!``) to make it a
271 shell alias. A shell alias is executed with the shell and will let you
271 shell alias. A shell alias is executed with the shell and will let you
272 run arbitrary commands. As an example, ::
272 run arbitrary commands. As an example, ::
273
273
274 echo = !echo $@
274 echo = !echo $@
275
275
276 will let you do ``hg echo foo`` to have ``foo`` printed in your
276 will let you do ``hg echo foo`` to have ``foo`` printed in your
277 terminal. A better example might be::
277 terminal. A better example might be::
278
278
279 purge = !$HG status --no-status --unknown -0 re: | xargs -0 rm
279 purge = !$HG status --no-status --unknown -0 re: | xargs -0 rm
280
280
281 which will make ``hg purge`` delete all unknown files in the
281 which will make ``hg purge`` delete all unknown files in the
282 repository in the same manner as the purge extension.
282 repository in the same manner as the purge extension.
283
283
284 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
284 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
285 expand to the command arguments. Unmatched arguments are
285 expand to the command arguments. Unmatched arguments are
286 removed. ``$0`` expands to the alias name and ``$@`` expands to all
286 removed. ``$0`` expands to the alias name and ``$@`` expands to all
287 arguments separated by a space. ``"$@"`` (with quotes) expands to all
287 arguments separated by a space. ``"$@"`` (with quotes) expands to all
288 arguments quoted individually and separated by a space. These expansions
288 arguments quoted individually and separated by a space. These expansions
289 happen before the command is passed to the shell.
289 happen before the command is passed to the shell.
290
290
291 Shell aliases are executed in an environment where ``$HG`` expands to
291 Shell aliases are executed in an environment where ``$HG`` expands to
292 the path of the Mercurial that was used to execute the alias. This is
292 the path of the Mercurial that was used to execute the alias. This is
293 useful when you want to call further Mercurial commands in a shell
293 useful when you want to call further Mercurial commands in a shell
294 alias, as was done above for the purge alias. In addition,
294 alias, as was done above for the purge alias. In addition,
295 ``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
295 ``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
296 echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
296 echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
297
297
298 .. note::
298 .. note::
299
299
300 Some global configuration options such as ``-R`` are
300 Some global configuration options such as ``-R`` are
301 processed before shell aliases and will thus not be passed to
301 processed before shell aliases and will thus not be passed to
302 aliases.
302 aliases.
303
303
304
304
305 ``annotate``
305 ``annotate``
306 ------------
306 ------------
307
307
308 Settings used when displaying file annotations. All values are
308 Settings used when displaying file annotations. All values are
309 Booleans and default to False. See :hg:`help config.diff` for
309 Booleans and default to False. See :hg:`help config.diff` for
310 related options for the diff command.
310 related options for the diff command.
311
311
312 ``ignorews``
312 ``ignorews``
313 Ignore white space when comparing lines.
313 Ignore white space when comparing lines.
314
314
315 ``ignorewsamount``
315 ``ignorewsamount``
316 Ignore changes in the amount of white space.
316 Ignore changes in the amount of white space.
317
317
318 ``ignoreblanklines``
318 ``ignoreblanklines``
319 Ignore changes whose lines are all blank.
319 Ignore changes whose lines are all blank.
320
320
321
321
322 ``auth``
322 ``auth``
323 --------
323 --------
324
324
325 Authentication credentials for HTTP authentication. This section
325 Authentication credentials for HTTP authentication. This section
326 allows you to store usernames and passwords for use when logging
326 allows you to store usernames and passwords for use when logging
327 *into* HTTP servers. See :hg:`help config.web` if
327 *into* HTTP servers. See :hg:`help config.web` if
328 you want to configure *who* can login to your HTTP server.
328 you want to configure *who* can login to your HTTP server.
329
329
330 Each line has the following format::
330 Each line has the following format::
331
331
332 <name>.<argument> = <value>
332 <name>.<argument> = <value>
333
333
334 where ``<name>`` is used to group arguments into authentication
334 where ``<name>`` is used to group arguments into authentication
335 entries. Example::
335 entries. Example::
336
336
337 foo.prefix = hg.intevation.de/mercurial
337 foo.prefix = hg.intevation.de/mercurial
338 foo.username = foo
338 foo.username = foo
339 foo.password = bar
339 foo.password = bar
340 foo.schemes = http https
340 foo.schemes = http https
341
341
342 bar.prefix = secure.example.org
342 bar.prefix = secure.example.org
343 bar.key = path/to/file.key
343 bar.key = path/to/file.key
344 bar.cert = path/to/file.cert
344 bar.cert = path/to/file.cert
345 bar.schemes = https
345 bar.schemes = https
346
346
347 Supported arguments:
347 Supported arguments:
348
348
349 ``prefix``
349 ``prefix``
350 Either ``*`` or a URI prefix with or without the scheme part.
350 Either ``*`` or a URI prefix with or without the scheme part.
351 The authentication entry with the longest matching prefix is used
351 The authentication entry with the longest matching prefix is used
352 (where ``*`` matches everything and counts as a match of length
352 (where ``*`` matches everything and counts as a match of length
353 1). If the prefix doesn't include a scheme, the match is performed
353 1). If the prefix doesn't include a scheme, the match is performed
354 against the URI with its scheme stripped as well, and the schemes
354 against the URI with its scheme stripped as well, and the schemes
355 argument, q.v., is then subsequently consulted.
355 argument, q.v., is then subsequently consulted.
356
356
357 ``username``
357 ``username``
358 Optional. Username to authenticate with. If not given, and the
358 Optional. Username to authenticate with. If not given, and the
359 remote site requires basic or digest authentication, the user will
359 remote site requires basic or digest authentication, the user will
360 be prompted for it. Environment variables are expanded in the
360 be prompted for it. Environment variables are expanded in the
361 username letting you do ``foo.username = $USER``. If the URI
361 username letting you do ``foo.username = $USER``. If the URI
362 includes a username, only ``[auth]`` entries with a matching
362 includes a username, only ``[auth]`` entries with a matching
363 username or without a username will be considered.
363 username or without a username will be considered.
364
364
365 ``password``
365 ``password``
366 Optional. Password to authenticate with. If not given, and the
366 Optional. Password to authenticate with. If not given, and the
367 remote site requires basic or digest authentication, the user
367 remote site requires basic or digest authentication, the user
368 will be prompted for it.
368 will be prompted for it.
369
369
370 ``key``
370 ``key``
371 Optional. PEM encoded client certificate key file. Environment
371 Optional. PEM encoded client certificate key file. Environment
372 variables are expanded in the filename.
372 variables are expanded in the filename.
373
373
374 ``cert``
374 ``cert``
375 Optional. PEM encoded client certificate chain file. Environment
375 Optional. PEM encoded client certificate chain file. Environment
376 variables are expanded in the filename.
376 variables are expanded in the filename.
377
377
378 ``schemes``
378 ``schemes``
379 Optional. Space separated list of URI schemes to use this
379 Optional. Space separated list of URI schemes to use this
380 authentication entry with. Only used if the prefix doesn't include
380 authentication entry with. Only used if the prefix doesn't include
381 a scheme. Supported schemes are http and https. They will match
381 a scheme. Supported schemes are http and https. They will match
382 static-http and static-https respectively, as well.
382 static-http and static-https respectively, as well.
383 (default: https)
383 (default: https)
384
384
385 If no suitable authentication entry is found, the user is prompted
385 If no suitable authentication entry is found, the user is prompted
386 for credentials as usual if required by the remote.
386 for credentials as usual if required by the remote.
387
387
388
388
389 ``committemplate``
389 ``committemplate``
390 ------------------
390 ------------------
391
391
392 ``changeset``
392 ``changeset``
393 String: configuration in this section is used as the template to
393 String: configuration in this section is used as the template to
394 customize the text shown in the editor when committing.
394 customize the text shown in the editor when committing.
395
395
396 In addition to pre-defined template keywords, commit log specific one
396 In addition to pre-defined template keywords, commit log specific one
397 below can be used for customization:
397 below can be used for customization:
398
398
399 ``extramsg``
399 ``extramsg``
400 String: Extra message (typically 'Leave message empty to abort
400 String: Extra message (typically 'Leave message empty to abort
401 commit.'). This may be changed by some commands or extensions.
401 commit.'). This may be changed by some commands or extensions.
402
402
403 For example, the template configuration below shows as same text as
403 For example, the template configuration below shows as same text as
404 one shown by default::
404 one shown by default::
405
405
406 [committemplate]
406 [committemplate]
407 changeset = {desc}\n\n
407 changeset = {desc}\n\n
408 HG: Enter commit message. Lines beginning with 'HG:' are removed.
408 HG: Enter commit message. Lines beginning with 'HG:' are removed.
409 HG: {extramsg}
409 HG: {extramsg}
410 HG: --
410 HG: --
411 HG: user: {author}\n{ifeq(p2rev, "-1", "",
411 HG: user: {author}\n{ifeq(p2rev, "-1", "",
412 "HG: branch merge\n")
412 "HG: branch merge\n")
413 }HG: branch '{branch}'\n{if(activebookmark,
413 }HG: branch '{branch}'\n{if(activebookmark,
414 "HG: bookmark '{activebookmark}'\n") }{subrepos %
414 "HG: bookmark '{activebookmark}'\n") }{subrepos %
415 "HG: subrepo {subrepo}\n" }{file_adds %
415 "HG: subrepo {subrepo}\n" }{file_adds %
416 "HG: added {file}\n" }{file_mods %
416 "HG: added {file}\n" }{file_mods %
417 "HG: changed {file}\n" }{file_dels %
417 "HG: changed {file}\n" }{file_dels %
418 "HG: removed {file}\n" }{if(files, "",
418 "HG: removed {file}\n" }{if(files, "",
419 "HG: no files changed\n")}
419 "HG: no files changed\n")}
420
420
421 .. note::
421 .. note::
422
422
423 For some problematic encodings (see :hg:`help win32mbcs` for
423 For some problematic encodings (see :hg:`help win32mbcs` for
424 detail), this customization should be configured carefully, to
424 detail), this customization should be configured carefully, to
425 avoid showing broken characters.
425 avoid showing broken characters.
426
426
427 For example, if a multibyte character ending with backslash (0x5c) is
427 For example, if a multibyte character ending with backslash (0x5c) is
428 followed by the ASCII character 'n' in the customized template,
428 followed by the ASCII character 'n' in the customized template,
429 the sequence of backslash and 'n' is treated as line-feed unexpectedly
429 the sequence of backslash and 'n' is treated as line-feed unexpectedly
430 (and the multibyte character is broken, too).
430 (and the multibyte character is broken, too).
431
431
432 Customized template is used for commands below (``--edit`` may be
432 Customized template is used for commands below (``--edit`` may be
433 required):
433 required):
434
434
435 - :hg:`backout`
435 - :hg:`backout`
436 - :hg:`commit`
436 - :hg:`commit`
437 - :hg:`fetch` (for merge commit only)
437 - :hg:`fetch` (for merge commit only)
438 - :hg:`graft`
438 - :hg:`graft`
439 - :hg:`histedit`
439 - :hg:`histedit`
440 - :hg:`import`
440 - :hg:`import`
441 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
441 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
442 - :hg:`rebase`
442 - :hg:`rebase`
443 - :hg:`shelve`
443 - :hg:`shelve`
444 - :hg:`sign`
444 - :hg:`sign`
445 - :hg:`tag`
445 - :hg:`tag`
446 - :hg:`transplant`
446 - :hg:`transplant`
447
447
448 Configuring items below instead of ``changeset`` allows showing
448 Configuring items below instead of ``changeset`` allows showing
449 customized message only for specific actions, or showing different
449 customized message only for specific actions, or showing different
450 messages for each action.
450 messages for each action.
451
451
452 - ``changeset.backout`` for :hg:`backout`
452 - ``changeset.backout`` for :hg:`backout`
453 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
453 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
454 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
454 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
455 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
455 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
456 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
456 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
457 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
457 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
458 - ``changeset.gpg.sign`` for :hg:`sign`
458 - ``changeset.gpg.sign`` for :hg:`sign`
459 - ``changeset.graft`` for :hg:`graft`
459 - ``changeset.graft`` for :hg:`graft`
460 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
460 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
461 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
461 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
462 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
462 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
463 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
463 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
464 - ``changeset.import.bypass`` for :hg:`import --bypass`
464 - ``changeset.import.bypass`` for :hg:`import --bypass`
465 - ``changeset.import.normal.merge`` for :hg:`import` on merges
465 - ``changeset.import.normal.merge`` for :hg:`import` on merges
466 - ``changeset.import.normal.normal`` for :hg:`import` on other
466 - ``changeset.import.normal.normal`` for :hg:`import` on other
467 - ``changeset.mq.qnew`` for :hg:`qnew`
467 - ``changeset.mq.qnew`` for :hg:`qnew`
468 - ``changeset.mq.qfold`` for :hg:`qfold`
468 - ``changeset.mq.qfold`` for :hg:`qfold`
469 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
469 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
470 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
470 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
471 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
471 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
472 - ``changeset.rebase.normal`` for :hg:`rebase` on other
472 - ``changeset.rebase.normal`` for :hg:`rebase` on other
473 - ``changeset.shelve.shelve`` for :hg:`shelve`
473 - ``changeset.shelve.shelve`` for :hg:`shelve`
474 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
474 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
475 - ``changeset.tag.remove`` for :hg:`tag --remove`
475 - ``changeset.tag.remove`` for :hg:`tag --remove`
476 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
476 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
477 - ``changeset.transplant.normal`` for :hg:`transplant` on other
477 - ``changeset.transplant.normal`` for :hg:`transplant` on other
478
478
479 These dot-separated lists of names are treated as hierarchical ones.
479 These dot-separated lists of names are treated as hierarchical ones.
480 For example, ``changeset.tag.remove`` customizes the commit message
480 For example, ``changeset.tag.remove`` customizes the commit message
481 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
481 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
482 commit message for :hg:`tag` regardless of ``--remove`` option.
482 commit message for :hg:`tag` regardless of ``--remove`` option.
483
483
484 When the external editor is invoked for a commit, the corresponding
484 When the external editor is invoked for a commit, the corresponding
485 dot-separated list of names without the ``changeset.`` prefix
485 dot-separated list of names without the ``changeset.`` prefix
486 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
486 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
487 variable.
487 variable.
488
488
489 In this section, items other than ``changeset`` can be referred from
489 In this section, items other than ``changeset`` can be referred from
490 others. For example, the configuration to list committed files up
490 others. For example, the configuration to list committed files up
491 below can be referred as ``{listupfiles}``::
491 below can be referred as ``{listupfiles}``::
492
492
493 [committemplate]
493 [committemplate]
494 listupfiles = {file_adds %
494 listupfiles = {file_adds %
495 "HG: added {file}\n" }{file_mods %
495 "HG: added {file}\n" }{file_mods %
496 "HG: changed {file}\n" }{file_dels %
496 "HG: changed {file}\n" }{file_dels %
497 "HG: removed {file}\n" }{if(files, "",
497 "HG: removed {file}\n" }{if(files, "",
498 "HG: no files changed\n")}
498 "HG: no files changed\n")}
499
499
500 ``decode/encode``
500 ``decode/encode``
501 -----------------
501 -----------------
502
502
503 Filters for transforming files on checkout/checkin. This would
503 Filters for transforming files on checkout/checkin. This would
504 typically be used for newline processing or other
504 typically be used for newline processing or other
505 localization/canonicalization of files.
505 localization/canonicalization of files.
506
506
507 Filters consist of a filter pattern followed by a filter command.
507 Filters consist of a filter pattern followed by a filter command.
508 Filter patterns are globs by default, rooted at the repository root.
508 Filter patterns are globs by default, rooted at the repository root.
509 For example, to match any file ending in ``.txt`` in the root
509 For example, to match any file ending in ``.txt`` in the root
510 directory only, use the pattern ``*.txt``. To match any file ending
510 directory only, use the pattern ``*.txt``. To match any file ending
511 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
511 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
512 For each file only the first matching filter applies.
512 For each file only the first matching filter applies.
513
513
514 The filter command can start with a specifier, either ``pipe:`` or
514 The filter command can start with a specifier, either ``pipe:`` or
515 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
515 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
516
516
517 A ``pipe:`` command must accept data on stdin and return the transformed
517 A ``pipe:`` command must accept data on stdin and return the transformed
518 data on stdout.
518 data on stdout.
519
519
520 Pipe example::
520 Pipe example::
521
521
522 [encode]
522 [encode]
523 # uncompress gzip files on checkin to improve delta compression
523 # uncompress gzip files on checkin to improve delta compression
524 # note: not necessarily a good idea, just an example
524 # note: not necessarily a good idea, just an example
525 *.gz = pipe: gunzip
525 *.gz = pipe: gunzip
526
526
527 [decode]
527 [decode]
528 # recompress gzip files when writing them to the working dir (we
528 # recompress gzip files when writing them to the working dir (we
529 # can safely omit "pipe:", because it's the default)
529 # can safely omit "pipe:", because it's the default)
530 *.gz = gzip
530 *.gz = gzip
531
531
532 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
532 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
533 with the name of a temporary file that contains the data to be
533 with the name of a temporary file that contains the data to be
534 filtered by the command. The string ``OUTFILE`` is replaced with the name
534 filtered by the command. The string ``OUTFILE`` is replaced with the name
535 of an empty temporary file, where the filtered data must be written by
535 of an empty temporary file, where the filtered data must be written by
536 the command.
536 the command.
537
537
538 .. container:: windows
538 .. container:: windows
539
539
540 .. note::
540 .. note::
541
541
542 The tempfile mechanism is recommended for Windows systems,
542 The tempfile mechanism is recommended for Windows systems,
543 where the standard shell I/O redirection operators often have
543 where the standard shell I/O redirection operators often have
544 strange effects and may corrupt the contents of your files.
544 strange effects and may corrupt the contents of your files.
545
545
546 This filter mechanism is used internally by the ``eol`` extension to
546 This filter mechanism is used internally by the ``eol`` extension to
547 translate line ending characters between Windows (CRLF) and Unix (LF)
547 translate line ending characters between Windows (CRLF) and Unix (LF)
548 format. We suggest you use the ``eol`` extension for convenience.
548 format. We suggest you use the ``eol`` extension for convenience.
549
549
550
550
551 ``defaults``
551 ``defaults``
552 ------------
552 ------------
553
553
554 (defaults are deprecated. Don't use them. Use aliases instead.)
554 (defaults are deprecated. Don't use them. Use aliases instead.)
555
555
556 Use the ``[defaults]`` section to define command defaults, i.e. the
556 Use the ``[defaults]`` section to define command defaults, i.e. the
557 default options/arguments to pass to the specified commands.
557 default options/arguments to pass to the specified commands.
558
558
559 The following example makes :hg:`log` run in verbose mode, and
559 The following example makes :hg:`log` run in verbose mode, and
560 :hg:`status` show only the modified files, by default::
560 :hg:`status` show only the modified files, by default::
561
561
562 [defaults]
562 [defaults]
563 log = -v
563 log = -v
564 status = -m
564 status = -m
565
565
566 The actual commands, instead of their aliases, must be used when
566 The actual commands, instead of their aliases, must be used when
567 defining command defaults. The command defaults will also be applied
567 defining command defaults. The command defaults will also be applied
568 to the aliases of the commands defined.
568 to the aliases of the commands defined.
569
569
570
570
571 ``diff``
571 ``diff``
572 --------
572 --------
573
573
574 Settings used when displaying diffs. Everything except for ``unified``
574 Settings used when displaying diffs. Everything except for ``unified``
575 is a Boolean and defaults to False. See :hg:`help config.annotate`
575 is a Boolean and defaults to False. See :hg:`help config.annotate`
576 for related options for the annotate command.
576 for related options for the annotate command.
577
577
578 ``git``
578 ``git``
579 Use git extended diff format.
579 Use git extended diff format.
580
580
581 ``nobinary``
581 ``nobinary``
582 Omit git binary patches.
582 Omit git binary patches.
583
583
584 ``nodates``
584 ``nodates``
585 Don't include dates in diff headers.
585 Don't include dates in diff headers.
586
586
587 ``noprefix``
587 ``noprefix``
588 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
588 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
589
589
590 ``showfunc``
590 ``showfunc``
591 Show which function each change is in.
591 Show which function each change is in.
592
592
593 ``ignorews``
593 ``ignorews``
594 Ignore white space when comparing lines.
594 Ignore white space when comparing lines.
595
595
596 ``ignorewsamount``
596 ``ignorewsamount``
597 Ignore changes in the amount of white space.
597 Ignore changes in the amount of white space.
598
598
599 ``ignoreblanklines``
599 ``ignoreblanklines``
600 Ignore changes whose lines are all blank.
600 Ignore changes whose lines are all blank.
601
601
602 ``unified``
602 ``unified``
603 Number of lines of context to show.
603 Number of lines of context to show.
604
604
605 ``email``
605 ``email``
606 ---------
606 ---------
607
607
608 Settings for extensions that send email messages.
608 Settings for extensions that send email messages.
609
609
610 ``from``
610 ``from``
611 Optional. Email address to use in "From" header and SMTP envelope
611 Optional. Email address to use in "From" header and SMTP envelope
612 of outgoing messages.
612 of outgoing messages.
613
613
614 ``to``
614 ``to``
615 Optional. Comma-separated list of recipients' email addresses.
615 Optional. Comma-separated list of recipients' email addresses.
616
616
617 ``cc``
617 ``cc``
618 Optional. Comma-separated list of carbon copy recipients'
618 Optional. Comma-separated list of carbon copy recipients'
619 email addresses.
619 email addresses.
620
620
621 ``bcc``
621 ``bcc``
622 Optional. Comma-separated list of blind carbon copy recipients'
622 Optional. Comma-separated list of blind carbon copy recipients'
623 email addresses.
623 email addresses.
624
624
625 ``method``
625 ``method``
626 Optional. Method to use to send email messages. If value is ``smtp``
626 Optional. Method to use to send email messages. If value is ``smtp``
627 (default), use SMTP (see the ``[smtp]`` section for configuration).
627 (default), use SMTP (see the ``[smtp]`` section for configuration).
628 Otherwise, use as name of program to run that acts like sendmail
628 Otherwise, use as name of program to run that acts like sendmail
629 (takes ``-f`` option for sender, list of recipients on command line,
629 (takes ``-f`` option for sender, list of recipients on command line,
630 message on stdin). Normally, setting this to ``sendmail`` or
630 message on stdin). Normally, setting this to ``sendmail`` or
631 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
631 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
632
632
633 ``charsets``
633 ``charsets``
634 Optional. Comma-separated list of character sets considered
634 Optional. Comma-separated list of character sets considered
635 convenient for recipients. Addresses, headers, and parts not
635 convenient for recipients. Addresses, headers, and parts not
636 containing patches of outgoing messages will be encoded in the
636 containing patches of outgoing messages will be encoded in the
637 first character set to which conversion from local encoding
637 first character set to which conversion from local encoding
638 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
638 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
639 conversion fails, the text in question is sent as is.
639 conversion fails, the text in question is sent as is.
640 (default: '')
640 (default: '')
641
641
642 Order of outgoing email character sets:
642 Order of outgoing email character sets:
643
643
644 1. ``us-ascii``: always first, regardless of settings
644 1. ``us-ascii``: always first, regardless of settings
645 2. ``email.charsets``: in order given by user
645 2. ``email.charsets``: in order given by user
646 3. ``ui.fallbackencoding``: if not in email.charsets
646 3. ``ui.fallbackencoding``: if not in email.charsets
647 4. ``$HGENCODING``: if not in email.charsets
647 4. ``$HGENCODING``: if not in email.charsets
648 5. ``utf-8``: always last, regardless of settings
648 5. ``utf-8``: always last, regardless of settings
649
649
650 Email example::
650 Email example::
651
651
652 [email]
652 [email]
653 from = Joseph User <joe.user@example.com>
653 from = Joseph User <joe.user@example.com>
654 method = /usr/sbin/sendmail
654 method = /usr/sbin/sendmail
655 # charsets for western Europeans
655 # charsets for western Europeans
656 # us-ascii, utf-8 omitted, as they are tried first and last
656 # us-ascii, utf-8 omitted, as they are tried first and last
657 charsets = iso-8859-1, iso-8859-15, windows-1252
657 charsets = iso-8859-1, iso-8859-15, windows-1252
658
658
659
659
660 ``extensions``
660 ``extensions``
661 --------------
661 --------------
662
662
663 Mercurial has an extension mechanism for adding new features. To
663 Mercurial has an extension mechanism for adding new features. To
664 enable an extension, create an entry for it in this section.
664 enable an extension, create an entry for it in this section.
665
665
666 If you know that the extension is already in Python's search path,
666 If you know that the extension is already in Python's search path,
667 you can give the name of the module, followed by ``=``, with nothing
667 you can give the name of the module, followed by ``=``, with nothing
668 after the ``=``.
668 after the ``=``.
669
669
670 Otherwise, give a name that you choose, followed by ``=``, followed by
670 Otherwise, give a name that you choose, followed by ``=``, followed by
671 the path to the ``.py`` file (including the file name extension) that
671 the path to the ``.py`` file (including the file name extension) that
672 defines the extension.
672 defines the extension.
673
673
674 To explicitly disable an extension that is enabled in an hgrc of
674 To explicitly disable an extension that is enabled in an hgrc of
675 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
675 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
676 or ``foo = !`` when path is not supplied.
676 or ``foo = !`` when path is not supplied.
677
677
678 Example for ``~/.hgrc``::
678 Example for ``~/.hgrc``::
679
679
680 [extensions]
680 [extensions]
681 # (the color extension will get loaded from Mercurial's path)
681 # (the color extension will get loaded from Mercurial's path)
682 color =
682 color =
683 # (this extension will get loaded from the file specified)
683 # (this extension will get loaded from the file specified)
684 myfeature = ~/.hgext/myfeature.py
684 myfeature = ~/.hgext/myfeature.py
685
685
686
686
687 ``format``
687 ``format``
688 ----------
688 ----------
689
689
690 ``usegeneraldelta``
690 ``usegeneraldelta``
691 Enable or disable the "generaldelta" repository format which improves
691 Enable or disable the "generaldelta" repository format which improves
692 repository compression by allowing "revlog" to store delta against arbitrary
692 repository compression by allowing "revlog" to store delta against arbitrary
693 revision instead of the previous stored one. This provides significant
693 revision instead of the previous stored one. This provides significant
694 improvement for repositories with branches.
694 improvement for repositories with branches.
695
695
696 Repositories with this on-disk format require Mercurial version 1.9.
696 Repositories with this on-disk format require Mercurial version 1.9.
697
697
698 Enabled by default.
698 Enabled by default.
699
699
700 ``dotencode``
700 ``dotencode``
701 Enable or disable the "dotencode" repository format which enhances
701 Enable or disable the "dotencode" repository format which enhances
702 the "fncache" repository format (which has to be enabled to use
702 the "fncache" repository format (which has to be enabled to use
703 dotencode) to avoid issues with filenames starting with ._ on
703 dotencode) to avoid issues with filenames starting with ._ on
704 Mac OS X and spaces on Windows.
704 Mac OS X and spaces on Windows.
705
705
706 Repositories with this on-disk format require Mercurial version 1.7.
706 Repositories with this on-disk format require Mercurial version 1.7.
707
707
708 Enabled by default.
708 Enabled by default.
709
709
710 ``usefncache``
710 ``usefncache``
711 Enable or disable the "fncache" repository format which enhances
711 Enable or disable the "fncache" repository format which enhances
712 the "store" repository format (which has to be enabled to use
712 the "store" repository format (which has to be enabled to use
713 fncache) to allow longer filenames and avoids using Windows
713 fncache) to allow longer filenames and avoids using Windows
714 reserved names, e.g. "nul".
714 reserved names, e.g. "nul".
715
715
716 Repositories with this on-disk format require Mercurial version 1.1.
716 Repositories with this on-disk format require Mercurial version 1.1.
717
717
718 Enabled by default.
718 Enabled by default.
719
719
720 ``usestore``
720 ``usestore``
721 Enable or disable the "store" repository format which improves
721 Enable or disable the "store" repository format which improves
722 compatibility with systems that fold case or otherwise mangle
722 compatibility with systems that fold case or otherwise mangle
723 filenames. Disabling this option will allow you to store longer filenames
723 filenames. Disabling this option will allow you to store longer filenames
724 in some situations at the expense of compatibility.
724 in some situations at the expense of compatibility.
725
725
726 Repositories with this on-disk format require Mercurial version 0.9.4.
726 Repositories with this on-disk format require Mercurial version 0.9.4.
727
727
728 Enabled by default.
728 Enabled by default.
729
729
730 ``graph``
730 ``graph``
731 ---------
731 ---------
732
732
733 Web graph view configuration. This section let you change graph
733 Web graph view configuration. This section let you change graph
734 elements display properties by branches, for instance to make the
734 elements display properties by branches, for instance to make the
735 ``default`` branch stand out.
735 ``default`` branch stand out.
736
736
737 Each line has the following format::
737 Each line has the following format::
738
738
739 <branch>.<argument> = <value>
739 <branch>.<argument> = <value>
740
740
741 where ``<branch>`` is the name of the branch being
741 where ``<branch>`` is the name of the branch being
742 customized. Example::
742 customized. Example::
743
743
744 [graph]
744 [graph]
745 # 2px width
745 # 2px width
746 default.width = 2
746 default.width = 2
747 # red color
747 # red color
748 default.color = FF0000
748 default.color = FF0000
749
749
750 Supported arguments:
750 Supported arguments:
751
751
752 ``width``
752 ``width``
753 Set branch edges width in pixels.
753 Set branch edges width in pixels.
754
754
755 ``color``
755 ``color``
756 Set branch edges color in hexadecimal RGB notation.
756 Set branch edges color in hexadecimal RGB notation.
757
757
758 ``hooks``
758 ``hooks``
759 ---------
759 ---------
760
760
761 Commands or Python functions that get automatically executed by
761 Commands or Python functions that get automatically executed by
762 various actions such as starting or finishing a commit. Multiple
762 various actions such as starting or finishing a commit. Multiple
763 hooks can be run for the same action by appending a suffix to the
763 hooks can be run for the same action by appending a suffix to the
764 action. Overriding a site-wide hook can be done by changing its
764 action. Overriding a site-wide hook can be done by changing its
765 value or setting it to an empty string. Hooks can be prioritized
765 value or setting it to an empty string. Hooks can be prioritized
766 by adding a prefix of ``priority.`` to the hook name on a new line
766 by adding a prefix of ``priority.`` to the hook name on a new line
767 and setting the priority. The default priority is 0.
767 and setting the priority. The default priority is 0.
768
768
769 Example ``.hg/hgrc``::
769 Example ``.hg/hgrc``::
770
770
771 [hooks]
771 [hooks]
772 # update working directory after adding changesets
772 # update working directory after adding changesets
773 changegroup.update = hg update
773 changegroup.update = hg update
774 # do not use the site-wide hook
774 # do not use the site-wide hook
775 incoming =
775 incoming =
776 incoming.email = /my/email/hook
776 incoming.email = /my/email/hook
777 incoming.autobuild = /my/build/hook
777 incoming.autobuild = /my/build/hook
778 # force autobuild hook to run before other incoming hooks
778 # force autobuild hook to run before other incoming hooks
779 priority.incoming.autobuild = 1
779 priority.incoming.autobuild = 1
780
780
781 Most hooks are run with environment variables set that give useful
781 Most hooks are run with environment variables set that give useful
782 additional information. For each hook below, the environment
782 additional information. For each hook below, the environment
783 variables it is passed are listed with names of the form ``$HG_foo``.
783 variables it is passed are listed with names of the form ``$HG_foo``.
784
784
785 ``changegroup``
785 ``changegroup``
786 Run after a changegroup has been added via push, pull or unbundle. ID of the
786 Run after a changegroup has been added via push, pull or unbundle. ID of the
787 first new changeset is in ``$HG_NODE`` and last in ``$HG_NODE_LAST``. URL
787 first new changeset is in ``$HG_NODE`` and last in ``$HG_NODE_LAST``. URL
788 from which changes came is in ``$HG_URL``.
788 from which changes came is in ``$HG_URL``.
789
789
790 ``commit``
790 ``commit``
791 Run after a changeset has been created in the local repository. ID
791 Run after a changeset has been created in the local repository. ID
792 of the newly created changeset is in ``$HG_NODE``. Parent changeset
792 of the newly created changeset is in ``$HG_NODE``. Parent changeset
793 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
793 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
794
794
795 ``incoming``
795 ``incoming``
796 Run after a changeset has been pulled, pushed, or unbundled into
796 Run after a changeset has been pulled, pushed, or unbundled into
797 the local repository. The ID of the newly arrived changeset is in
797 the local repository. The ID of the newly arrived changeset is in
798 ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``.
798 ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``.
799
799
800 ``outgoing``
800 ``outgoing``
801 Run after sending changes from local repository to another. ID of
801 Run after sending changes from local repository to another. ID of
802 first changeset sent is in ``$HG_NODE``. Source of operation is in
802 first changeset sent is in ``$HG_NODE``. Source of operation is in
803 ``$HG_SOURCE``; Also see :hg:`help config.hooks.preoutgoing` hook.
803 ``$HG_SOURCE``; Also see :hg:`help config.hooks.preoutgoing` hook.
804
804
805 ``post-<command>``
805 ``post-<command>``
806 Run after successful invocations of the associated command. The
806 Run after successful invocations of the associated command. The
807 contents of the command line are passed as ``$HG_ARGS`` and the result
807 contents of the command line are passed as ``$HG_ARGS`` and the result
808 code in ``$HG_RESULT``. Parsed command line arguments are passed as
808 code in ``$HG_RESULT``. Parsed command line arguments are passed as
809 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
809 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
810 the python data internally passed to <command>. ``$HG_OPTS`` is a
810 the python data internally passed to <command>. ``$HG_OPTS`` is a
811 dictionary of options (with unspecified options set to their defaults).
811 dictionary of options (with unspecified options set to their defaults).
812 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
812 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
813
813
814 ``fail-<command>``
815 Run after a failed invocation of an associated command. The contents
816 of the command line are passed as ``$HG_ARGS``. Parsed command line
817 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
818 string representations of the python data internally passed to
819 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
820 options set to their defaults). ``$HG_PATS`` is a list of arguments.
821 Hook failure is ignored.
822
814 ``pre-<command>``
823 ``pre-<command>``
815 Run before executing the associated command. The contents of the
824 Run before executing the associated command. The contents of the
816 command line are passed as ``$HG_ARGS``. Parsed command line arguments
825 command line are passed as ``$HG_ARGS``. Parsed command line arguments
817 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
826 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
818 representations of the data internally passed to <command>. ``$HG_OPTS``
827 representations of the data internally passed to <command>. ``$HG_OPTS``
819 is a dictionary of options (with unspecified options set to their
828 is a dictionary of options (with unspecified options set to their
820 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
829 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
821 failure, the command doesn't execute and Mercurial returns the failure
830 failure, the command doesn't execute and Mercurial returns the failure
822 code.
831 code.
823
832
824 ``prechangegroup``
833 ``prechangegroup``
825 Run before a changegroup is added via push, pull or unbundle. Exit
834 Run before a changegroup is added via push, pull or unbundle. Exit
826 status 0 allows the changegroup to proceed. Non-zero status will
835 status 0 allows the changegroup to proceed. Non-zero status will
827 cause the push, pull or unbundle to fail. URL from which changes
836 cause the push, pull or unbundle to fail. URL from which changes
828 will come is in ``$HG_URL``.
837 will come is in ``$HG_URL``.
829
838
830 ``precommit``
839 ``precommit``
831 Run before starting a local commit. Exit status 0 allows the
840 Run before starting a local commit. Exit status 0 allows the
832 commit to proceed. Non-zero status will cause the commit to fail.
841 commit to proceed. Non-zero status will cause the commit to fail.
833 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
842 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
834
843
835 ``prelistkeys``
844 ``prelistkeys``
836 Run before listing pushkeys (like bookmarks) in the
845 Run before listing pushkeys (like bookmarks) in the
837 repository. Non-zero status will cause failure. The key namespace is
846 repository. Non-zero status will cause failure. The key namespace is
838 in ``$HG_NAMESPACE``.
847 in ``$HG_NAMESPACE``.
839
848
840 ``preoutgoing``
849 ``preoutgoing``
841 Run before collecting changes to send from the local repository to
850 Run before collecting changes to send from the local repository to
842 another. Non-zero status will cause failure. This lets you prevent
851 another. Non-zero status will cause failure. This lets you prevent
843 pull over HTTP or SSH. Also prevents against local pull, push
852 pull over HTTP or SSH. Also prevents against local pull, push
844 (outbound) or bundle commands, but not effective, since you can
853 (outbound) or bundle commands, but not effective, since you can
845 just copy files instead then. Source of operation is in
854 just copy files instead then. Source of operation is in
846 ``$HG_SOURCE``. If "serve", operation is happening on behalf of remote
855 ``$HG_SOURCE``. If "serve", operation is happening on behalf of remote
847 SSH or HTTP repository. If "push", "pull" or "bundle", operation
856 SSH or HTTP repository. If "push", "pull" or "bundle", operation
848 is happening on behalf of repository on same system.
857 is happening on behalf of repository on same system.
849
858
850 ``prepushkey``
859 ``prepushkey``
851 Run before a pushkey (like a bookmark) is added to the
860 Run before a pushkey (like a bookmark) is added to the
852 repository. Non-zero status will cause the key to be rejected. The
861 repository. Non-zero status will cause the key to be rejected. The
853 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
862 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
854 the old value (if any) is in ``$HG_OLD``, and the new value is in
863 the old value (if any) is in ``$HG_OLD``, and the new value is in
855 ``$HG_NEW``.
864 ``$HG_NEW``.
856
865
857 ``pretag``
866 ``pretag``
858 Run before creating a tag. Exit status 0 allows the tag to be
867 Run before creating a tag. Exit status 0 allows the tag to be
859 created. Non-zero status will cause the tag to fail. ID of
868 created. Non-zero status will cause the tag to fail. ID of
860 changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is
869 changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is
861 local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``.
870 local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``.
862
871
863 ``pretxnopen``
872 ``pretxnopen``
864 Run before any new repository transaction is open. The reason for the
873 Run before any new repository transaction is open. The reason for the
865 transaction will be in ``$HG_TXNNAME`` and a unique identifier for the
874 transaction will be in ``$HG_TXNNAME`` and a unique identifier for the
866 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
875 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
867 transaction from being opened.
876 transaction from being opened.
868
877
869 ``pretxnclose``
878 ``pretxnclose``
870 Run right before the transaction is actually finalized. Any repository change
879 Run right before the transaction is actually finalized. Any repository change
871 will be visible to the hook program. This lets you validate the transaction
880 will be visible to the hook program. This lets you validate the transaction
872 content or change it. Exit status 0 allows the commit to proceed. Non-zero
881 content or change it. Exit status 0 allows the commit to proceed. Non-zero
873 status will cause the transaction to be rolled back. The reason for the
882 status will cause the transaction to be rolled back. The reason for the
874 transaction opening will be in ``$HG_TXNNAME`` and a unique identifier for
883 transaction opening will be in ``$HG_TXNNAME`` and a unique identifier for
875 the transaction will be in ``HG_TXNID``. The rest of the available data will
884 the transaction will be in ``HG_TXNID``. The rest of the available data will
876 vary according the transaction type. New changesets will add ``$HG_NODE`` (id
885 vary according the transaction type. New changesets will add ``$HG_NODE`` (id
877 of the first added changeset), ``$HG_NODE_LAST`` (id of the last added
886 of the first added changeset), ``$HG_NODE_LAST`` (id of the last added
878 changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables, bookmarks and phases
887 changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables, bookmarks and phases
879 changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``, etc.
888 changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``, etc.
880
889
881 ``txnclose``
890 ``txnclose``
882 Run after any repository transaction has been committed. At this
891 Run after any repository transaction has been committed. At this
883 point, the transaction can no longer be rolled back. The hook will run
892 point, the transaction can no longer be rolled back. The hook will run
884 after the lock is released. See :hg:`help config.hooks.pretxnclose` docs for
893 after the lock is released. See :hg:`help config.hooks.pretxnclose` docs for
885 details about available variables.
894 details about available variables.
886
895
887 ``txnabort``
896 ``txnabort``
888 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
897 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
889 docs for details about available variables.
898 docs for details about available variables.
890
899
891 ``pretxnchangegroup``
900 ``pretxnchangegroup``
892 Run after a changegroup has been added via push, pull or unbundle, but before
901 Run after a changegroup has been added via push, pull or unbundle, but before
893 the transaction has been committed. Changegroup is visible to hook program.
902 the transaction has been committed. Changegroup is visible to hook program.
894 This lets you validate incoming changes before accepting them. Passed the ID
903 This lets you validate incoming changes before accepting them. Passed the ID
895 of the first new changeset in ``$HG_NODE`` and last in ``$HG_NODE_LAST``.
904 of the first new changeset in ``$HG_NODE`` and last in ``$HG_NODE_LAST``.
896 Exit status 0 allows the transaction to commit. Non-zero status will cause
905 Exit status 0 allows the transaction to commit. Non-zero status will cause
897 the transaction to be rolled back and the push, pull or unbundle will fail.
906 the transaction to be rolled back and the push, pull or unbundle will fail.
898 URL that was source of changes is in ``$HG_URL``.
907 URL that was source of changes is in ``$HG_URL``.
899
908
900 ``pretxncommit``
909 ``pretxncommit``
901 Run after a changeset has been created but the transaction not yet
910 Run after a changeset has been created but the transaction not yet
902 committed. Changeset is visible to hook program. This lets you
911 committed. Changeset is visible to hook program. This lets you
903 validate commit message and changes. Exit status 0 allows the
912 validate commit message and changes. Exit status 0 allows the
904 commit to proceed. Non-zero status will cause the transaction to
913 commit to proceed. Non-zero status will cause the transaction to
905 be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset
914 be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset
906 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
915 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
907
916
908 ``preupdate``
917 ``preupdate``
909 Run before updating the working directory. Exit status 0 allows
918 Run before updating the working directory. Exit status 0 allows
910 the update to proceed. Non-zero status will prevent the update.
919 the update to proceed. Non-zero status will prevent the update.
911 Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID
920 Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID
912 of second new parent is in ``$HG_PARENT2``.
921 of second new parent is in ``$HG_PARENT2``.
913
922
914 ``listkeys``
923 ``listkeys``
915 Run after listing pushkeys (like bookmarks) in the repository. The
924 Run after listing pushkeys (like bookmarks) in the repository. The
916 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
925 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
917 dictionary containing the keys and values.
926 dictionary containing the keys and values.
918
927
919 ``pushkey``
928 ``pushkey``
920 Run after a pushkey (like a bookmark) is added to the
929 Run after a pushkey (like a bookmark) is added to the
921 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
930 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
922 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
931 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
923 value is in ``$HG_NEW``.
932 value is in ``$HG_NEW``.
924
933
925 ``tag``
934 ``tag``
926 Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.
935 Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.
927 Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in
936 Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in
928 repository if ``$HG_LOCAL=0``.
937 repository if ``$HG_LOCAL=0``.
929
938
930 ``update``
939 ``update``
931 Run after updating the working directory. Changeset ID of first
940 Run after updating the working directory. Changeset ID of first
932 new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is
941 new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is
933 in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
942 in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
934 update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``.
943 update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``.
935
944
936 .. note::
945 .. note::
937
946
938 It is generally better to use standard hooks rather than the
947 It is generally better to use standard hooks rather than the
939 generic pre- and post- command hooks as they are guaranteed to be
948 generic pre- and post- command hooks as they are guaranteed to be
940 called in the appropriate contexts for influencing transactions.
949 called in the appropriate contexts for influencing transactions.
941 Also, hooks like "commit" will be called in all contexts that
950 Also, hooks like "commit" will be called in all contexts that
942 generate a commit (e.g. tag) and not just the commit command.
951 generate a commit (e.g. tag) and not just the commit command.
943
952
944 .. note::
953 .. note::
945
954
946 Environment variables with empty values may not be passed to
955 Environment variables with empty values may not be passed to
947 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
956 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
948 will have an empty value under Unix-like platforms for non-merge
957 will have an empty value under Unix-like platforms for non-merge
949 changesets, while it will not be available at all under Windows.
958 changesets, while it will not be available at all under Windows.
950
959
951 The syntax for Python hooks is as follows::
960 The syntax for Python hooks is as follows::
952
961
953 hookname = python:modulename.submodule.callable
962 hookname = python:modulename.submodule.callable
954 hookname = python:/path/to/python/module.py:callable
963 hookname = python:/path/to/python/module.py:callable
955
964
956 Python hooks are run within the Mercurial process. Each hook is
965 Python hooks are run within the Mercurial process. Each hook is
957 called with at least three keyword arguments: a ui object (keyword
966 called with at least three keyword arguments: a ui object (keyword
958 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
967 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
959 keyword that tells what kind of hook is used. Arguments listed as
968 keyword that tells what kind of hook is used. Arguments listed as
960 environment variables above are passed as keyword arguments, with no
969 environment variables above are passed as keyword arguments, with no
961 ``HG_`` prefix, and names in lower case.
970 ``HG_`` prefix, and names in lower case.
962
971
963 If a Python hook returns a "true" value or raises an exception, this
972 If a Python hook returns a "true" value or raises an exception, this
964 is treated as a failure.
973 is treated as a failure.
965
974
966
975
967 ``hostfingerprints``
976 ``hostfingerprints``
968 --------------------
977 --------------------
969
978
970 Fingerprints of the certificates of known HTTPS servers.
979 Fingerprints of the certificates of known HTTPS servers.
971
980
972 A HTTPS connection to a server with a fingerprint configured here will
981 A HTTPS connection to a server with a fingerprint configured here will
973 only succeed if the servers certificate matches the fingerprint.
982 only succeed if the servers certificate matches the fingerprint.
974 This is very similar to how ssh known hosts works.
983 This is very similar to how ssh known hosts works.
975
984
976 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
985 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
977 Multiple values can be specified (separated by spaces or commas). This can
986 Multiple values can be specified (separated by spaces or commas). This can
978 be used to define both old and new fingerprints while a host transitions
987 be used to define both old and new fingerprints while a host transitions
979 to a new certificate.
988 to a new certificate.
980
989
981 The CA chain and web.cacerts is not used for servers with a fingerprint.
990 The CA chain and web.cacerts is not used for servers with a fingerprint.
982
991
983 For example::
992 For example::
984
993
985 [hostfingerprints]
994 [hostfingerprints]
986 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
995 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
987 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
996 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
988
997
989 ``http_proxy``
998 ``http_proxy``
990 --------------
999 --------------
991
1000
992 Used to access web-based Mercurial repositories through a HTTP
1001 Used to access web-based Mercurial repositories through a HTTP
993 proxy.
1002 proxy.
994
1003
995 ``host``
1004 ``host``
996 Host name and (optional) port of the proxy server, for example
1005 Host name and (optional) port of the proxy server, for example
997 "myproxy:8000".
1006 "myproxy:8000".
998
1007
999 ``no``
1008 ``no``
1000 Optional. Comma-separated list of host names that should bypass
1009 Optional. Comma-separated list of host names that should bypass
1001 the proxy.
1010 the proxy.
1002
1011
1003 ``passwd``
1012 ``passwd``
1004 Optional. Password to authenticate with at the proxy server.
1013 Optional. Password to authenticate with at the proxy server.
1005
1014
1006 ``user``
1015 ``user``
1007 Optional. User name to authenticate with at the proxy server.
1016 Optional. User name to authenticate with at the proxy server.
1008
1017
1009 ``always``
1018 ``always``
1010 Optional. Always use the proxy, even for localhost and any entries
1019 Optional. Always use the proxy, even for localhost and any entries
1011 in ``http_proxy.no``. (default: False)
1020 in ``http_proxy.no``. (default: False)
1012
1021
1013 ``merge``
1022 ``merge``
1014 ---------
1023 ---------
1015
1024
1016 This section specifies behavior during merges and updates.
1025 This section specifies behavior during merges and updates.
1017
1026
1018 ``checkignored``
1027 ``checkignored``
1019 Controls behavior when an ignored file on disk has the same name as a tracked
1028 Controls behavior when an ignored file on disk has the same name as a tracked
1020 file in the changeset being merged or updated to, and has different
1029 file in the changeset being merged or updated to, and has different
1021 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1030 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1022 abort on such files. With ``warn``, warn on such files and back them up as
1031 abort on such files. With ``warn``, warn on such files and back them up as
1023 ``.orig``. With ``ignore``, don't print a warning and back them up as
1032 ``.orig``. With ``ignore``, don't print a warning and back them up as
1024 ``.orig``. (default: ``abort``)
1033 ``.orig``. (default: ``abort``)
1025
1034
1026 ``checkunknown``
1035 ``checkunknown``
1027 Controls behavior when an unknown file that isn't ignored has the same name
1036 Controls behavior when an unknown file that isn't ignored has the same name
1028 as a tracked file in the changeset being merged or updated to, and has
1037 as a tracked file in the changeset being merged or updated to, and has
1029 different contents. Similar to ``merge.checkignored``, except for files that
1038 different contents. Similar to ``merge.checkignored``, except for files that
1030 are not ignored. (default: ``abort``)
1039 are not ignored. (default: ``abort``)
1031
1040
1032 ``merge-patterns``
1041 ``merge-patterns``
1033 ------------------
1042 ------------------
1034
1043
1035 This section specifies merge tools to associate with particular file
1044 This section specifies merge tools to associate with particular file
1036 patterns. Tools matched here will take precedence over the default
1045 patterns. Tools matched here will take precedence over the default
1037 merge tool. Patterns are globs by default, rooted at the repository
1046 merge tool. Patterns are globs by default, rooted at the repository
1038 root.
1047 root.
1039
1048
1040 Example::
1049 Example::
1041
1050
1042 [merge-patterns]
1051 [merge-patterns]
1043 **.c = kdiff3
1052 **.c = kdiff3
1044 **.jpg = myimgmerge
1053 **.jpg = myimgmerge
1045
1054
1046 ``merge-tools``
1055 ``merge-tools``
1047 ---------------
1056 ---------------
1048
1057
1049 This section configures external merge tools to use for file-level
1058 This section configures external merge tools to use for file-level
1050 merges. This section has likely been preconfigured at install time.
1059 merges. This section has likely been preconfigured at install time.
1051 Use :hg:`config merge-tools` to check the existing configuration.
1060 Use :hg:`config merge-tools` to check the existing configuration.
1052 Also see :hg:`help merge-tools` for more details.
1061 Also see :hg:`help merge-tools` for more details.
1053
1062
1054 Example ``~/.hgrc``::
1063 Example ``~/.hgrc``::
1055
1064
1056 [merge-tools]
1065 [merge-tools]
1057 # Override stock tool location
1066 # Override stock tool location
1058 kdiff3.executable = ~/bin/kdiff3
1067 kdiff3.executable = ~/bin/kdiff3
1059 # Specify command line
1068 # Specify command line
1060 kdiff3.args = $base $local $other -o $output
1069 kdiff3.args = $base $local $other -o $output
1061 # Give higher priority
1070 # Give higher priority
1062 kdiff3.priority = 1
1071 kdiff3.priority = 1
1063
1072
1064 # Changing the priority of preconfigured tool
1073 # Changing the priority of preconfigured tool
1065 meld.priority = 0
1074 meld.priority = 0
1066
1075
1067 # Disable a preconfigured tool
1076 # Disable a preconfigured tool
1068 vimdiff.disabled = yes
1077 vimdiff.disabled = yes
1069
1078
1070 # Define new tool
1079 # Define new tool
1071 myHtmlTool.args = -m $local $other $base $output
1080 myHtmlTool.args = -m $local $other $base $output
1072 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1081 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1073 myHtmlTool.priority = 1
1082 myHtmlTool.priority = 1
1074
1083
1075 Supported arguments:
1084 Supported arguments:
1076
1085
1077 ``priority``
1086 ``priority``
1078 The priority in which to evaluate this tool.
1087 The priority in which to evaluate this tool.
1079 (default: 0)
1088 (default: 0)
1080
1089
1081 ``executable``
1090 ``executable``
1082 Either just the name of the executable or its pathname.
1091 Either just the name of the executable or its pathname.
1083
1092
1084 .. container:: windows
1093 .. container:: windows
1085
1094
1086 On Windows, the path can use environment variables with ${ProgramFiles}
1095 On Windows, the path can use environment variables with ${ProgramFiles}
1087 syntax.
1096 syntax.
1088
1097
1089 (default: the tool name)
1098 (default: the tool name)
1090
1099
1091 ``args``
1100 ``args``
1092 The arguments to pass to the tool executable. You can refer to the
1101 The arguments to pass to the tool executable. You can refer to the
1093 files being merged as well as the output file through these
1102 files being merged as well as the output file through these
1094 variables: ``$base``, ``$local``, ``$other``, ``$output``. The meaning
1103 variables: ``$base``, ``$local``, ``$other``, ``$output``. The meaning
1095 of ``$local`` and ``$other`` can vary depending on which action is being
1104 of ``$local`` and ``$other`` can vary depending on which action is being
1096 performed. During and update or merge, ``$local`` represents the original
1105 performed. During and update or merge, ``$local`` represents the original
1097 state of the file, while ``$other`` represents the commit you are updating
1106 state of the file, while ``$other`` represents the commit you are updating
1098 to or the commit you are merging with. During a rebase ``$local``
1107 to or the commit you are merging with. During a rebase ``$local``
1099 represents the destination of the rebase, and ``$other`` represents the
1108 represents the destination of the rebase, and ``$other`` represents the
1100 commit being rebased.
1109 commit being rebased.
1101 (default: ``$local $base $other``)
1110 (default: ``$local $base $other``)
1102
1111
1103 ``premerge``
1112 ``premerge``
1104 Attempt to run internal non-interactive 3-way merge tool before
1113 Attempt to run internal non-interactive 3-way merge tool before
1105 launching external tool. Options are ``true``, ``false``, ``keep`` or
1114 launching external tool. Options are ``true``, ``false``, ``keep`` or
1106 ``keep-merge3``. The ``keep`` option will leave markers in the file if the
1115 ``keep-merge3``. The ``keep`` option will leave markers in the file if the
1107 premerge fails. The ``keep-merge3`` will do the same but include information
1116 premerge fails. The ``keep-merge3`` will do the same but include information
1108 about the base of the merge in the marker (see internal :merge3 in
1117 about the base of the merge in the marker (see internal :merge3 in
1109 :hg:`help merge-tools`).
1118 :hg:`help merge-tools`).
1110 (default: True)
1119 (default: True)
1111
1120
1112 ``binary``
1121 ``binary``
1113 This tool can merge binary files. (default: False, unless tool
1122 This tool can merge binary files. (default: False, unless tool
1114 was selected by file pattern match)
1123 was selected by file pattern match)
1115
1124
1116 ``symlink``
1125 ``symlink``
1117 This tool can merge symlinks. (default: False)
1126 This tool can merge symlinks. (default: False)
1118
1127
1119 ``check``
1128 ``check``
1120 A list of merge success-checking options:
1129 A list of merge success-checking options:
1121
1130
1122 ``changed``
1131 ``changed``
1123 Ask whether merge was successful when the merged file shows no changes.
1132 Ask whether merge was successful when the merged file shows no changes.
1124 ``conflicts``
1133 ``conflicts``
1125 Check whether there are conflicts even though the tool reported success.
1134 Check whether there are conflicts even though the tool reported success.
1126 ``prompt``
1135 ``prompt``
1127 Always prompt for merge success, regardless of success reported by tool.
1136 Always prompt for merge success, regardless of success reported by tool.
1128
1137
1129 ``fixeol``
1138 ``fixeol``
1130 Attempt to fix up EOL changes caused by the merge tool.
1139 Attempt to fix up EOL changes caused by the merge tool.
1131 (default: False)
1140 (default: False)
1132
1141
1133 ``gui``
1142 ``gui``
1134 This tool requires a graphical interface to run. (default: False)
1143 This tool requires a graphical interface to run. (default: False)
1135
1144
1136 .. container:: windows
1145 .. container:: windows
1137
1146
1138 ``regkey``
1147 ``regkey``
1139 Windows registry key which describes install location of this
1148 Windows registry key which describes install location of this
1140 tool. Mercurial will search for this key first under
1149 tool. Mercurial will search for this key first under
1141 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1150 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1142 (default: None)
1151 (default: None)
1143
1152
1144 ``regkeyalt``
1153 ``regkeyalt``
1145 An alternate Windows registry key to try if the first key is not
1154 An alternate Windows registry key to try if the first key is not
1146 found. The alternate key uses the same ``regname`` and ``regappend``
1155 found. The alternate key uses the same ``regname`` and ``regappend``
1147 semantics of the primary key. The most common use for this key
1156 semantics of the primary key. The most common use for this key
1148 is to search for 32bit applications on 64bit operating systems.
1157 is to search for 32bit applications on 64bit operating systems.
1149 (default: None)
1158 (default: None)
1150
1159
1151 ``regname``
1160 ``regname``
1152 Name of value to read from specified registry key.
1161 Name of value to read from specified registry key.
1153 (default: the unnamed (default) value)
1162 (default: the unnamed (default) value)
1154
1163
1155 ``regappend``
1164 ``regappend``
1156 String to append to the value read from the registry, typically
1165 String to append to the value read from the registry, typically
1157 the executable name of the tool.
1166 the executable name of the tool.
1158 (default: None)
1167 (default: None)
1159
1168
1160
1169
1161 ``patch``
1170 ``patch``
1162 ---------
1171 ---------
1163
1172
1164 Settings used when applying patches, for instance through the 'import'
1173 Settings used when applying patches, for instance through the 'import'
1165 command or with Mercurial Queues extension.
1174 command or with Mercurial Queues extension.
1166
1175
1167 ``eol``
1176 ``eol``
1168 When set to 'strict' patch content and patched files end of lines
1177 When set to 'strict' patch content and patched files end of lines
1169 are preserved. When set to ``lf`` or ``crlf``, both files end of
1178 are preserved. When set to ``lf`` or ``crlf``, both files end of
1170 lines are ignored when patching and the result line endings are
1179 lines are ignored when patching and the result line endings are
1171 normalized to either LF (Unix) or CRLF (Windows). When set to
1180 normalized to either LF (Unix) or CRLF (Windows). When set to
1172 ``auto``, end of lines are again ignored while patching but line
1181 ``auto``, end of lines are again ignored while patching but line
1173 endings in patched files are normalized to their original setting
1182 endings in patched files are normalized to their original setting
1174 on a per-file basis. If target file does not exist or has no end
1183 on a per-file basis. If target file does not exist or has no end
1175 of line, patch line endings are preserved.
1184 of line, patch line endings are preserved.
1176 (default: strict)
1185 (default: strict)
1177
1186
1178 ``fuzz``
1187 ``fuzz``
1179 The number of lines of 'fuzz' to allow when applying patches. This
1188 The number of lines of 'fuzz' to allow when applying patches. This
1180 controls how much context the patcher is allowed to ignore when
1189 controls how much context the patcher is allowed to ignore when
1181 trying to apply a patch.
1190 trying to apply a patch.
1182 (default: 2)
1191 (default: 2)
1183
1192
1184 ``paths``
1193 ``paths``
1185 ---------
1194 ---------
1186
1195
1187 Assigns symbolic names and behavior to repositories.
1196 Assigns symbolic names and behavior to repositories.
1188
1197
1189 Options are symbolic names defining the URL or directory that is the
1198 Options are symbolic names defining the URL or directory that is the
1190 location of the repository. Example::
1199 location of the repository. Example::
1191
1200
1192 [paths]
1201 [paths]
1193 my_server = https://example.com/my_repo
1202 my_server = https://example.com/my_repo
1194 local_path = /home/me/repo
1203 local_path = /home/me/repo
1195
1204
1196 These symbolic names can be used from the command line. To pull
1205 These symbolic names can be used from the command line. To pull
1197 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1206 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1198 :hg:`push local_path`.
1207 :hg:`push local_path`.
1199
1208
1200 Options containing colons (``:``) denote sub-options that can influence
1209 Options containing colons (``:``) denote sub-options that can influence
1201 behavior for that specific path. Example::
1210 behavior for that specific path. Example::
1202
1211
1203 [paths]
1212 [paths]
1204 my_server = https://example.com/my_path
1213 my_server = https://example.com/my_path
1205 my_server:pushurl = ssh://example.com/my_path
1214 my_server:pushurl = ssh://example.com/my_path
1206
1215
1207 The following sub-options can be defined:
1216 The following sub-options can be defined:
1208
1217
1209 ``pushurl``
1218 ``pushurl``
1210 The URL to use for push operations. If not defined, the location
1219 The URL to use for push operations. If not defined, the location
1211 defined by the path's main entry is used.
1220 defined by the path's main entry is used.
1212
1221
1213 The following special named paths exist:
1222 The following special named paths exist:
1214
1223
1215 ``default``
1224 ``default``
1216 The URL or directory to use when no source or remote is specified.
1225 The URL or directory to use when no source or remote is specified.
1217
1226
1218 :hg:`clone` will automatically define this path to the location the
1227 :hg:`clone` will automatically define this path to the location the
1219 repository was cloned from.
1228 repository was cloned from.
1220
1229
1221 ``default-push``
1230 ``default-push``
1222 (deprecated) The URL or directory for the default :hg:`push` location.
1231 (deprecated) The URL or directory for the default :hg:`push` location.
1223 ``default:pushurl`` should be used instead.
1232 ``default:pushurl`` should be used instead.
1224
1233
1225 ``phases``
1234 ``phases``
1226 ----------
1235 ----------
1227
1236
1228 Specifies default handling of phases. See :hg:`help phases` for more
1237 Specifies default handling of phases. See :hg:`help phases` for more
1229 information about working with phases.
1238 information about working with phases.
1230
1239
1231 ``publish``
1240 ``publish``
1232 Controls draft phase behavior when working as a server. When true,
1241 Controls draft phase behavior when working as a server. When true,
1233 pushed changesets are set to public in both client and server and
1242 pushed changesets are set to public in both client and server and
1234 pulled or cloned changesets are set to public in the client.
1243 pulled or cloned changesets are set to public in the client.
1235 (default: True)
1244 (default: True)
1236
1245
1237 ``new-commit``
1246 ``new-commit``
1238 Phase of newly-created commits.
1247 Phase of newly-created commits.
1239 (default: draft)
1248 (default: draft)
1240
1249
1241 ``checksubrepos``
1250 ``checksubrepos``
1242 Check the phase of the current revision of each subrepository. Allowed
1251 Check the phase of the current revision of each subrepository. Allowed
1243 values are "ignore", "follow" and "abort". For settings other than
1252 values are "ignore", "follow" and "abort". For settings other than
1244 "ignore", the phase of the current revision of each subrepository is
1253 "ignore", the phase of the current revision of each subrepository is
1245 checked before committing the parent repository. If any of those phases is
1254 checked before committing the parent repository. If any of those phases is
1246 greater than the phase of the parent repository (e.g. if a subrepo is in a
1255 greater than the phase of the parent repository (e.g. if a subrepo is in a
1247 "secret" phase while the parent repo is in "draft" phase), the commit is
1256 "secret" phase while the parent repo is in "draft" phase), the commit is
1248 either aborted (if checksubrepos is set to "abort") or the higher phase is
1257 either aborted (if checksubrepos is set to "abort") or the higher phase is
1249 used for the parent repository commit (if set to "follow").
1258 used for the parent repository commit (if set to "follow").
1250 (default: follow)
1259 (default: follow)
1251
1260
1252
1261
1253 ``profiling``
1262 ``profiling``
1254 -------------
1263 -------------
1255
1264
1256 Specifies profiling type, format, and file output. Two profilers are
1265 Specifies profiling type, format, and file output. Two profilers are
1257 supported: an instrumenting profiler (named ``ls``), and a sampling
1266 supported: an instrumenting profiler (named ``ls``), and a sampling
1258 profiler (named ``stat``).
1267 profiler (named ``stat``).
1259
1268
1260 In this section description, 'profiling data' stands for the raw data
1269 In this section description, 'profiling data' stands for the raw data
1261 collected during profiling, while 'profiling report' stands for a
1270 collected during profiling, while 'profiling report' stands for a
1262 statistical text report generated from the profiling data. The
1271 statistical text report generated from the profiling data. The
1263 profiling is done using lsprof.
1272 profiling is done using lsprof.
1264
1273
1265 ``type``
1274 ``type``
1266 The type of profiler to use.
1275 The type of profiler to use.
1267 (default: ls)
1276 (default: ls)
1268
1277
1269 ``ls``
1278 ``ls``
1270 Use Python's built-in instrumenting profiler. This profiler
1279 Use Python's built-in instrumenting profiler. This profiler
1271 works on all platforms, but each line number it reports is the
1280 works on all platforms, but each line number it reports is the
1272 first line of a function. This restriction makes it difficult to
1281 first line of a function. This restriction makes it difficult to
1273 identify the expensive parts of a non-trivial function.
1282 identify the expensive parts of a non-trivial function.
1274 ``stat``
1283 ``stat``
1275 Use a third-party statistical profiler, statprof. This profiler
1284 Use a third-party statistical profiler, statprof. This profiler
1276 currently runs only on Unix systems, and is most useful for
1285 currently runs only on Unix systems, and is most useful for
1277 profiling commands that run for longer than about 0.1 seconds.
1286 profiling commands that run for longer than about 0.1 seconds.
1278
1287
1279 ``format``
1288 ``format``
1280 Profiling format. Specific to the ``ls`` instrumenting profiler.
1289 Profiling format. Specific to the ``ls`` instrumenting profiler.
1281 (default: text)
1290 (default: text)
1282
1291
1283 ``text``
1292 ``text``
1284 Generate a profiling report. When saving to a file, it should be
1293 Generate a profiling report. When saving to a file, it should be
1285 noted that only the report is saved, and the profiling data is
1294 noted that only the report is saved, and the profiling data is
1286 not kept.
1295 not kept.
1287 ``kcachegrind``
1296 ``kcachegrind``
1288 Format profiling data for kcachegrind use: when saving to a
1297 Format profiling data for kcachegrind use: when saving to a
1289 file, the generated file can directly be loaded into
1298 file, the generated file can directly be loaded into
1290 kcachegrind.
1299 kcachegrind.
1291
1300
1292 ``frequency``
1301 ``frequency``
1293 Sampling frequency. Specific to the ``stat`` sampling profiler.
1302 Sampling frequency. Specific to the ``stat`` sampling profiler.
1294 (default: 1000)
1303 (default: 1000)
1295
1304
1296 ``output``
1305 ``output``
1297 File path where profiling data or report should be saved. If the
1306 File path where profiling data or report should be saved. If the
1298 file exists, it is replaced. (default: None, data is printed on
1307 file exists, it is replaced. (default: None, data is printed on
1299 stderr)
1308 stderr)
1300
1309
1301 ``sort``
1310 ``sort``
1302 Sort field. Specific to the ``ls`` instrumenting profiler.
1311 Sort field. Specific to the ``ls`` instrumenting profiler.
1303 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1312 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1304 ``inlinetime``.
1313 ``inlinetime``.
1305 (default: inlinetime)
1314 (default: inlinetime)
1306
1315
1307 ``limit``
1316 ``limit``
1308 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1317 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1309 (default: 30)
1318 (default: 30)
1310
1319
1311 ``nested``
1320 ``nested``
1312 Show at most this number of lines of drill-down info after each main entry.
1321 Show at most this number of lines of drill-down info after each main entry.
1313 This can help explain the difference between Total and Inline.
1322 This can help explain the difference between Total and Inline.
1314 Specific to the ``ls`` instrumenting profiler.
1323 Specific to the ``ls`` instrumenting profiler.
1315 (default: 5)
1324 (default: 5)
1316
1325
1317 ``progress``
1326 ``progress``
1318 ------------
1327 ------------
1319
1328
1320 Mercurial commands can draw progress bars that are as informative as
1329 Mercurial commands can draw progress bars that are as informative as
1321 possible. Some progress bars only offer indeterminate information, while others
1330 possible. Some progress bars only offer indeterminate information, while others
1322 have a definite end point.
1331 have a definite end point.
1323
1332
1324 ``delay``
1333 ``delay``
1325 Number of seconds (float) before showing the progress bar. (default: 3)
1334 Number of seconds (float) before showing the progress bar. (default: 3)
1326
1335
1327 ``changedelay``
1336 ``changedelay``
1328 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1337 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1329 that value will be used instead. (default: 1)
1338 that value will be used instead. (default: 1)
1330
1339
1331 ``refresh``
1340 ``refresh``
1332 Time in seconds between refreshes of the progress bar. (default: 0.1)
1341 Time in seconds between refreshes of the progress bar. (default: 0.1)
1333
1342
1334 ``format``
1343 ``format``
1335 Format of the progress bar.
1344 Format of the progress bar.
1336
1345
1337 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1346 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1338 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1347 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1339 last 20 characters of the item, but this can be changed by adding either
1348 last 20 characters of the item, but this can be changed by adding either
1340 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1349 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1341 first num characters.
1350 first num characters.
1342
1351
1343 (default: topic bar number estimate)
1352 (default: topic bar number estimate)
1344
1353
1345 ``width``
1354 ``width``
1346 If set, the maximum width of the progress information (that is, min(width,
1355 If set, the maximum width of the progress information (that is, min(width,
1347 term width) will be used).
1356 term width) will be used).
1348
1357
1349 ``clear-complete``
1358 ``clear-complete``
1350 Clear the progress bar after it's done. (default: True)
1359 Clear the progress bar after it's done. (default: True)
1351
1360
1352 ``disable``
1361 ``disable``
1353 If true, don't show a progress bar.
1362 If true, don't show a progress bar.
1354
1363
1355 ``assume-tty``
1364 ``assume-tty``
1356 If true, ALWAYS show a progress bar, unless disable is given.
1365 If true, ALWAYS show a progress bar, unless disable is given.
1357
1366
1358 ``rebase``
1367 ``rebase``
1359 ----------
1368 ----------
1360
1369
1361 ``allowdivergence``
1370 ``allowdivergence``
1362 Default to False, when True allow creating divergence when performing
1371 Default to False, when True allow creating divergence when performing
1363 rebase of obsolete changesets.
1372 rebase of obsolete changesets.
1364
1373
1365 ``revsetalias``
1374 ``revsetalias``
1366 ---------------
1375 ---------------
1367
1376
1368 Alias definitions for revsets. See :hg:`help revsets` for details.
1377 Alias definitions for revsets. See :hg:`help revsets` for details.
1369
1378
1370 ``server``
1379 ``server``
1371 ----------
1380 ----------
1372
1381
1373 Controls generic server settings.
1382 Controls generic server settings.
1374
1383
1375 ``uncompressed``
1384 ``uncompressed``
1376 Whether to allow clients to clone a repository using the
1385 Whether to allow clients to clone a repository using the
1377 uncompressed streaming protocol. This transfers about 40% more
1386 uncompressed streaming protocol. This transfers about 40% more
1378 data than a regular clone, but uses less memory and CPU on both
1387 data than a regular clone, but uses less memory and CPU on both
1379 server and client. Over a LAN (100 Mbps or better) or a very fast
1388 server and client. Over a LAN (100 Mbps or better) or a very fast
1380 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
1389 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
1381 regular clone. Over most WAN connections (anything slower than
1390 regular clone. Over most WAN connections (anything slower than
1382 about 6 Mbps), uncompressed streaming is slower, because of the
1391 about 6 Mbps), uncompressed streaming is slower, because of the
1383 extra data transfer overhead. This mode will also temporarily hold
1392 extra data transfer overhead. This mode will also temporarily hold
1384 the write lock while determining what data to transfer.
1393 the write lock while determining what data to transfer.
1385 (default: True)
1394 (default: True)
1386
1395
1387 ``preferuncompressed``
1396 ``preferuncompressed``
1388 When set, clients will try to use the uncompressed streaming
1397 When set, clients will try to use the uncompressed streaming
1389 protocol. (default: False)
1398 protocol. (default: False)
1390
1399
1391 ``validate``
1400 ``validate``
1392 Whether to validate the completeness of pushed changesets by
1401 Whether to validate the completeness of pushed changesets by
1393 checking that all new file revisions specified in manifests are
1402 checking that all new file revisions specified in manifests are
1394 present. (default: False)
1403 present. (default: False)
1395
1404
1396 ``maxhttpheaderlen``
1405 ``maxhttpheaderlen``
1397 Instruct HTTP clients not to send request headers longer than this
1406 Instruct HTTP clients not to send request headers longer than this
1398 many bytes. (default: 1024)
1407 many bytes. (default: 1024)
1399
1408
1400 ``bundle1``
1409 ``bundle1``
1401 Whether to allow clients to push and pull using the legacy bundle1
1410 Whether to allow clients to push and pull using the legacy bundle1
1402 exchange format. (default: True)
1411 exchange format. (default: True)
1403
1412
1404 ``bundle1gd``
1413 ``bundle1gd``
1405 Like ``bundle1`` but only used if the repository is using the
1414 Like ``bundle1`` but only used if the repository is using the
1406 *generaldelta* storage format. (default: True)
1415 *generaldelta* storage format. (default: True)
1407
1416
1408 ``bundle1.push``
1417 ``bundle1.push``
1409 Whether to allow clients to push using the legacy bundle1 exchange
1418 Whether to allow clients to push using the legacy bundle1 exchange
1410 format. (default: True)
1419 format. (default: True)
1411
1420
1412 ``bundle1gd.push``
1421 ``bundle1gd.push``
1413 Like ``bundle1.push`` but only used if the repository is using the
1422 Like ``bundle1.push`` but only used if the repository is using the
1414 *generaldelta* storage format. (default: True)
1423 *generaldelta* storage format. (default: True)
1415
1424
1416 ``bundle1.pull``
1425 ``bundle1.pull``
1417 Whether to allow clients to pull using the legacy bundle1 exchange
1426 Whether to allow clients to pull using the legacy bundle1 exchange
1418 format. (default: True)
1427 format. (default: True)
1419
1428
1420 ``bundle1gd.pull``
1429 ``bundle1gd.pull``
1421 Like ``bundle1.pull`` but only used if the repository is using the
1430 Like ``bundle1.pull`` but only used if the repository is using the
1422 *generaldelta* storage format. (default: True)
1431 *generaldelta* storage format. (default: True)
1423
1432
1424 Large repositories using the *generaldelta* storage format should
1433 Large repositories using the *generaldelta* storage format should
1425 consider setting this option because converting *generaldelta*
1434 consider setting this option because converting *generaldelta*
1426 repositories to the exchange format required by the bundle1 data
1435 repositories to the exchange format required by the bundle1 data
1427 format can consume a lot of CPU.
1436 format can consume a lot of CPU.
1428
1437
1429 ``smtp``
1438 ``smtp``
1430 --------
1439 --------
1431
1440
1432 Configuration for extensions that need to send email messages.
1441 Configuration for extensions that need to send email messages.
1433
1442
1434 ``host``
1443 ``host``
1435 Host name of mail server, e.g. "mail.example.com".
1444 Host name of mail server, e.g. "mail.example.com".
1436
1445
1437 ``port``
1446 ``port``
1438 Optional. Port to connect to on mail server. (default: 465 if
1447 Optional. Port to connect to on mail server. (default: 465 if
1439 ``tls`` is smtps; 25 otherwise)
1448 ``tls`` is smtps; 25 otherwise)
1440
1449
1441 ``tls``
1450 ``tls``
1442 Optional. Method to enable TLS when connecting to mail server: starttls,
1451 Optional. Method to enable TLS when connecting to mail server: starttls,
1443 smtps or none. (default: none)
1452 smtps or none. (default: none)
1444
1453
1445 ``verifycert``
1454 ``verifycert``
1446 Optional. Verification for the certificate of mail server, when
1455 Optional. Verification for the certificate of mail server, when
1447 ``tls`` is starttls or smtps. "strict", "loose" or False. For
1456 ``tls`` is starttls or smtps. "strict", "loose" or False. For
1448 "strict" or "loose", the certificate is verified as same as the
1457 "strict" or "loose", the certificate is verified as same as the
1449 verification for HTTPS connections (see ``[hostfingerprints]`` and
1458 verification for HTTPS connections (see ``[hostfingerprints]`` and
1450 ``[web] cacerts`` also). For "strict", sending email is also
1459 ``[web] cacerts`` also). For "strict", sending email is also
1451 aborted, if there is no configuration for mail server in
1460 aborted, if there is no configuration for mail server in
1452 ``[hostfingerprints]`` and ``[web] cacerts``. --insecure for
1461 ``[hostfingerprints]`` and ``[web] cacerts``. --insecure for
1453 :hg:`email` overwrites this as "loose". (default: strict)
1462 :hg:`email` overwrites this as "loose". (default: strict)
1454
1463
1455 ``username``
1464 ``username``
1456 Optional. User name for authenticating with the SMTP server.
1465 Optional. User name for authenticating with the SMTP server.
1457 (default: None)
1466 (default: None)
1458
1467
1459 ``password``
1468 ``password``
1460 Optional. Password for authenticating with the SMTP server. If not
1469 Optional. Password for authenticating with the SMTP server. If not
1461 specified, interactive sessions will prompt the user for a
1470 specified, interactive sessions will prompt the user for a
1462 password; non-interactive sessions will fail. (default: None)
1471 password; non-interactive sessions will fail. (default: None)
1463
1472
1464 ``local_hostname``
1473 ``local_hostname``
1465 Optional. The hostname that the sender can use to identify
1474 Optional. The hostname that the sender can use to identify
1466 itself to the MTA.
1475 itself to the MTA.
1467
1476
1468
1477
1469 ``subpaths``
1478 ``subpaths``
1470 ------------
1479 ------------
1471
1480
1472 Subrepository source URLs can go stale if a remote server changes name
1481 Subrepository source URLs can go stale if a remote server changes name
1473 or becomes temporarily unavailable. This section lets you define
1482 or becomes temporarily unavailable. This section lets you define
1474 rewrite rules of the form::
1483 rewrite rules of the form::
1475
1484
1476 <pattern> = <replacement>
1485 <pattern> = <replacement>
1477
1486
1478 where ``pattern`` is a regular expression matching a subrepository
1487 where ``pattern`` is a regular expression matching a subrepository
1479 source URL and ``replacement`` is the replacement string used to
1488 source URL and ``replacement`` is the replacement string used to
1480 rewrite it. Groups can be matched in ``pattern`` and referenced in
1489 rewrite it. Groups can be matched in ``pattern`` and referenced in
1481 ``replacements``. For instance::
1490 ``replacements``. For instance::
1482
1491
1483 http://server/(.*)-hg/ = http://hg.server/\1/
1492 http://server/(.*)-hg/ = http://hg.server/\1/
1484
1493
1485 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
1494 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
1486
1495
1487 Relative subrepository paths are first made absolute, and the
1496 Relative subrepository paths are first made absolute, and the
1488 rewrite rules are then applied on the full (absolute) path. The rules
1497 rewrite rules are then applied on the full (absolute) path. The rules
1489 are applied in definition order.
1498 are applied in definition order.
1490
1499
1491 ``templatealias``
1500 ``templatealias``
1492 -----------------
1501 -----------------
1493
1502
1494 Alias definitions for templates. See :hg:`help templates` for details.
1503 Alias definitions for templates. See :hg:`help templates` for details.
1495
1504
1496 ``trusted``
1505 ``trusted``
1497 -----------
1506 -----------
1498
1507
1499 Mercurial will not use the settings in the
1508 Mercurial will not use the settings in the
1500 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
1509 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
1501 user or to a trusted group, as various hgrc features allow arbitrary
1510 user or to a trusted group, as various hgrc features allow arbitrary
1502 commands to be run. This issue is often encountered when configuring
1511 commands to be run. This issue is often encountered when configuring
1503 hooks or extensions for shared repositories or servers. However,
1512 hooks or extensions for shared repositories or servers. However,
1504 the web interface will use some safe settings from the ``[web]``
1513 the web interface will use some safe settings from the ``[web]``
1505 section.
1514 section.
1506
1515
1507 This section specifies what users and groups are trusted. The
1516 This section specifies what users and groups are trusted. The
1508 current user is always trusted. To trust everybody, list a user or a
1517 current user is always trusted. To trust everybody, list a user or a
1509 group with name ``*``. These settings must be placed in an
1518 group with name ``*``. These settings must be placed in an
1510 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
1519 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
1511 user or service running Mercurial.
1520 user or service running Mercurial.
1512
1521
1513 ``users``
1522 ``users``
1514 Comma-separated list of trusted users.
1523 Comma-separated list of trusted users.
1515
1524
1516 ``groups``
1525 ``groups``
1517 Comma-separated list of trusted groups.
1526 Comma-separated list of trusted groups.
1518
1527
1519
1528
1520 ``ui``
1529 ``ui``
1521 ------
1530 ------
1522
1531
1523 User interface controls.
1532 User interface controls.
1524
1533
1525 ``archivemeta``
1534 ``archivemeta``
1526 Whether to include the .hg_archival.txt file containing meta data
1535 Whether to include the .hg_archival.txt file containing meta data
1527 (hashes for the repository base and for tip) in archives created
1536 (hashes for the repository base and for tip) in archives created
1528 by the :hg:`archive` command or downloaded via hgweb.
1537 by the :hg:`archive` command or downloaded via hgweb.
1529 (default: True)
1538 (default: True)
1530
1539
1531 ``askusername``
1540 ``askusername``
1532 Whether to prompt for a username when committing. If True, and
1541 Whether to prompt for a username when committing. If True, and
1533 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
1542 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
1534 be prompted to enter a username. If no username is entered, the
1543 be prompted to enter a username. If no username is entered, the
1535 default ``USER@HOST`` is used instead.
1544 default ``USER@HOST`` is used instead.
1536 (default: False)
1545 (default: False)
1537
1546
1538 ``clonebundles``
1547 ``clonebundles``
1539 Whether the "clone bundles" feature is enabled.
1548 Whether the "clone bundles" feature is enabled.
1540
1549
1541 When enabled, :hg:`clone` may download and apply a server-advertised
1550 When enabled, :hg:`clone` may download and apply a server-advertised
1542 bundle file from a URL instead of using the normal exchange mechanism.
1551 bundle file from a URL instead of using the normal exchange mechanism.
1543
1552
1544 This can likely result in faster and more reliable clones.
1553 This can likely result in faster and more reliable clones.
1545
1554
1546 (default: True)
1555 (default: True)
1547
1556
1548 ``clonebundlefallback``
1557 ``clonebundlefallback``
1549 Whether failure to apply an advertised "clone bundle" from a server
1558 Whether failure to apply an advertised "clone bundle" from a server
1550 should result in fallback to a regular clone.
1559 should result in fallback to a regular clone.
1551
1560
1552 This is disabled by default because servers advertising "clone
1561 This is disabled by default because servers advertising "clone
1553 bundles" often do so to reduce server load. If advertised bundles
1562 bundles" often do so to reduce server load. If advertised bundles
1554 start mass failing and clients automatically fall back to a regular
1563 start mass failing and clients automatically fall back to a regular
1555 clone, this would add significant and unexpected load to the server
1564 clone, this would add significant and unexpected load to the server
1556 since the server is expecting clone operations to be offloaded to
1565 since the server is expecting clone operations to be offloaded to
1557 pre-generated bundles. Failing fast (the default behavior) ensures
1566 pre-generated bundles. Failing fast (the default behavior) ensures
1558 clients don't overwhelm the server when "clone bundle" application
1567 clients don't overwhelm the server when "clone bundle" application
1559 fails.
1568 fails.
1560
1569
1561 (default: False)
1570 (default: False)
1562
1571
1563 ``clonebundleprefers``
1572 ``clonebundleprefers``
1564 Defines preferences for which "clone bundles" to use.
1573 Defines preferences for which "clone bundles" to use.
1565
1574
1566 Servers advertising "clone bundles" may advertise multiple available
1575 Servers advertising "clone bundles" may advertise multiple available
1567 bundles. Each bundle may have different attributes, such as the bundle
1576 bundles. Each bundle may have different attributes, such as the bundle
1568 type and compression format. This option is used to prefer a particular
1577 type and compression format. This option is used to prefer a particular
1569 bundle over another.
1578 bundle over another.
1570
1579
1571 The following keys are defined by Mercurial:
1580 The following keys are defined by Mercurial:
1572
1581
1573 BUNDLESPEC
1582 BUNDLESPEC
1574 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
1583 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
1575 e.g. ``gzip-v2`` or ``bzip2-v1``.
1584 e.g. ``gzip-v2`` or ``bzip2-v1``.
1576
1585
1577 COMPRESSION
1586 COMPRESSION
1578 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
1587 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
1579
1588
1580 Server operators may define custom keys.
1589 Server operators may define custom keys.
1581
1590
1582 Example values: ``COMPRESSION=bzip2``,
1591 Example values: ``COMPRESSION=bzip2``,
1583 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
1592 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
1584
1593
1585 By default, the first bundle advertised by the server is used.
1594 By default, the first bundle advertised by the server is used.
1586
1595
1587 ``commitsubrepos``
1596 ``commitsubrepos``
1588 Whether to commit modified subrepositories when committing the
1597 Whether to commit modified subrepositories when committing the
1589 parent repository. If False and one subrepository has uncommitted
1598 parent repository. If False and one subrepository has uncommitted
1590 changes, abort the commit.
1599 changes, abort the commit.
1591 (default: False)
1600 (default: False)
1592
1601
1593 ``debug``
1602 ``debug``
1594 Print debugging information. (default: False)
1603 Print debugging information. (default: False)
1595
1604
1596 ``editor``
1605 ``editor``
1597 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
1606 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
1598
1607
1599 ``fallbackencoding``
1608 ``fallbackencoding``
1600 Encoding to try if it's not possible to decode the changelog using
1609 Encoding to try if it's not possible to decode the changelog using
1601 UTF-8. (default: ISO-8859-1)
1610 UTF-8. (default: ISO-8859-1)
1602
1611
1603 ``graphnodetemplate``
1612 ``graphnodetemplate``
1604 The template used to print changeset nodes in an ASCII revision graph.
1613 The template used to print changeset nodes in an ASCII revision graph.
1605 (default: ``{graphnode}``)
1614 (default: ``{graphnode}``)
1606
1615
1607 ``ignore``
1616 ``ignore``
1608 A file to read per-user ignore patterns from. This file should be
1617 A file to read per-user ignore patterns from. This file should be
1609 in the same format as a repository-wide .hgignore file. Filenames
1618 in the same format as a repository-wide .hgignore file. Filenames
1610 are relative to the repository root. This option supports hook syntax,
1619 are relative to the repository root. This option supports hook syntax,
1611 so if you want to specify multiple ignore files, you can do so by
1620 so if you want to specify multiple ignore files, you can do so by
1612 setting something like ``ignore.other = ~/.hgignore2``. For details
1621 setting something like ``ignore.other = ~/.hgignore2``. For details
1613 of the ignore file format, see the ``hgignore(5)`` man page.
1622 of the ignore file format, see the ``hgignore(5)`` man page.
1614
1623
1615 ``interactive``
1624 ``interactive``
1616 Allow to prompt the user. (default: True)
1625 Allow to prompt the user. (default: True)
1617
1626
1618 ``interface``
1627 ``interface``
1619 Select the default interface for interactive features (default: text).
1628 Select the default interface for interactive features (default: text).
1620 Possible values are 'text' and 'curses'.
1629 Possible values are 'text' and 'curses'.
1621
1630
1622 ``interface.chunkselector``
1631 ``interface.chunkselector``
1623 Select the interface for change recording (e.g. :hg:`commit` -i).
1632 Select the interface for change recording (e.g. :hg:`commit` -i).
1624 Possible values are 'text' and 'curses'.
1633 Possible values are 'text' and 'curses'.
1625 This config overrides the interface specified by ui.interface.
1634 This config overrides the interface specified by ui.interface.
1626
1635
1627 ``logtemplate``
1636 ``logtemplate``
1628 Template string for commands that print changesets.
1637 Template string for commands that print changesets.
1629
1638
1630 ``merge``
1639 ``merge``
1631 The conflict resolution program to use during a manual merge.
1640 The conflict resolution program to use during a manual merge.
1632 For more information on merge tools see :hg:`help merge-tools`.
1641 For more information on merge tools see :hg:`help merge-tools`.
1633 For configuring merge tools see the ``[merge-tools]`` section.
1642 For configuring merge tools see the ``[merge-tools]`` section.
1634
1643
1635 ``mergemarkers``
1644 ``mergemarkers``
1636 Sets the merge conflict marker label styling. The ``detailed``
1645 Sets the merge conflict marker label styling. The ``detailed``
1637 style uses the ``mergemarkertemplate`` setting to style the labels.
1646 style uses the ``mergemarkertemplate`` setting to style the labels.
1638 The ``basic`` style just uses 'local' and 'other' as the marker label.
1647 The ``basic`` style just uses 'local' and 'other' as the marker label.
1639 One of ``basic`` or ``detailed``.
1648 One of ``basic`` or ``detailed``.
1640 (default: ``basic``)
1649 (default: ``basic``)
1641
1650
1642 ``mergemarkertemplate``
1651 ``mergemarkertemplate``
1643 The template used to print the commit description next to each conflict
1652 The template used to print the commit description next to each conflict
1644 marker during merge conflicts. See :hg:`help templates` for the template
1653 marker during merge conflicts. See :hg:`help templates` for the template
1645 format.
1654 format.
1646
1655
1647 Defaults to showing the hash, tags, branches, bookmarks, author, and
1656 Defaults to showing the hash, tags, branches, bookmarks, author, and
1648 the first line of the commit description.
1657 the first line of the commit description.
1649
1658
1650 If you use non-ASCII characters in names for tags, branches, bookmarks,
1659 If you use non-ASCII characters in names for tags, branches, bookmarks,
1651 authors, and/or commit descriptions, you must pay attention to encodings of
1660 authors, and/or commit descriptions, you must pay attention to encodings of
1652 managed files. At template expansion, non-ASCII characters use the encoding
1661 managed files. At template expansion, non-ASCII characters use the encoding
1653 specified by the ``--encoding`` global option, ``HGENCODING`` or other
1662 specified by the ``--encoding`` global option, ``HGENCODING`` or other
1654 environment variables that govern your locale. If the encoding of the merge
1663 environment variables that govern your locale. If the encoding of the merge
1655 markers is different from the encoding of the merged files,
1664 markers is different from the encoding of the merged files,
1656 serious problems may occur.
1665 serious problems may occur.
1657
1666
1658 ``origbackuppath``
1667 ``origbackuppath``
1659 The path to a directory used to store generated .orig files. If the path is
1668 The path to a directory used to store generated .orig files. If the path is
1660 not a directory, one will be created.
1669 not a directory, one will be created.
1661
1670
1662 ``patch``
1671 ``patch``
1663 An optional external tool that ``hg import`` and some extensions
1672 An optional external tool that ``hg import`` and some extensions
1664 will use for applying patches. By default Mercurial uses an
1673 will use for applying patches. By default Mercurial uses an
1665 internal patch utility. The external tool must work as the common
1674 internal patch utility. The external tool must work as the common
1666 Unix ``patch`` program. In particular, it must accept a ``-p``
1675 Unix ``patch`` program. In particular, it must accept a ``-p``
1667 argument to strip patch headers, a ``-d`` argument to specify the
1676 argument to strip patch headers, a ``-d`` argument to specify the
1668 current directory, a file name to patch, and a patch file to take
1677 current directory, a file name to patch, and a patch file to take
1669 from stdin.
1678 from stdin.
1670
1679
1671 It is possible to specify a patch tool together with extra
1680 It is possible to specify a patch tool together with extra
1672 arguments. For example, setting this option to ``patch --merge``
1681 arguments. For example, setting this option to ``patch --merge``
1673 will use the ``patch`` program with its 2-way merge option.
1682 will use the ``patch`` program with its 2-way merge option.
1674
1683
1675 ``portablefilenames``
1684 ``portablefilenames``
1676 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
1685 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
1677 (default: ``warn``)
1686 (default: ``warn``)
1678
1687
1679 ``warn``
1688 ``warn``
1680 Print a warning message on POSIX platforms, if a file with a non-portable
1689 Print a warning message on POSIX platforms, if a file with a non-portable
1681 filename is added (e.g. a file with a name that can't be created on
1690 filename is added (e.g. a file with a name that can't be created on
1682 Windows because it contains reserved parts like ``AUX``, reserved
1691 Windows because it contains reserved parts like ``AUX``, reserved
1683 characters like ``:``, or would cause a case collision with an existing
1692 characters like ``:``, or would cause a case collision with an existing
1684 file).
1693 file).
1685
1694
1686 ``ignore``
1695 ``ignore``
1687 Don't print a warning.
1696 Don't print a warning.
1688
1697
1689 ``abort``
1698 ``abort``
1690 The command is aborted.
1699 The command is aborted.
1691
1700
1692 ``true``
1701 ``true``
1693 Alias for ``warn``.
1702 Alias for ``warn``.
1694
1703
1695 ``false``
1704 ``false``
1696 Alias for ``ignore``.
1705 Alias for ``ignore``.
1697
1706
1698 .. container:: windows
1707 .. container:: windows
1699
1708
1700 On Windows, this configuration option is ignored and the command aborted.
1709 On Windows, this configuration option is ignored and the command aborted.
1701
1710
1702 ``quiet``
1711 ``quiet``
1703 Reduce the amount of output printed.
1712 Reduce the amount of output printed.
1704 (default: False)
1713 (default: False)
1705
1714
1706 ``remotecmd``
1715 ``remotecmd``
1707 Remote command to use for clone/push/pull operations.
1716 Remote command to use for clone/push/pull operations.
1708 (default: ``hg``)
1717 (default: ``hg``)
1709
1718
1710 ``report_untrusted``
1719 ``report_untrusted``
1711 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
1720 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
1712 trusted user or group.
1721 trusted user or group.
1713 (default: True)
1722 (default: True)
1714
1723
1715 ``slash``
1724 ``slash``
1716 Display paths using a slash (``/``) as the path separator. This
1725 Display paths using a slash (``/``) as the path separator. This
1717 only makes a difference on systems where the default path
1726 only makes a difference on systems where the default path
1718 separator is not the slash character (e.g. Windows uses the
1727 separator is not the slash character (e.g. Windows uses the
1719 backslash character (``\``)).
1728 backslash character (``\``)).
1720 (default: False)
1729 (default: False)
1721
1730
1722 ``statuscopies``
1731 ``statuscopies``
1723 Display copies in the status command.
1732 Display copies in the status command.
1724
1733
1725 ``ssh``
1734 ``ssh``
1726 Command to use for SSH connections. (default: ``ssh``)
1735 Command to use for SSH connections. (default: ``ssh``)
1727
1736
1728 ``strict``
1737 ``strict``
1729 Require exact command names, instead of allowing unambiguous
1738 Require exact command names, instead of allowing unambiguous
1730 abbreviations. (default: False)
1739 abbreviations. (default: False)
1731
1740
1732 ``style``
1741 ``style``
1733 Name of style to use for command output.
1742 Name of style to use for command output.
1734
1743
1735 ``supportcontact``
1744 ``supportcontact``
1736 A URL where users should report a Mercurial traceback. Use this if you are a
1745 A URL where users should report a Mercurial traceback. Use this if you are a
1737 large organisation with its own Mercurial deployment process and crash
1746 large organisation with its own Mercurial deployment process and crash
1738 reports should be addressed to your internal support.
1747 reports should be addressed to your internal support.
1739
1748
1740 ``textwidth``
1749 ``textwidth``
1741 Maximum width of help text. A longer line generated by ``hg help`` or
1750 Maximum width of help text. A longer line generated by ``hg help`` or
1742 ``hg subcommand --help`` will be broken after white space to get this
1751 ``hg subcommand --help`` will be broken after white space to get this
1743 width or the terminal width, whichever comes first.
1752 width or the terminal width, whichever comes first.
1744 A non-positive value will disable this and the terminal width will be
1753 A non-positive value will disable this and the terminal width will be
1745 used. (default: 78)
1754 used. (default: 78)
1746
1755
1747 ``timeout``
1756 ``timeout``
1748 The timeout used when a lock is held (in seconds), a negative value
1757 The timeout used when a lock is held (in seconds), a negative value
1749 means no timeout. (default: 600)
1758 means no timeout. (default: 600)
1750
1759
1751 ``traceback``
1760 ``traceback``
1752 Mercurial always prints a traceback when an unknown exception
1761 Mercurial always prints a traceback when an unknown exception
1753 occurs. Setting this to True will make Mercurial print a traceback
1762 occurs. Setting this to True will make Mercurial print a traceback
1754 on all exceptions, even those recognized by Mercurial (such as
1763 on all exceptions, even those recognized by Mercurial (such as
1755 IOError or MemoryError). (default: False)
1764 IOError or MemoryError). (default: False)
1756
1765
1757 ``username``
1766 ``username``
1758 The committer of a changeset created when running "commit".
1767 The committer of a changeset created when running "commit".
1759 Typically a person's name and email address, e.g. ``Fred Widget
1768 Typically a person's name and email address, e.g. ``Fred Widget
1760 <fred@example.com>``. Environment variables in the
1769 <fred@example.com>``. Environment variables in the
1761 username are expanded.
1770 username are expanded.
1762
1771
1763 (default: ``$EMAIL`` or ``username@hostname``. If the username in
1772 (default: ``$EMAIL`` or ``username@hostname``. If the username in
1764 hgrc is empty, e.g. if the system admin set ``username =`` in the
1773 hgrc is empty, e.g. if the system admin set ``username =`` in the
1765 system hgrc, it has to be specified manually or in a different
1774 system hgrc, it has to be specified manually or in a different
1766 hgrc file)
1775 hgrc file)
1767
1776
1768 ``verbose``
1777 ``verbose``
1769 Increase the amount of output printed. (default: False)
1778 Increase the amount of output printed. (default: False)
1770
1779
1771
1780
1772 ``web``
1781 ``web``
1773 -------
1782 -------
1774
1783
1775 Web interface configuration. The settings in this section apply to
1784 Web interface configuration. The settings in this section apply to
1776 both the builtin webserver (started by :hg:`serve`) and the script you
1785 both the builtin webserver (started by :hg:`serve`) and the script you
1777 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
1786 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
1778 and WSGI).
1787 and WSGI).
1779
1788
1780 The Mercurial webserver does no authentication (it does not prompt for
1789 The Mercurial webserver does no authentication (it does not prompt for
1781 usernames and passwords to validate *who* users are), but it does do
1790 usernames and passwords to validate *who* users are), but it does do
1782 authorization (it grants or denies access for *authenticated users*
1791 authorization (it grants or denies access for *authenticated users*
1783 based on settings in this section). You must either configure your
1792 based on settings in this section). You must either configure your
1784 webserver to do authentication for you, or disable the authorization
1793 webserver to do authentication for you, or disable the authorization
1785 checks.
1794 checks.
1786
1795
1787 For a quick setup in a trusted environment, e.g., a private LAN, where
1796 For a quick setup in a trusted environment, e.g., a private LAN, where
1788 you want it to accept pushes from anybody, you can use the following
1797 you want it to accept pushes from anybody, you can use the following
1789 command line::
1798 command line::
1790
1799
1791 $ hg --config web.allow_push=* --config web.push_ssl=False serve
1800 $ hg --config web.allow_push=* --config web.push_ssl=False serve
1792
1801
1793 Note that this will allow anybody to push anything to the server and
1802 Note that this will allow anybody to push anything to the server and
1794 that this should not be used for public servers.
1803 that this should not be used for public servers.
1795
1804
1796 The full set of options is:
1805 The full set of options is:
1797
1806
1798 ``accesslog``
1807 ``accesslog``
1799 Where to output the access log. (default: stdout)
1808 Where to output the access log. (default: stdout)
1800
1809
1801 ``address``
1810 ``address``
1802 Interface address to bind to. (default: all)
1811 Interface address to bind to. (default: all)
1803
1812
1804 ``allow_archive``
1813 ``allow_archive``
1805 List of archive format (bz2, gz, zip) allowed for downloading.
1814 List of archive format (bz2, gz, zip) allowed for downloading.
1806 (default: empty)
1815 (default: empty)
1807
1816
1808 ``allowbz2``
1817 ``allowbz2``
1809 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
1818 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
1810 revisions.
1819 revisions.
1811 (default: False)
1820 (default: False)
1812
1821
1813 ``allowgz``
1822 ``allowgz``
1814 (DEPRECATED) Whether to allow .tar.gz downloading of repository
1823 (DEPRECATED) Whether to allow .tar.gz downloading of repository
1815 revisions.
1824 revisions.
1816 (default: False)
1825 (default: False)
1817
1826
1818 ``allowpull``
1827 ``allowpull``
1819 Whether to allow pulling from the repository. (default: True)
1828 Whether to allow pulling from the repository. (default: True)
1820
1829
1821 ``allow_push``
1830 ``allow_push``
1822 Whether to allow pushing to the repository. If empty or not set,
1831 Whether to allow pushing to the repository. If empty or not set,
1823 pushing is not allowed. If the special value ``*``, any remote
1832 pushing is not allowed. If the special value ``*``, any remote
1824 user can push, including unauthenticated users. Otherwise, the
1833 user can push, including unauthenticated users. Otherwise, the
1825 remote user must have been authenticated, and the authenticated
1834 remote user must have been authenticated, and the authenticated
1826 user name must be present in this list. The contents of the
1835 user name must be present in this list. The contents of the
1827 allow_push list are examined after the deny_push list.
1836 allow_push list are examined after the deny_push list.
1828
1837
1829 ``allow_read``
1838 ``allow_read``
1830 If the user has not already been denied repository access due to
1839 If the user has not already been denied repository access due to
1831 the contents of deny_read, this list determines whether to grant
1840 the contents of deny_read, this list determines whether to grant
1832 repository access to the user. If this list is not empty, and the
1841 repository access to the user. If this list is not empty, and the
1833 user is unauthenticated or not present in the list, then access is
1842 user is unauthenticated or not present in the list, then access is
1834 denied for the user. If the list is empty or not set, then access
1843 denied for the user. If the list is empty or not set, then access
1835 is permitted to all users by default. Setting allow_read to the
1844 is permitted to all users by default. Setting allow_read to the
1836 special value ``*`` is equivalent to it not being set (i.e. access
1845 special value ``*`` is equivalent to it not being set (i.e. access
1837 is permitted to all users). The contents of the allow_read list are
1846 is permitted to all users). The contents of the allow_read list are
1838 examined after the deny_read list.
1847 examined after the deny_read list.
1839
1848
1840 ``allowzip``
1849 ``allowzip``
1841 (DEPRECATED) Whether to allow .zip downloading of repository
1850 (DEPRECATED) Whether to allow .zip downloading of repository
1842 revisions. This feature creates temporary files.
1851 revisions. This feature creates temporary files.
1843 (default: False)
1852 (default: False)
1844
1853
1845 ``archivesubrepos``
1854 ``archivesubrepos``
1846 Whether to recurse into subrepositories when archiving.
1855 Whether to recurse into subrepositories when archiving.
1847 (default: False)
1856 (default: False)
1848
1857
1849 ``baseurl``
1858 ``baseurl``
1850 Base URL to use when publishing URLs in other locations, so
1859 Base URL to use when publishing URLs in other locations, so
1851 third-party tools like email notification hooks can construct
1860 third-party tools like email notification hooks can construct
1852 URLs. Example: ``http://hgserver/repos/``.
1861 URLs. Example: ``http://hgserver/repos/``.
1853
1862
1854 ``cacerts``
1863 ``cacerts``
1855 Path to file containing a list of PEM encoded certificate
1864 Path to file containing a list of PEM encoded certificate
1856 authority certificates. Environment variables and ``~user``
1865 authority certificates. Environment variables and ``~user``
1857 constructs are expanded in the filename. If specified on the
1866 constructs are expanded in the filename. If specified on the
1858 client, then it will verify the identity of remote HTTPS servers
1867 client, then it will verify the identity of remote HTTPS servers
1859 with these certificates.
1868 with these certificates.
1860
1869
1861 To disable SSL verification temporarily, specify ``--insecure`` from
1870 To disable SSL verification temporarily, specify ``--insecure`` from
1862 command line.
1871 command line.
1863
1872
1864 You can use OpenSSL's CA certificate file if your platform has
1873 You can use OpenSSL's CA certificate file if your platform has
1865 one. On most Linux systems this will be
1874 one. On most Linux systems this will be
1866 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
1875 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
1867 generate this file manually. The form must be as follows::
1876 generate this file manually. The form must be as follows::
1868
1877
1869 -----BEGIN CERTIFICATE-----
1878 -----BEGIN CERTIFICATE-----
1870 ... (certificate in base64 PEM encoding) ...
1879 ... (certificate in base64 PEM encoding) ...
1871 -----END CERTIFICATE-----
1880 -----END CERTIFICATE-----
1872 -----BEGIN CERTIFICATE-----
1881 -----BEGIN CERTIFICATE-----
1873 ... (certificate in base64 PEM encoding) ...
1882 ... (certificate in base64 PEM encoding) ...
1874 -----END CERTIFICATE-----
1883 -----END CERTIFICATE-----
1875
1884
1876 ``cache``
1885 ``cache``
1877 Whether to support caching in hgweb. (default: True)
1886 Whether to support caching in hgweb. (default: True)
1878
1887
1879 ``certificate``
1888 ``certificate``
1880 Certificate to use when running :hg:`serve`.
1889 Certificate to use when running :hg:`serve`.
1881
1890
1882 ``collapse``
1891 ``collapse``
1883 With ``descend`` enabled, repositories in subdirectories are shown at
1892 With ``descend`` enabled, repositories in subdirectories are shown at
1884 a single level alongside repositories in the current path. With
1893 a single level alongside repositories in the current path. With
1885 ``collapse`` also enabled, repositories residing at a deeper level than
1894 ``collapse`` also enabled, repositories residing at a deeper level than
1886 the current path are grouped behind navigable directory entries that
1895 the current path are grouped behind navigable directory entries that
1887 lead to the locations of these repositories. In effect, this setting
1896 lead to the locations of these repositories. In effect, this setting
1888 collapses each collection of repositories found within a subdirectory
1897 collapses each collection of repositories found within a subdirectory
1889 into a single entry for that subdirectory. (default: False)
1898 into a single entry for that subdirectory. (default: False)
1890
1899
1891 ``comparisoncontext``
1900 ``comparisoncontext``
1892 Number of lines of context to show in side-by-side file comparison. If
1901 Number of lines of context to show in side-by-side file comparison. If
1893 negative or the value ``full``, whole files are shown. (default: 5)
1902 negative or the value ``full``, whole files are shown. (default: 5)
1894
1903
1895 This setting can be overridden by a ``context`` request parameter to the
1904 This setting can be overridden by a ``context`` request parameter to the
1896 ``comparison`` command, taking the same values.
1905 ``comparison`` command, taking the same values.
1897
1906
1898 ``contact``
1907 ``contact``
1899 Name or email address of the person in charge of the repository.
1908 Name or email address of the person in charge of the repository.
1900 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
1909 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
1901
1910
1902 ``deny_push``
1911 ``deny_push``
1903 Whether to deny pushing to the repository. If empty or not set,
1912 Whether to deny pushing to the repository. If empty or not set,
1904 push is not denied. If the special value ``*``, all remote users are
1913 push is not denied. If the special value ``*``, all remote users are
1905 denied push. Otherwise, unauthenticated users are all denied, and
1914 denied push. Otherwise, unauthenticated users are all denied, and
1906 any authenticated user name present in this list is also denied. The
1915 any authenticated user name present in this list is also denied. The
1907 contents of the deny_push list are examined before the allow_push list.
1916 contents of the deny_push list are examined before the allow_push list.
1908
1917
1909 ``deny_read``
1918 ``deny_read``
1910 Whether to deny reading/viewing of the repository. If this list is
1919 Whether to deny reading/viewing of the repository. If this list is
1911 not empty, unauthenticated users are all denied, and any
1920 not empty, unauthenticated users are all denied, and any
1912 authenticated user name present in this list is also denied access to
1921 authenticated user name present in this list is also denied access to
1913 the repository. If set to the special value ``*``, all remote users
1922 the repository. If set to the special value ``*``, all remote users
1914 are denied access (rarely needed ;). If deny_read is empty or not set,
1923 are denied access (rarely needed ;). If deny_read is empty or not set,
1915 the determination of repository access depends on the presence and
1924 the determination of repository access depends on the presence and
1916 content of the allow_read list (see description). If both
1925 content of the allow_read list (see description). If both
1917 deny_read and allow_read are empty or not set, then access is
1926 deny_read and allow_read are empty or not set, then access is
1918 permitted to all users by default. If the repository is being
1927 permitted to all users by default. If the repository is being
1919 served via hgwebdir, denied users will not be able to see it in
1928 served via hgwebdir, denied users will not be able to see it in
1920 the list of repositories. The contents of the deny_read list have
1929 the list of repositories. The contents of the deny_read list have
1921 priority over (are examined before) the contents of the allow_read
1930 priority over (are examined before) the contents of the allow_read
1922 list.
1931 list.
1923
1932
1924 ``descend``
1933 ``descend``
1925 hgwebdir indexes will not descend into subdirectories. Only repositories
1934 hgwebdir indexes will not descend into subdirectories. Only repositories
1926 directly in the current path will be shown (other repositories are still
1935 directly in the current path will be shown (other repositories are still
1927 available from the index corresponding to their containing path).
1936 available from the index corresponding to their containing path).
1928
1937
1929 ``description``
1938 ``description``
1930 Textual description of the repository's purpose or contents.
1939 Textual description of the repository's purpose or contents.
1931 (default: "unknown")
1940 (default: "unknown")
1932
1941
1933 ``encoding``
1942 ``encoding``
1934 Character encoding name. (default: the current locale charset)
1943 Character encoding name. (default: the current locale charset)
1935 Example: "UTF-8".
1944 Example: "UTF-8".
1936
1945
1937 ``errorlog``
1946 ``errorlog``
1938 Where to output the error log. (default: stderr)
1947 Where to output the error log. (default: stderr)
1939
1948
1940 ``guessmime``
1949 ``guessmime``
1941 Control MIME types for raw download of file content.
1950 Control MIME types for raw download of file content.
1942 Set to True to let hgweb guess the content type from the file
1951 Set to True to let hgweb guess the content type from the file
1943 extension. This will serve HTML files as ``text/html`` and might
1952 extension. This will serve HTML files as ``text/html`` and might
1944 allow cross-site scripting attacks when serving untrusted
1953 allow cross-site scripting attacks when serving untrusted
1945 repositories. (default: False)
1954 repositories. (default: False)
1946
1955
1947 ``hidden``
1956 ``hidden``
1948 Whether to hide the repository in the hgwebdir index.
1957 Whether to hide the repository in the hgwebdir index.
1949 (default: False)
1958 (default: False)
1950
1959
1951 ``ipv6``
1960 ``ipv6``
1952 Whether to use IPv6. (default: False)
1961 Whether to use IPv6. (default: False)
1953
1962
1954 ``logoimg``
1963 ``logoimg``
1955 File name of the logo image that some templates display on each page.
1964 File name of the logo image that some templates display on each page.
1956 The file name is relative to ``staticurl``. That is, the full path to
1965 The file name is relative to ``staticurl``. That is, the full path to
1957 the logo image is "staticurl/logoimg".
1966 the logo image is "staticurl/logoimg".
1958 If unset, ``hglogo.png`` will be used.
1967 If unset, ``hglogo.png`` will be used.
1959
1968
1960 ``logourl``
1969 ``logourl``
1961 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
1970 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
1962 will be used.
1971 will be used.
1963
1972
1964 ``maxchanges``
1973 ``maxchanges``
1965 Maximum number of changes to list on the changelog. (default: 10)
1974 Maximum number of changes to list on the changelog. (default: 10)
1966
1975
1967 ``maxfiles``
1976 ``maxfiles``
1968 Maximum number of files to list per changeset. (default: 10)
1977 Maximum number of files to list per changeset. (default: 10)
1969
1978
1970 ``maxshortchanges``
1979 ``maxshortchanges``
1971 Maximum number of changes to list on the shortlog, graph or filelog
1980 Maximum number of changes to list on the shortlog, graph or filelog
1972 pages. (default: 60)
1981 pages. (default: 60)
1973
1982
1974 ``name``
1983 ``name``
1975 Repository name to use in the web interface.
1984 Repository name to use in the web interface.
1976 (default: current working directory)
1985 (default: current working directory)
1977
1986
1978 ``port``
1987 ``port``
1979 Port to listen on. (default: 8000)
1988 Port to listen on. (default: 8000)
1980
1989
1981 ``prefix``
1990 ``prefix``
1982 Prefix path to serve from. (default: '' (server root))
1991 Prefix path to serve from. (default: '' (server root))
1983
1992
1984 ``push_ssl``
1993 ``push_ssl``
1985 Whether to require that inbound pushes be transported over SSL to
1994 Whether to require that inbound pushes be transported over SSL to
1986 prevent password sniffing. (default: True)
1995 prevent password sniffing. (default: True)
1987
1996
1988 ``refreshinterval``
1997 ``refreshinterval``
1989 How frequently directory listings re-scan the filesystem for new
1998 How frequently directory listings re-scan the filesystem for new
1990 repositories, in seconds. This is relevant when wildcards are used
1999 repositories, in seconds. This is relevant when wildcards are used
1991 to define paths. Depending on how much filesystem traversal is
2000 to define paths. Depending on how much filesystem traversal is
1992 required, refreshing may negatively impact performance.
2001 required, refreshing may negatively impact performance.
1993
2002
1994 Values less than or equal to 0 always refresh.
2003 Values less than or equal to 0 always refresh.
1995 (default: 20)
2004 (default: 20)
1996
2005
1997 ``staticurl``
2006 ``staticurl``
1998 Base URL to use for static files. If unset, static files (e.g. the
2007 Base URL to use for static files. If unset, static files (e.g. the
1999 hgicon.png favicon) will be served by the CGI script itself. Use
2008 hgicon.png favicon) will be served by the CGI script itself. Use
2000 this setting to serve them directly with the HTTP server.
2009 this setting to serve them directly with the HTTP server.
2001 Example: ``http://hgserver/static/``.
2010 Example: ``http://hgserver/static/``.
2002
2011
2003 ``stripes``
2012 ``stripes``
2004 How many lines a "zebra stripe" should span in multi-line output.
2013 How many lines a "zebra stripe" should span in multi-line output.
2005 Set to 0 to disable. (default: 1)
2014 Set to 0 to disable. (default: 1)
2006
2015
2007 ``style``
2016 ``style``
2008 Which template map style to use. The available options are the names of
2017 Which template map style to use. The available options are the names of
2009 subdirectories in the HTML templates path. (default: ``paper``)
2018 subdirectories in the HTML templates path. (default: ``paper``)
2010 Example: ``monoblue``.
2019 Example: ``monoblue``.
2011
2020
2012 ``templates``
2021 ``templates``
2013 Where to find the HTML templates. The default path to the HTML templates
2022 Where to find the HTML templates. The default path to the HTML templates
2014 can be obtained from ``hg debuginstall``.
2023 can be obtained from ``hg debuginstall``.
2015
2024
2016 ``websub``
2025 ``websub``
2017 ----------
2026 ----------
2018
2027
2019 Web substitution filter definition. You can use this section to
2028 Web substitution filter definition. You can use this section to
2020 define a set of regular expression substitution patterns which
2029 define a set of regular expression substitution patterns which
2021 let you automatically modify the hgweb server output.
2030 let you automatically modify the hgweb server output.
2022
2031
2023 The default hgweb templates only apply these substitution patterns
2032 The default hgweb templates only apply these substitution patterns
2024 on the revision description fields. You can apply them anywhere
2033 on the revision description fields. You can apply them anywhere
2025 you want when you create your own templates by adding calls to the
2034 you want when you create your own templates by adding calls to the
2026 "websub" filter (usually after calling the "escape" filter).
2035 "websub" filter (usually after calling the "escape" filter).
2027
2036
2028 This can be used, for example, to convert issue references to links
2037 This can be used, for example, to convert issue references to links
2029 to your issue tracker, or to convert "markdown-like" syntax into
2038 to your issue tracker, or to convert "markdown-like" syntax into
2030 HTML (see the examples below).
2039 HTML (see the examples below).
2031
2040
2032 Each entry in this section names a substitution filter.
2041 Each entry in this section names a substitution filter.
2033 The value of each entry defines the substitution expression itself.
2042 The value of each entry defines the substitution expression itself.
2034 The websub expressions follow the old interhg extension syntax,
2043 The websub expressions follow the old interhg extension syntax,
2035 which in turn imitates the Unix sed replacement syntax::
2044 which in turn imitates the Unix sed replacement syntax::
2036
2045
2037 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
2046 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
2038
2047
2039 You can use any separator other than "/". The final "i" is optional
2048 You can use any separator other than "/". The final "i" is optional
2040 and indicates that the search must be case insensitive.
2049 and indicates that the search must be case insensitive.
2041
2050
2042 Examples::
2051 Examples::
2043
2052
2044 [websub]
2053 [websub]
2045 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
2054 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
2046 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
2055 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
2047 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
2056 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
2048
2057
2049 ``worker``
2058 ``worker``
2050 ----------
2059 ----------
2051
2060
2052 Parallel master/worker configuration. We currently perform working
2061 Parallel master/worker configuration. We currently perform working
2053 directory updates in parallel on Unix-like systems, which greatly
2062 directory updates in parallel on Unix-like systems, which greatly
2054 helps performance.
2063 helps performance.
2055
2064
2056 ``numcpus``
2065 ``numcpus``
2057 Number of CPUs to use for parallel operations. A zero or
2066 Number of CPUs to use for parallel operations. A zero or
2058 negative value is treated as ``use the default``.
2067 negative value is treated as ``use the default``.
2059 (default: 4 or the number of CPUs on the system, whichever is larger)
2068 (default: 4 or the number of CPUs on the system, whichever is larger)
2060
2069
2061 ``backgroundclose``
2070 ``backgroundclose``
2062 Whether to enable closing file handles on background threads during certain
2071 Whether to enable closing file handles on background threads during certain
2063 operations. Some platforms aren't very efficient at closing file
2072 operations. Some platforms aren't very efficient at closing file
2064 handles that have been written or appended to. By performing file closing
2073 handles that have been written or appended to. By performing file closing
2065 on background threads, file write rate can increase substantially.
2074 on background threads, file write rate can increase substantially.
2066 (default: true on Windows, false elsewhere)
2075 (default: true on Windows, false elsewhere)
2067
2076
2068 ``backgroundcloseminfilecount``
2077 ``backgroundcloseminfilecount``
2069 Minimum number of files required to trigger background file closing.
2078 Minimum number of files required to trigger background file closing.
2070 Operations not writing this many files won't start background close
2079 Operations not writing this many files won't start background close
2071 threads.
2080 threads.
2072 (default: 2048)
2081 (default: 2048)
2073
2082
2074 ``backgroundclosemaxqueue``
2083 ``backgroundclosemaxqueue``
2075 The maximum number of opened file handles waiting to be closed in the
2084 The maximum number of opened file handles waiting to be closed in the
2076 background. This option only has an effect if ``backgroundclose`` is
2085 background. This option only has an effect if ``backgroundclose`` is
2077 enabled.
2086 enabled.
2078 (default: 384)
2087 (default: 384)
2079
2088
2080 ``backgroundclosethreadcount``
2089 ``backgroundclosethreadcount``
2081 Number of threads to process background file closes. Only relevant if
2090 Number of threads to process background file closes. Only relevant if
2082 ``backgroundclose`` is enabled.
2091 ``backgroundclose`` is enabled.
2083 (default: 4)
2092 (default: 4)
@@ -1,788 +1,798 b''
1 $ cat << EOF >> $HGRCPATH
1 $ cat << EOF >> $HGRCPATH
2 > [experimental]
2 > [experimental]
3 > # drop me once bundle2 is the default,
3 > # drop me once bundle2 is the default,
4 > # added to get test change early.
4 > # added to get test change early.
5 > bundle2-exp = True
5 > bundle2-exp = True
6 > EOF
6 > EOF
7 $ hg init a
7 $ hg init a
8 $ cd a
8 $ cd a
9 $ echo foo > t1
9 $ echo foo > t1
10 $ hg add t1
10 $ hg add t1
11 $ hg commit -m "1"
11 $ hg commit -m "1"
12
12
13 $ cd ..
13 $ cd ..
14 $ hg clone a b
14 $ hg clone a b
15 updating to branch default
15 updating to branch default
16 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
16 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
17
17
18 $ cd a
18 $ cd a
19 $ echo foo > t2
19 $ echo foo > t2
20 $ hg add t2
20 $ hg add t2
21 $ hg commit -m "2"
21 $ hg commit -m "2"
22
22
23 $ cd ../b
23 $ cd ../b
24 $ echo foo > t3
24 $ echo foo > t3
25 $ hg add t3
25 $ hg add t3
26 $ hg commit -m "3"
26 $ hg commit -m "3"
27
27
28 Specifying a revset that evaluates to null will abort
28 Specifying a revset that evaluates to null will abort
29
29
30 $ hg push -r '0 & 1' ../a
30 $ hg push -r '0 & 1' ../a
31 pushing to ../a
31 pushing to ../a
32 abort: specified revisions evaluate to an empty set
32 abort: specified revisions evaluate to an empty set
33 (use different revision arguments)
33 (use different revision arguments)
34 [255]
34 [255]
35
35
36 $ hg push ../a
36 $ hg push ../a
37 pushing to ../a
37 pushing to ../a
38 searching for changes
38 searching for changes
39 remote has heads on branch 'default' that are not known locally: 1c9246a22a0a
39 remote has heads on branch 'default' that are not known locally: 1c9246a22a0a
40 abort: push creates new remote head 1e108cc5548c!
40 abort: push creates new remote head 1e108cc5548c!
41 (pull and merge or see "hg help push" for details about pushing new heads)
41 (pull and merge or see "hg help push" for details about pushing new heads)
42 [255]
42 [255]
43
43
44 $ hg push --debug ../a
44 $ hg push --debug ../a
45 pushing to ../a
45 pushing to ../a
46 query 1; heads
46 query 1; heads
47 searching for changes
47 searching for changes
48 taking quick initial sample
48 taking quick initial sample
49 query 2; still undecided: 1, sample size is: 1
49 query 2; still undecided: 1, sample size is: 1
50 2 total queries
50 2 total queries
51 listing keys for "phases"
51 listing keys for "phases"
52 checking for updated bookmarks
52 checking for updated bookmarks
53 listing keys for "bookmarks"
53 listing keys for "bookmarks"
54 listing keys for "bookmarks"
54 listing keys for "bookmarks"
55 remote has heads on branch 'default' that are not known locally: 1c9246a22a0a
55 remote has heads on branch 'default' that are not known locally: 1c9246a22a0a
56 new remote heads on branch 'default':
56 new remote heads on branch 'default':
57 1e108cc5548c
57 1e108cc5548c
58 abort: push creates new remote head 1e108cc5548c!
58 abort: push creates new remote head 1e108cc5548c!
59 (pull and merge or see "hg help push" for details about pushing new heads)
59 (pull and merge or see "hg help push" for details about pushing new heads)
60 [255]
60 [255]
61
61
62 $ hg pull ../a
62 $ hg pull ../a
63 pulling from ../a
63 pulling from ../a
64 searching for changes
64 searching for changes
65 adding changesets
65 adding changesets
66 adding manifests
66 adding manifests
67 adding file changes
67 adding file changes
68 added 1 changesets with 1 changes to 1 files (+1 heads)
68 added 1 changesets with 1 changes to 1 files (+1 heads)
69 (run 'hg heads' to see heads, 'hg merge' to merge)
69 (run 'hg heads' to see heads, 'hg merge' to merge)
70
70
71 $ hg push ../a
71 $ hg push ../a
72 pushing to ../a
72 pushing to ../a
73 searching for changes
73 searching for changes
74 abort: push creates new remote head 1e108cc5548c!
74 abort: push creates new remote head 1e108cc5548c!
75 (merge or see "hg help push" for details about pushing new heads)
75 (merge or see "hg help push" for details about pushing new heads)
76 [255]
76 [255]
77
77
78 $ hg merge
78 $ hg merge
79 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
79 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
80 (branch merge, don't forget to commit)
80 (branch merge, don't forget to commit)
81
81
82 $ hg commit -m "4"
82 $ hg commit -m "4"
83 $ hg push ../a
83 $ hg push ../a
84 pushing to ../a
84 pushing to ../a
85 searching for changes
85 searching for changes
86 adding changesets
86 adding changesets
87 adding manifests
87 adding manifests
88 adding file changes
88 adding file changes
89 added 2 changesets with 1 changes to 1 files
89 added 2 changesets with 1 changes to 1 files
90
90
91 $ cd ..
91 $ cd ..
92
92
93 $ hg init c
93 $ hg init c
94 $ cd c
94 $ cd c
95 $ for i in 0 1 2; do
95 $ for i in 0 1 2; do
96 > echo $i >> foo
96 > echo $i >> foo
97 > hg ci -Am $i
97 > hg ci -Am $i
98 > done
98 > done
99 adding foo
99 adding foo
100 $ cd ..
100 $ cd ..
101
101
102 $ hg clone c d
102 $ hg clone c d
103 updating to branch default
103 updating to branch default
104 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
104 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
105
105
106 $ cd d
106 $ cd d
107 $ for i in 0 1; do
107 $ for i in 0 1; do
108 > hg co -C $i
108 > hg co -C $i
109 > echo d-$i >> foo
109 > echo d-$i >> foo
110 > hg ci -m d-$i
110 > hg ci -m d-$i
111 > done
111 > done
112 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
112 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
113 created new head
113 created new head
114 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
114 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
115 created new head
115 created new head
116
116
117 $ HGMERGE=true hg merge 3
117 $ HGMERGE=true hg merge 3
118 merging foo
118 merging foo
119 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
119 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
120 (branch merge, don't forget to commit)
120 (branch merge, don't forget to commit)
121
121
122 $ hg ci -m c-d
122 $ hg ci -m c-d
123
123
124 $ hg push ../c
124 $ hg push ../c
125 pushing to ../c
125 pushing to ../c
126 searching for changes
126 searching for changes
127 abort: push creates new remote head 6346d66eb9f5!
127 abort: push creates new remote head 6346d66eb9f5!
128 (merge or see "hg help push" for details about pushing new heads)
128 (merge or see "hg help push" for details about pushing new heads)
129 [255]
129 [255]
130
130
131 $ hg push -r 2 ../c
131 $ hg push -r 2 ../c
132 pushing to ../c
132 pushing to ../c
133 searching for changes
133 searching for changes
134 no changes found
134 no changes found
135 [1]
135 [1]
136
136
137 $ hg push -r 3 ../c
137 $ hg push -r 3 ../c
138 pushing to ../c
138 pushing to ../c
139 searching for changes
139 searching for changes
140 abort: push creates new remote head a5dda829a167!
140 abort: push creates new remote head a5dda829a167!
141 (merge or see "hg help push" for details about pushing new heads)
141 (merge or see "hg help push" for details about pushing new heads)
142 [255]
142 [255]
143
143
144 $ hg push -v -r 3 -r 4 ../c
144 $ hg push -v -r 3 -r 4 ../c
145 pushing to ../c
145 pushing to ../c
146 searching for changes
146 searching for changes
147 new remote heads on branch 'default':
147 new remote heads on branch 'default':
148 a5dda829a167
148 a5dda829a167
149 ee8fbc7a0295
149 ee8fbc7a0295
150 abort: push creates new remote head a5dda829a167!
150 abort: push creates new remote head a5dda829a167!
151 (merge or see "hg help push" for details about pushing new heads)
151 (merge or see "hg help push" for details about pushing new heads)
152 [255]
152 [255]
153
153
154 $ hg push -v -f -r 3 -r 4 ../c
154 $ hg push -v -f -r 3 -r 4 ../c
155 pushing to ../c
155 pushing to ../c
156 searching for changes
156 searching for changes
157 2 changesets found
157 2 changesets found
158 uncompressed size of bundle content:
158 uncompressed size of bundle content:
159 348 (changelog)
159 348 (changelog)
160 326 (manifests)
160 326 (manifests)
161 253 foo
161 253 foo
162 adding changesets
162 adding changesets
163 adding manifests
163 adding manifests
164 adding file changes
164 adding file changes
165 added 2 changesets with 2 changes to 1 files (+2 heads)
165 added 2 changesets with 2 changes to 1 files (+2 heads)
166
166
167 $ hg push -r 5 ../c
167 $ hg push -r 5 ../c
168 pushing to ../c
168 pushing to ../c
169 searching for changes
169 searching for changes
170 adding changesets
170 adding changesets
171 adding manifests
171 adding manifests
172 adding file changes
172 adding file changes
173 added 1 changesets with 1 changes to 1 files (-1 heads)
173 added 1 changesets with 1 changes to 1 files (-1 heads)
174
174
175 $ hg in ../c
175 $ hg in ../c
176 comparing with ../c
176 comparing with ../c
177 searching for changes
177 searching for changes
178 no changes found
178 no changes found
179 [1]
179 [1]
180
180
181
181
182 Issue450: push -r warns about remote head creation even if no heads
182 Issue450: push -r warns about remote head creation even if no heads
183 will be created
183 will be created
184
184
185 $ hg init ../e
185 $ hg init ../e
186 $ hg push -r 0 ../e
186 $ hg push -r 0 ../e
187 pushing to ../e
187 pushing to ../e
188 searching for changes
188 searching for changes
189 adding changesets
189 adding changesets
190 adding manifests
190 adding manifests
191 adding file changes
191 adding file changes
192 added 1 changesets with 1 changes to 1 files
192 added 1 changesets with 1 changes to 1 files
193
193
194 $ hg push -r 1 ../e
194 $ hg push -r 1 ../e
195 pushing to ../e
195 pushing to ../e
196 searching for changes
196 searching for changes
197 adding changesets
197 adding changesets
198 adding manifests
198 adding manifests
199 adding file changes
199 adding file changes
200 added 1 changesets with 1 changes to 1 files
200 added 1 changesets with 1 changes to 1 files
201
201
202 $ cd ..
202 $ cd ..
203
203
204
204
205 Issue736: named branches are not considered for detection of
205 Issue736: named branches are not considered for detection of
206 unmerged heads in "hg push"
206 unmerged heads in "hg push"
207
207
208 $ hg init f
208 $ hg init f
209 $ cd f
209 $ cd f
210 $ hg -q branch a
210 $ hg -q branch a
211 $ echo 0 > foo
211 $ echo 0 > foo
212 $ hg -q ci -Am 0
212 $ hg -q ci -Am 0
213 $ echo 1 > foo
213 $ echo 1 > foo
214 $ hg -q ci -m 1
214 $ hg -q ci -m 1
215 $ hg -q up 0
215 $ hg -q up 0
216 $ echo 2 > foo
216 $ echo 2 > foo
217 $ hg -q ci -m 2
217 $ hg -q ci -m 2
218 $ hg -q up 0
218 $ hg -q up 0
219 $ hg -q branch b
219 $ hg -q branch b
220 $ echo 3 > foo
220 $ echo 3 > foo
221 $ hg -q ci -m 3
221 $ hg -q ci -m 3
222 $ cd ..
222 $ cd ..
223
223
224 $ hg -q clone f g
224 $ hg -q clone f g
225 $ cd g
225 $ cd g
226
226
227 Push on existing branch and new branch:
227 Push on existing branch and new branch:
228
228
229 $ hg -q up 1
229 $ hg -q up 1
230 $ echo 4 > foo
230 $ echo 4 > foo
231 $ hg -q ci -m 4
231 $ hg -q ci -m 4
232 $ hg -q up 0
232 $ hg -q up 0
233 $ echo 5 > foo
233 $ echo 5 > foo
234 $ hg -q branch c
234 $ hg -q branch c
235 $ hg -q ci -m 5
235 $ hg -q ci -m 5
236
236
237 $ hg push ../f
237 $ hg push ../f
238 pushing to ../f
238 pushing to ../f
239 searching for changes
239 searching for changes
240 abort: push creates new remote branches: c!
240 abort: push creates new remote branches: c!
241 (use 'hg push --new-branch' to create new remote branches)
241 (use 'hg push --new-branch' to create new remote branches)
242 [255]
242 [255]
243
243
244 $ hg push -r 4 -r 5 ../f
244 $ hg push -r 4 -r 5 ../f
245 pushing to ../f
245 pushing to ../f
246 searching for changes
246 searching for changes
247 abort: push creates new remote branches: c!
247 abort: push creates new remote branches: c!
248 (use 'hg push --new-branch' to create new remote branches)
248 (use 'hg push --new-branch' to create new remote branches)
249 [255]
249 [255]
250
250
251
251
252 Multiple new branches:
252 Multiple new branches:
253
253
254 $ hg -q branch d
254 $ hg -q branch d
255 $ echo 6 > foo
255 $ echo 6 > foo
256 $ hg -q ci -m 6
256 $ hg -q ci -m 6
257
257
258 $ hg push ../f
258 $ hg push ../f
259 pushing to ../f
259 pushing to ../f
260 searching for changes
260 searching for changes
261 abort: push creates new remote branches: c, d!
261 abort: push creates new remote branches: c, d!
262 (use 'hg push --new-branch' to create new remote branches)
262 (use 'hg push --new-branch' to create new remote branches)
263 [255]
263 [255]
264
264
265 $ hg push -r 4 -r 6 ../f
265 $ hg push -r 4 -r 6 ../f
266 pushing to ../f
266 pushing to ../f
267 searching for changes
267 searching for changes
268 abort: push creates new remote branches: c, d!
268 abort: push creates new remote branches: c, d!
269 (use 'hg push --new-branch' to create new remote branches)
269 (use 'hg push --new-branch' to create new remote branches)
270 [255]
270 [255]
271
271
272 $ cd ../g
272 $ cd ../g
273
273
274
274
275 Fail on multiple head push:
275 Fail on multiple head push:
276
276
277 $ hg -q up 1
277 $ hg -q up 1
278 $ echo 7 > foo
278 $ echo 7 > foo
279 $ hg -q ci -m 7
279 $ hg -q ci -m 7
280
280
281 $ hg push -r 4 -r 7 ../f
281 $ hg push -r 4 -r 7 ../f
282 pushing to ../f
282 pushing to ../f
283 searching for changes
283 searching for changes
284 abort: push creates new remote head 0b715ef6ff8f on branch 'a'!
284 abort: push creates new remote head 0b715ef6ff8f on branch 'a'!
285 (merge or see "hg help push" for details about pushing new heads)
285 (merge or see "hg help push" for details about pushing new heads)
286 [255]
286 [255]
287
287
288 Push replacement head on existing branches:
288 Push replacement head on existing branches:
289
289
290 $ hg -q up 3
290 $ hg -q up 3
291 $ echo 8 > foo
291 $ echo 8 > foo
292 $ hg -q ci -m 8
292 $ hg -q ci -m 8
293
293
294 $ hg push -r 7 -r 8 ../f
294 $ hg push -r 7 -r 8 ../f
295 pushing to ../f
295 pushing to ../f
296 searching for changes
296 searching for changes
297 adding changesets
297 adding changesets
298 adding manifests
298 adding manifests
299 adding file changes
299 adding file changes
300 added 2 changesets with 2 changes to 1 files
300 added 2 changesets with 2 changes to 1 files
301
301
302
302
303 Merge of branch a to other branch b followed by unrelated push
303 Merge of branch a to other branch b followed by unrelated push
304 on branch a:
304 on branch a:
305
305
306 $ hg -q up 7
306 $ hg -q up 7
307 $ HGMERGE=true hg -q merge 8
307 $ HGMERGE=true hg -q merge 8
308 $ hg -q ci -m 9
308 $ hg -q ci -m 9
309 $ hg -q up 8
309 $ hg -q up 8
310 $ echo 10 > foo
310 $ echo 10 > foo
311 $ hg -q ci -m 10
311 $ hg -q ci -m 10
312
312
313 $ hg push -r 9 ../f
313 $ hg push -r 9 ../f
314 pushing to ../f
314 pushing to ../f
315 searching for changes
315 searching for changes
316 adding changesets
316 adding changesets
317 adding manifests
317 adding manifests
318 adding file changes
318 adding file changes
319 added 1 changesets with 1 changes to 1 files (-1 heads)
319 added 1 changesets with 1 changes to 1 files (-1 heads)
320
320
321 $ hg push -r 10 ../f
321 $ hg push -r 10 ../f
322 pushing to ../f
322 pushing to ../f
323 searching for changes
323 searching for changes
324 adding changesets
324 adding changesets
325 adding manifests
325 adding manifests
326 adding file changes
326 adding file changes
327 added 1 changesets with 1 changes to 1 files (+1 heads)
327 added 1 changesets with 1 changes to 1 files (+1 heads)
328
328
329
329
330 Cheating the counting algorithm:
330 Cheating the counting algorithm:
331
331
332 $ hg -q up 9
332 $ hg -q up 9
333 $ HGMERGE=true hg -q merge 2
333 $ HGMERGE=true hg -q merge 2
334 $ hg -q ci -m 11
334 $ hg -q ci -m 11
335 $ hg -q up 1
335 $ hg -q up 1
336 $ echo 12 > foo
336 $ echo 12 > foo
337 $ hg -q ci -m 12
337 $ hg -q ci -m 12
338
338
339 $ hg push -r 11 -r 12 ../f
339 $ hg push -r 11 -r 12 ../f
340 pushing to ../f
340 pushing to ../f
341 searching for changes
341 searching for changes
342 adding changesets
342 adding changesets
343 adding manifests
343 adding manifests
344 adding file changes
344 adding file changes
345 added 2 changesets with 2 changes to 1 files
345 added 2 changesets with 2 changes to 1 files
346
346
347
347
348 Failed push of new named branch:
348 Failed push of new named branch:
349
349
350 $ echo 12 > foo
350 $ echo 12 > foo
351 $ hg -q ci -m 12a
351 $ hg -q ci -m 12a
352 [1]
352 [1]
353 $ hg -q up 11
353 $ hg -q up 11
354 $ echo 13 > foo
354 $ echo 13 > foo
355 $ hg -q branch e
355 $ hg -q branch e
356 $ hg -q ci -m 13d
356 $ hg -q ci -m 13d
357
357
358 $ hg push -r 12 -r 13 ../f
358 $ hg push -r 12 -r 13 ../f
359 pushing to ../f
359 pushing to ../f
360 searching for changes
360 searching for changes
361 abort: push creates new remote branches: e!
361 abort: push creates new remote branches: e!
362 (use 'hg push --new-branch' to create new remote branches)
362 (use 'hg push --new-branch' to create new remote branches)
363 [255]
363 [255]
364
364
365
365
366 Using --new-branch to push new named branch:
366 Using --new-branch to push new named branch:
367
367
368 $ hg push --new-branch -r 12 -r 13 ../f
368 $ hg push --new-branch -r 12 -r 13 ../f
369 pushing to ../f
369 pushing to ../f
370 searching for changes
370 searching for changes
371 adding changesets
371 adding changesets
372 adding manifests
372 adding manifests
373 adding file changes
373 adding file changes
374 added 1 changesets with 1 changes to 1 files
374 added 1 changesets with 1 changes to 1 files
375
375
376 Pushing multi headed new branch:
376 Pushing multi headed new branch:
377
377
378 $ echo 14 > foo
378 $ echo 14 > foo
379 $ hg -q branch f
379 $ hg -q branch f
380 $ hg -q ci -m 14
380 $ hg -q ci -m 14
381 $ echo 15 > foo
381 $ echo 15 > foo
382 $ hg -q ci -m 15
382 $ hg -q ci -m 15
383 $ hg -q up 14
383 $ hg -q up 14
384 $ echo 16 > foo
384 $ echo 16 > foo
385 $ hg -q ci -m 16
385 $ hg -q ci -m 16
386 $ hg push --branch f --new-branch ../f
386 $ hg push --branch f --new-branch ../f
387 pushing to ../f
387 pushing to ../f
388 searching for changes
388 searching for changes
389 abort: push creates new branch 'f' with multiple heads
389 abort: push creates new branch 'f' with multiple heads
390 (merge or see "hg help push" for details about pushing new heads)
390 (merge or see "hg help push" for details about pushing new heads)
391 [255]
391 [255]
392 $ hg push --branch f --new-branch --force ../f
392 $ hg push --branch f --new-branch --force ../f
393 pushing to ../f
393 pushing to ../f
394 searching for changes
394 searching for changes
395 adding changesets
395 adding changesets
396 adding manifests
396 adding manifests
397 adding file changes
397 adding file changes
398 added 3 changesets with 3 changes to 1 files (+1 heads)
398 added 3 changesets with 3 changes to 1 files (+1 heads)
399
399
400 Checking prepush logic does not allow silently pushing
400 Checking prepush logic does not allow silently pushing
401 multiple new heads but also doesn't report too many heads:
401 multiple new heads but also doesn't report too many heads:
402
402
403 $ cd ..
403 $ cd ..
404 $ hg init h
404 $ hg init h
405 $ echo init > h/init
405 $ echo init > h/init
406 $ hg -R h ci -Am init
406 $ hg -R h ci -Am init
407 adding init
407 adding init
408 $ echo a > h/a
408 $ echo a > h/a
409 $ hg -R h ci -Am a
409 $ hg -R h ci -Am a
410 adding a
410 adding a
411 $ hg clone h i
411 $ hg clone h i
412 updating to branch default
412 updating to branch default
413 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
413 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
414 $ hg -R h up 0
414 $ hg -R h up 0
415 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
415 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
416 $ echo b > h/b
416 $ echo b > h/b
417 $ hg -R h ci -Am b
417 $ hg -R h ci -Am b
418 adding b
418 adding b
419 created new head
419 created new head
420 $ hg -R i up 0
420 $ hg -R i up 0
421 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
421 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
422 $ echo c > i/c
422 $ echo c > i/c
423 $ hg -R i ci -Am c
423 $ hg -R i ci -Am c
424 adding c
424 adding c
425 created new head
425 created new head
426
426
427 $ for i in `python $TESTDIR/seq.py 3`; do hg -R h up -q 0; echo $i > h/b; hg -R h ci -qAm$i; done
427 $ for i in `python $TESTDIR/seq.py 3`; do hg -R h up -q 0; echo $i > h/b; hg -R h ci -qAm$i; done
428
428
429 $ hg -R i push h
429 $ hg -R i push h
430 pushing to h
430 pushing to h
431 searching for changes
431 searching for changes
432 remote has heads on branch 'default' that are not known locally: 534543e22c29 764f8ec07b96 afe7cc7679f5 ce4212fc8847
432 remote has heads on branch 'default' that are not known locally: 534543e22c29 764f8ec07b96 afe7cc7679f5 ce4212fc8847
433 abort: push creates new remote head 97bd0c84d346!
433 abort: push creates new remote head 97bd0c84d346!
434 (pull and merge or see "hg help push" for details about pushing new heads)
434 (pull and merge or see "hg help push" for details about pushing new heads)
435 [255]
435 [255]
436 $ hg -R h up -q 0; echo x > h/b; hg -R h ci -qAmx
436 $ hg -R h up -q 0; echo x > h/b; hg -R h ci -qAmx
437 $ hg -R i push h
437 $ hg -R i push h
438 pushing to h
438 pushing to h
439 searching for changes
439 searching for changes
440 remote has heads on branch 'default' that are not known locally: 18ddb72c4590 534543e22c29 764f8ec07b96 afe7cc7679f5 and 1 others
440 remote has heads on branch 'default' that are not known locally: 18ddb72c4590 534543e22c29 764f8ec07b96 afe7cc7679f5 and 1 others
441 abort: push creates new remote head 97bd0c84d346!
441 abort: push creates new remote head 97bd0c84d346!
442 (pull and merge or see "hg help push" for details about pushing new heads)
442 (pull and merge or see "hg help push" for details about pushing new heads)
443 [255]
443 [255]
444 $ hg -R i push h -v
444 $ hg -R i push h -v
445 pushing to h
445 pushing to h
446 searching for changes
446 searching for changes
447 remote has heads on branch 'default' that are not known locally: 18ddb72c4590 534543e22c29 764f8ec07b96 afe7cc7679f5 ce4212fc8847
447 remote has heads on branch 'default' that are not known locally: 18ddb72c4590 534543e22c29 764f8ec07b96 afe7cc7679f5 ce4212fc8847
448 new remote heads on branch 'default':
448 new remote heads on branch 'default':
449 97bd0c84d346
449 97bd0c84d346
450 abort: push creates new remote head 97bd0c84d346!
450 abort: push creates new remote head 97bd0c84d346!
451 (pull and merge or see "hg help push" for details about pushing new heads)
451 (pull and merge or see "hg help push" for details about pushing new heads)
452 [255]
452 [255]
453
453
454
454
455 Check prepush logic with merged branches:
455 Check prepush logic with merged branches:
456
456
457 $ hg init j
457 $ hg init j
458 $ hg -R j branch a
458 $ hg -R j branch a
459 marked working directory as branch a
459 marked working directory as branch a
460 (branches are permanent and global, did you want a bookmark?)
460 (branches are permanent and global, did you want a bookmark?)
461 $ echo init > j/foo
461 $ echo init > j/foo
462 $ hg -R j ci -Am init
462 $ hg -R j ci -Am init
463 adding foo
463 adding foo
464 $ hg clone j k
464 $ hg clone j k
465 updating to branch a
465 updating to branch a
466 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
466 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
467 $ echo a1 > j/foo
467 $ echo a1 > j/foo
468 $ hg -R j ci -m a1
468 $ hg -R j ci -m a1
469 $ hg -R k branch b
469 $ hg -R k branch b
470 marked working directory as branch b
470 marked working directory as branch b
471 $ echo b > k/foo
471 $ echo b > k/foo
472 $ hg -R k ci -m b
472 $ hg -R k ci -m b
473 $ hg -R k up 0
473 $ hg -R k up 0
474 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
474 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
475
475
476 $ hg -R k merge b
476 $ hg -R k merge b
477 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
477 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
478 (branch merge, don't forget to commit)
478 (branch merge, don't forget to commit)
479
479
480 $ hg -R k ci -m merge
480 $ hg -R k ci -m merge
481
481
482 $ hg -R k push -r a j
482 $ hg -R k push -r a j
483 pushing to j
483 pushing to j
484 searching for changes
484 searching for changes
485 abort: push creates new remote branches: b!
485 abort: push creates new remote branches: b!
486 (use 'hg push --new-branch' to create new remote branches)
486 (use 'hg push --new-branch' to create new remote branches)
487 [255]
487 [255]
488
488
489
489
490 Prepush -r should not allow you to sneak in new heads:
490 Prepush -r should not allow you to sneak in new heads:
491
491
492 $ hg init l
492 $ hg init l
493 $ cd l
493 $ cd l
494 $ echo a >> foo
494 $ echo a >> foo
495 $ hg -q add foo
495 $ hg -q add foo
496 $ hg -q branch a
496 $ hg -q branch a
497 $ hg -q ci -ma
497 $ hg -q ci -ma
498 $ hg -q up null
498 $ hg -q up null
499 $ echo a >> foo
499 $ echo a >> foo
500 $ hg -q add foo
500 $ hg -q add foo
501 $ hg -q branch b
501 $ hg -q branch b
502 $ hg -q ci -mb
502 $ hg -q ci -mb
503 $ cd ..
503 $ cd ..
504 $ hg -q clone l m -u a
504 $ hg -q clone l m -u a
505 $ cd m
505 $ cd m
506 $ hg -q merge b
506 $ hg -q merge b
507 $ hg -q ci -mmb
507 $ hg -q ci -mmb
508 $ hg -q up 0
508 $ hg -q up 0
509 $ echo a >> foo
509 $ echo a >> foo
510 $ hg -q ci -ma2
510 $ hg -q ci -ma2
511 $ hg -q up 2
511 $ hg -q up 2
512 $ echo a >> foo
512 $ echo a >> foo
513 $ hg -q branch -f b
513 $ hg -q branch -f b
514 $ hg -q ci -mb2
514 $ hg -q ci -mb2
515 $ hg -q merge 3
515 $ hg -q merge 3
516 $ hg -q ci -mma
516 $ hg -q ci -mma
517
517
518 $ hg push ../l -b b
518 $ hg push ../l -b b
519 pushing to ../l
519 pushing to ../l
520 searching for changes
520 searching for changes
521 abort: push creates new remote head 451211cc22b0 on branch 'a'!
521 abort: push creates new remote head 451211cc22b0 on branch 'a'!
522 (merge or see "hg help push" for details about pushing new heads)
522 (merge or see "hg help push" for details about pushing new heads)
523 [255]
523 [255]
524
524
525 $ cd ..
525 $ cd ..
526
526
527
527
528 Check prepush with new branch head on former topo non-head:
528 Check prepush with new branch head on former topo non-head:
529
529
530 $ hg init n
530 $ hg init n
531 $ cd n
531 $ cd n
532 $ hg branch A
532 $ hg branch A
533 marked working directory as branch A
533 marked working directory as branch A
534 (branches are permanent and global, did you want a bookmark?)
534 (branches are permanent and global, did you want a bookmark?)
535 $ echo a >a
535 $ echo a >a
536 $ hg ci -Ama
536 $ hg ci -Ama
537 adding a
537 adding a
538 $ hg branch B
538 $ hg branch B
539 marked working directory as branch B
539 marked working directory as branch B
540 $ echo b >b
540 $ echo b >b
541 $ hg ci -Amb
541 $ hg ci -Amb
542 adding b
542 adding b
543
543
544 b is now branch head of B, and a topological head
544 b is now branch head of B, and a topological head
545 a is now branch head of A, but not a topological head
545 a is now branch head of A, but not a topological head
546
546
547 $ hg clone . inner
547 $ hg clone . inner
548 updating to branch B
548 updating to branch B
549 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
549 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
550 $ cd inner
550 $ cd inner
551 $ hg up B
551 $ hg up B
552 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
552 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
553 $ echo b1 >b1
553 $ echo b1 >b1
554 $ hg ci -Amb1
554 $ hg ci -Amb1
555 adding b1
555 adding b1
556
556
557 in the clone b1 is now the head of B
557 in the clone b1 is now the head of B
558
558
559 $ cd ..
559 $ cd ..
560 $ hg up 0
560 $ hg up 0
561 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
561 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
562 $ echo a2 >a2
562 $ echo a2 >a2
563 $ hg ci -Ama2
563 $ hg ci -Ama2
564 adding a2
564 adding a2
565
565
566 a2 is now the new branch head of A, and a new topological head
566 a2 is now the new branch head of A, and a new topological head
567 it replaces a former inner branch head, so it should at most warn about
567 it replaces a former inner branch head, so it should at most warn about
568 A, not B
568 A, not B
569
569
570 glog of local:
570 glog of local:
571
571
572 $ hg log -G --template "{rev}: {branches} {desc}\n"
572 $ hg log -G --template "{rev}: {branches} {desc}\n"
573 @ 2: A a2
573 @ 2: A a2
574 |
574 |
575 | o 1: B b
575 | o 1: B b
576 |/
576 |/
577 o 0: A a
577 o 0: A a
578
578
579 glog of remote:
579 glog of remote:
580
580
581 $ hg log -G -R inner --template "{rev}: {branches} {desc}\n"
581 $ hg log -G -R inner --template "{rev}: {branches} {desc}\n"
582 @ 2: B b1
582 @ 2: B b1
583 |
583 |
584 o 1: B b
584 o 1: B b
585 |
585 |
586 o 0: A a
586 o 0: A a
587
587
588 outgoing:
588 outgoing:
589
589
590 $ hg out inner --template "{rev}: {branches} {desc}\n"
590 $ hg out inner --template "{rev}: {branches} {desc}\n"
591 comparing with inner
591 comparing with inner
592 searching for changes
592 searching for changes
593 2: A a2
593 2: A a2
594
594
595 $ hg push inner
595 $ hg push inner
596 pushing to inner
596 pushing to inner
597 searching for changes
597 searching for changes
598 adding changesets
598 adding changesets
599 adding manifests
599 adding manifests
600 adding file changes
600 adding file changes
601 added 1 changesets with 1 changes to 1 files (+1 heads)
601 added 1 changesets with 1 changes to 1 files (+1 heads)
602
602
603 $ cd ..
603 $ cd ..
604
604
605
605
606 Check prepush with new branch head on former topo head:
606 Check prepush with new branch head on former topo head:
607
607
608 $ hg init o
608 $ hg init o
609 $ cd o
609 $ cd o
610 $ hg branch A
610 $ hg branch A
611 marked working directory as branch A
611 marked working directory as branch A
612 (branches are permanent and global, did you want a bookmark?)
612 (branches are permanent and global, did you want a bookmark?)
613 $ echo a >a
613 $ echo a >a
614 $ hg ci -Ama
614 $ hg ci -Ama
615 adding a
615 adding a
616 $ hg branch B
616 $ hg branch B
617 marked working directory as branch B
617 marked working directory as branch B
618 $ echo b >b
618 $ echo b >b
619 $ hg ci -Amb
619 $ hg ci -Amb
620 adding b
620 adding b
621
621
622 b is now branch head of B, and a topological head
622 b is now branch head of B, and a topological head
623
623
624 $ hg up 0
624 $ hg up 0
625 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
625 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
626 $ echo a1 >a1
626 $ echo a1 >a1
627 $ hg ci -Ama1
627 $ hg ci -Ama1
628 adding a1
628 adding a1
629
629
630 a1 is now branch head of A, and a topological head
630 a1 is now branch head of A, and a topological head
631
631
632 $ hg clone . inner
632 $ hg clone . inner
633 updating to branch A
633 updating to branch A
634 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
634 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
635 $ cd inner
635 $ cd inner
636 $ hg up B
636 $ hg up B
637 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
637 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
638 $ echo b1 >b1
638 $ echo b1 >b1
639 $ hg ci -Amb1
639 $ hg ci -Amb1
640 adding b1
640 adding b1
641
641
642 in the clone b1 is now the head of B
642 in the clone b1 is now the head of B
643
643
644 $ cd ..
644 $ cd ..
645 $ echo a2 >a2
645 $ echo a2 >a2
646 $ hg ci -Ama2
646 $ hg ci -Ama2
647 adding a2
647 adding a2
648
648
649 a2 is now the new branch head of A, and a topological head
649 a2 is now the new branch head of A, and a topological head
650 it replaces a former topological and branch head, so this should not warn
650 it replaces a former topological and branch head, so this should not warn
651
651
652 glog of local:
652 glog of local:
653
653
654 $ hg log -G --template "{rev}: {branches} {desc}\n"
654 $ hg log -G --template "{rev}: {branches} {desc}\n"
655 @ 3: A a2
655 @ 3: A a2
656 |
656 |
657 o 2: A a1
657 o 2: A a1
658 |
658 |
659 | o 1: B b
659 | o 1: B b
660 |/
660 |/
661 o 0: A a
661 o 0: A a
662
662
663 glog of remote:
663 glog of remote:
664
664
665 $ hg log -G -R inner --template "{rev}: {branches} {desc}\n"
665 $ hg log -G -R inner --template "{rev}: {branches} {desc}\n"
666 @ 3: B b1
666 @ 3: B b1
667 |
667 |
668 | o 2: A a1
668 | o 2: A a1
669 | |
669 | |
670 o | 1: B b
670 o | 1: B b
671 |/
671 |/
672 o 0: A a
672 o 0: A a
673
673
674 outgoing:
674 outgoing:
675
675
676 $ hg out inner --template "{rev}: {branches} {desc}\n"
676 $ hg out inner --template "{rev}: {branches} {desc}\n"
677 comparing with inner
677 comparing with inner
678 searching for changes
678 searching for changes
679 3: A a2
679 3: A a2
680
680
681 $ hg push inner
681 $ hg push inner
682 pushing to inner
682 pushing to inner
683 searching for changes
683 searching for changes
684 adding changesets
684 adding changesets
685 adding manifests
685 adding manifests
686 adding file changes
686 adding file changes
687 added 1 changesets with 1 changes to 1 files
687 added 1 changesets with 1 changes to 1 files
688
688
689 $ cd ..
689 $ cd ..
690
690
691
691
692 Check prepush with new branch head and new child of former branch head
692 Check prepush with new branch head and new child of former branch head
693 but child is on different branch:
693 but child is on different branch:
694
694
695 $ hg init p
695 $ hg init p
696 $ cd p
696 $ cd p
697 $ hg branch A
697 $ hg branch A
698 marked working directory as branch A
698 marked working directory as branch A
699 (branches are permanent and global, did you want a bookmark?)
699 (branches are permanent and global, did you want a bookmark?)
700 $ echo a0 >a
700 $ echo a0 >a
701 $ hg ci -Ama0
701 $ hg ci -Ama0
702 adding a
702 adding a
703 $ echo a1 >a
703 $ echo a1 >a
704 $ hg ci -ma1
704 $ hg ci -ma1
705 $ hg up null
705 $ hg up null
706 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
706 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
707 $ hg branch B
707 $ hg branch B
708 marked working directory as branch B
708 marked working directory as branch B
709 $ echo b0 >b
709 $ echo b0 >b
710 $ hg ci -Amb0
710 $ hg ci -Amb0
711 adding b
711 adding b
712 $ echo b1 >b
712 $ echo b1 >b
713 $ hg ci -mb1
713 $ hg ci -mb1
714
714
715 $ hg clone . inner
715 $ hg clone . inner
716 updating to branch B
716 updating to branch B
717 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
717 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
718
718
719 $ hg up A
719 $ hg up A
720 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
720 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
721 $ hg branch -f B
721 $ hg branch -f B
722 marked working directory as branch B
722 marked working directory as branch B
723 $ echo a3 >a
723 $ echo a3 >a
724 $ hg ci -ma3
724 $ hg ci -ma3
725 created new head
725 created new head
726 $ hg up 3
726 $ hg up 3
727 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
727 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
728 $ hg branch -f A
728 $ hg branch -f A
729 marked working directory as branch A
729 marked working directory as branch A
730 $ echo b3 >b
730 $ echo b3 >b
731 $ hg ci -mb3
731 $ hg ci -mb3
732 created new head
732 created new head
733
733
734 glog of local:
734 glog of local:
735
735
736 $ hg log -G --template "{rev}: {branches} {desc}\n"
736 $ hg log -G --template "{rev}: {branches} {desc}\n"
737 @ 5: A b3
737 @ 5: A b3
738 |
738 |
739 | o 4: B a3
739 | o 4: B a3
740 | |
740 | |
741 o | 3: B b1
741 o | 3: B b1
742 | |
742 | |
743 o | 2: B b0
743 o | 2: B b0
744 /
744 /
745 o 1: A a1
745 o 1: A a1
746 |
746 |
747 o 0: A a0
747 o 0: A a0
748
748
749 glog of remote:
749 glog of remote:
750
750
751 $ hg log -G -R inner --template "{rev}: {branches} {desc}\n"
751 $ hg log -G -R inner --template "{rev}: {branches} {desc}\n"
752 @ 3: B b1
752 @ 3: B b1
753 |
753 |
754 o 2: B b0
754 o 2: B b0
755
755
756 o 1: A a1
756 o 1: A a1
757 |
757 |
758 o 0: A a0
758 o 0: A a0
759
759
760 outgoing:
760 outgoing:
761
761
762 $ hg out inner --template "{rev}: {branches} {desc}\n"
762 $ hg out inner --template "{rev}: {branches} {desc}\n"
763 comparing with inner
763 comparing with inner
764 searching for changes
764 searching for changes
765 4: B a3
765 4: B a3
766 5: A b3
766 5: A b3
767
767
768 $ hg push inner
768 $ hg push inner
769 pushing to inner
769 pushing to inner
770 searching for changes
770 searching for changes
771 abort: push creates new remote head 7d0f4fb6cf04 on branch 'A'!
771 abort: push creates new remote head 7d0f4fb6cf04 on branch 'A'!
772 (merge or see "hg help push" for details about pushing new heads)
772 (merge or see "hg help push" for details about pushing new heads)
773 [255]
773 [255]
774
774
775 $ hg push inner -r4 -r5
775 $ hg push inner -r4 -r5
776 pushing to inner
776 pushing to inner
777 searching for changes
777 searching for changes
778 abort: push creates new remote head 7d0f4fb6cf04 on branch 'A'!
778 abort: push creates new remote head 7d0f4fb6cf04 on branch 'A'!
779 (merge or see "hg help push" for details about pushing new heads)
779 (merge or see "hg help push" for details about pushing new heads)
780 [255]
780 [255]
781
781
782 $ hg in inner
782 $ hg in inner
783 comparing with inner
783 comparing with inner
784 searching for changes
784 searching for changes
785 no changes found
785 no changes found
786 [1]
786 [1]
787
787
788 Test fail hook
789
790 $ hg push inner --config hooks.fail-push="echo running fail-push hook"
791 pushing to inner
792 searching for changes
793 running fail-push hook
794 abort: push creates new remote head 7d0f4fb6cf04 on branch 'A'!
795 (merge or see "hg help push" for details about pushing new heads)
796 [255]
797
788 $ cd ..
798 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now