##// END OF EJS Templates
color: special case 'always' in 'ui.color'...
Pierre-Yves David -
r32104:9a98023a stable
parent child Browse files
Show More
@@ -1,512 +1,513 b''
1 # utility for color output for Mercurial commands
1 # utility for color output for Mercurial commands
2 #
2 #
3 # Copyright (C) 2007 Kevin Christen <kevin.christen@gmail.com> and other
3 # Copyright (C) 2007 Kevin Christen <kevin.christen@gmail.com> and other
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
8 from __future__ import absolute_import
9
9
10 import re
10 import re
11
11
12 from .i18n import _
12 from .i18n import _
13
13
14 from . import (
14 from . import (
15 encoding,
15 encoding,
16 pycompat,
16 pycompat,
17 util
17 util
18 )
18 )
19
19
20 try:
20 try:
21 import curses
21 import curses
22 # Mapping from effect name to terminfo attribute name (or raw code) or
22 # Mapping from effect name to terminfo attribute name (or raw code) or
23 # color number. This will also force-load the curses module.
23 # color number. This will also force-load the curses module.
24 _baseterminfoparams = {
24 _baseterminfoparams = {
25 'none': (True, 'sgr0', ''),
25 'none': (True, 'sgr0', ''),
26 'standout': (True, 'smso', ''),
26 'standout': (True, 'smso', ''),
27 'underline': (True, 'smul', ''),
27 'underline': (True, 'smul', ''),
28 'reverse': (True, 'rev', ''),
28 'reverse': (True, 'rev', ''),
29 'inverse': (True, 'rev', ''),
29 'inverse': (True, 'rev', ''),
30 'blink': (True, 'blink', ''),
30 'blink': (True, 'blink', ''),
31 'dim': (True, 'dim', ''),
31 'dim': (True, 'dim', ''),
32 'bold': (True, 'bold', ''),
32 'bold': (True, 'bold', ''),
33 'invisible': (True, 'invis', ''),
33 'invisible': (True, 'invis', ''),
34 'italic': (True, 'sitm', ''),
34 'italic': (True, 'sitm', ''),
35 'black': (False, curses.COLOR_BLACK, ''),
35 'black': (False, curses.COLOR_BLACK, ''),
36 'red': (False, curses.COLOR_RED, ''),
36 'red': (False, curses.COLOR_RED, ''),
37 'green': (False, curses.COLOR_GREEN, ''),
37 'green': (False, curses.COLOR_GREEN, ''),
38 'yellow': (False, curses.COLOR_YELLOW, ''),
38 'yellow': (False, curses.COLOR_YELLOW, ''),
39 'blue': (False, curses.COLOR_BLUE, ''),
39 'blue': (False, curses.COLOR_BLUE, ''),
40 'magenta': (False, curses.COLOR_MAGENTA, ''),
40 'magenta': (False, curses.COLOR_MAGENTA, ''),
41 'cyan': (False, curses.COLOR_CYAN, ''),
41 'cyan': (False, curses.COLOR_CYAN, ''),
42 'white': (False, curses.COLOR_WHITE, ''),
42 'white': (False, curses.COLOR_WHITE, ''),
43 }
43 }
44 except ImportError:
44 except ImportError:
45 curses = None
45 curses = None
46 _baseterminfoparams = {}
46 _baseterminfoparams = {}
47
47
48 _enabledbydefault = True
48 _enabledbydefault = True
49
49
50 # start and stop parameters for effects
50 # start and stop parameters for effects
51 _effects = {
51 _effects = {
52 'none': 0,
52 'none': 0,
53 'black': 30,
53 'black': 30,
54 'red': 31,
54 'red': 31,
55 'green': 32,
55 'green': 32,
56 'yellow': 33,
56 'yellow': 33,
57 'blue': 34,
57 'blue': 34,
58 'magenta': 35,
58 'magenta': 35,
59 'cyan': 36,
59 'cyan': 36,
60 'white': 37,
60 'white': 37,
61 'bold': 1,
61 'bold': 1,
62 'italic': 3,
62 'italic': 3,
63 'underline': 4,
63 'underline': 4,
64 'inverse': 7,
64 'inverse': 7,
65 'dim': 2,
65 'dim': 2,
66 'black_background': 40,
66 'black_background': 40,
67 'red_background': 41,
67 'red_background': 41,
68 'green_background': 42,
68 'green_background': 42,
69 'yellow_background': 43,
69 'yellow_background': 43,
70 'blue_background': 44,
70 'blue_background': 44,
71 'purple_background': 45,
71 'purple_background': 45,
72 'cyan_background': 46,
72 'cyan_background': 46,
73 'white_background': 47,
73 'white_background': 47,
74 }
74 }
75
75
76 _defaultstyles = {
76 _defaultstyles = {
77 'grep.match': 'red bold',
77 'grep.match': 'red bold',
78 'grep.linenumber': 'green',
78 'grep.linenumber': 'green',
79 'grep.rev': 'green',
79 'grep.rev': 'green',
80 'grep.change': 'green',
80 'grep.change': 'green',
81 'grep.sep': 'cyan',
81 'grep.sep': 'cyan',
82 'grep.filename': 'magenta',
82 'grep.filename': 'magenta',
83 'grep.user': 'magenta',
83 'grep.user': 'magenta',
84 'grep.date': 'magenta',
84 'grep.date': 'magenta',
85 'bookmarks.active': 'green',
85 'bookmarks.active': 'green',
86 'branches.active': 'none',
86 'branches.active': 'none',
87 'branches.closed': 'black bold',
87 'branches.closed': 'black bold',
88 'branches.current': 'green',
88 'branches.current': 'green',
89 'branches.inactive': 'none',
89 'branches.inactive': 'none',
90 'diff.changed': 'white',
90 'diff.changed': 'white',
91 'diff.deleted': 'red',
91 'diff.deleted': 'red',
92 'diff.diffline': 'bold',
92 'diff.diffline': 'bold',
93 'diff.extended': 'cyan bold',
93 'diff.extended': 'cyan bold',
94 'diff.file_a': 'red bold',
94 'diff.file_a': 'red bold',
95 'diff.file_b': 'green bold',
95 'diff.file_b': 'green bold',
96 'diff.hunk': 'magenta',
96 'diff.hunk': 'magenta',
97 'diff.inserted': 'green',
97 'diff.inserted': 'green',
98 'diff.tab': '',
98 'diff.tab': '',
99 'diff.trailingwhitespace': 'bold red_background',
99 'diff.trailingwhitespace': 'bold red_background',
100 'changeset.public' : '',
100 'changeset.public' : '',
101 'changeset.draft' : '',
101 'changeset.draft' : '',
102 'changeset.secret' : '',
102 'changeset.secret' : '',
103 'diffstat.deleted': 'red',
103 'diffstat.deleted': 'red',
104 'diffstat.inserted': 'green',
104 'diffstat.inserted': 'green',
105 'histedit.remaining': 'red bold',
105 'histedit.remaining': 'red bold',
106 'ui.prompt': 'yellow',
106 'ui.prompt': 'yellow',
107 'log.changeset': 'yellow',
107 'log.changeset': 'yellow',
108 'patchbomb.finalsummary': '',
108 'patchbomb.finalsummary': '',
109 'patchbomb.from': 'magenta',
109 'patchbomb.from': 'magenta',
110 'patchbomb.to': 'cyan',
110 'patchbomb.to': 'cyan',
111 'patchbomb.subject': 'green',
111 'patchbomb.subject': 'green',
112 'patchbomb.diffstats': '',
112 'patchbomb.diffstats': '',
113 'rebase.rebased': 'blue',
113 'rebase.rebased': 'blue',
114 'rebase.remaining': 'red bold',
114 'rebase.remaining': 'red bold',
115 'resolve.resolved': 'green bold',
115 'resolve.resolved': 'green bold',
116 'resolve.unresolved': 'red bold',
116 'resolve.unresolved': 'red bold',
117 'shelve.age': 'cyan',
117 'shelve.age': 'cyan',
118 'shelve.newest': 'green bold',
118 'shelve.newest': 'green bold',
119 'shelve.name': 'blue bold',
119 'shelve.name': 'blue bold',
120 'status.added': 'green bold',
120 'status.added': 'green bold',
121 'status.clean': 'none',
121 'status.clean': 'none',
122 'status.copied': 'none',
122 'status.copied': 'none',
123 'status.deleted': 'cyan bold underline',
123 'status.deleted': 'cyan bold underline',
124 'status.ignored': 'black bold',
124 'status.ignored': 'black bold',
125 'status.modified': 'blue bold',
125 'status.modified': 'blue bold',
126 'status.removed': 'red bold',
126 'status.removed': 'red bold',
127 'status.unknown': 'magenta bold underline',
127 'status.unknown': 'magenta bold underline',
128 'tags.normal': 'green',
128 'tags.normal': 'green',
129 'tags.local': 'black bold',
129 'tags.local': 'black bold',
130 }
130 }
131
131
132 def loadcolortable(ui, extname, colortable):
132 def loadcolortable(ui, extname, colortable):
133 _defaultstyles.update(colortable)
133 _defaultstyles.update(colortable)
134
134
135 def _terminfosetup(ui, mode):
135 def _terminfosetup(ui, mode):
136 '''Initialize terminfo data and the terminal if we're in terminfo mode.'''
136 '''Initialize terminfo data and the terminal if we're in terminfo mode.'''
137
137
138 # If we failed to load curses, we go ahead and return.
138 # If we failed to load curses, we go ahead and return.
139 if curses is None:
139 if curses is None:
140 return
140 return
141 # Otherwise, see what the config file says.
141 # Otherwise, see what the config file says.
142 if mode not in ('auto', 'terminfo'):
142 if mode not in ('auto', 'terminfo'):
143 return
143 return
144 ui._terminfoparams.update(_baseterminfoparams)
144 ui._terminfoparams.update(_baseterminfoparams)
145
145
146 for key, val in ui.configitems('color'):
146 for key, val in ui.configitems('color'):
147 if key.startswith('color.'):
147 if key.startswith('color.'):
148 newval = (False, int(val), '')
148 newval = (False, int(val), '')
149 ui._terminfoparams[key[6:]] = newval
149 ui._terminfoparams[key[6:]] = newval
150 elif key.startswith('terminfo.'):
150 elif key.startswith('terminfo.'):
151 newval = (True, '', val.replace('\\E', '\x1b'))
151 newval = (True, '', val.replace('\\E', '\x1b'))
152 ui._terminfoparams[key[9:]] = newval
152 ui._terminfoparams[key[9:]] = newval
153 try:
153 try:
154 curses.setupterm()
154 curses.setupterm()
155 except curses.error as e:
155 except curses.error as e:
156 ui._terminfoparams.clear()
156 ui._terminfoparams.clear()
157 return
157 return
158
158
159 for key, (b, e, c) in ui._terminfoparams.items():
159 for key, (b, e, c) in ui._terminfoparams.items():
160 if not b:
160 if not b:
161 continue
161 continue
162 if not c and not curses.tigetstr(e):
162 if not c and not curses.tigetstr(e):
163 # Most terminals don't support dim, invis, etc, so don't be
163 # Most terminals don't support dim, invis, etc, so don't be
164 # noisy and use ui.debug().
164 # noisy and use ui.debug().
165 ui.debug("no terminfo entry for %s\n" % e)
165 ui.debug("no terminfo entry for %s\n" % e)
166 del ui._terminfoparams[key]
166 del ui._terminfoparams[key]
167 if not curses.tigetstr('setaf') or not curses.tigetstr('setab'):
167 if not curses.tigetstr('setaf') or not curses.tigetstr('setab'):
168 # Only warn about missing terminfo entries if we explicitly asked for
168 # Only warn about missing terminfo entries if we explicitly asked for
169 # terminfo mode.
169 # terminfo mode.
170 if mode == "terminfo":
170 if mode == "terminfo":
171 ui.warn(_("no terminfo entry for setab/setaf: reverting to "
171 ui.warn(_("no terminfo entry for setab/setaf: reverting to "
172 "ECMA-48 color\n"))
172 "ECMA-48 color\n"))
173 ui._terminfoparams.clear()
173 ui._terminfoparams.clear()
174
174
175 def setup(ui):
175 def setup(ui):
176 """configure color on a ui
176 """configure color on a ui
177
177
178 That function both set the colormode for the ui object and read
178 That function both set the colormode for the ui object and read
179 the configuration looking for custom colors and effect definitions."""
179 the configuration looking for custom colors and effect definitions."""
180 mode = _modesetup(ui)
180 mode = _modesetup(ui)
181 ui._colormode = mode
181 ui._colormode = mode
182 if mode and mode != 'debug':
182 if mode and mode != 'debug':
183 configstyles(ui)
183 configstyles(ui)
184
184
185 def _modesetup(ui):
185 def _modesetup(ui):
186 if ui.plain():
186 if ui.plain():
187 return None
187 return None
188 default = 'never'
188 default = 'never'
189 if _enabledbydefault:
189 if _enabledbydefault:
190 default = 'auto'
190 default = 'auto'
191 config = ui.config('ui', 'color', default)
191 config = ui.config('ui', 'color', default)
192 if config == 'debug':
192 if config == 'debug':
193 return 'debug'
193 return 'debug'
194
194
195 auto = (config == 'auto')
195 auto = (config == 'auto')
196 always = False
196 always = False
197 if not auto and util.parsebool(config):
197 if not auto and util.parsebool(config):
198 # we want the config to behave like a boolean, "on" is actually auto
198 # We want the config to behave like a boolean, "on" is actually auto,
199 if ui.configsource('ui', 'color') == '--color':
199 # but "always" value is treated as a special case to reduce confusion.
200 if ui.configsource('ui', 'color') == '--color' or config == 'always':
200 always = True
201 always = True
201 else:
202 else:
202 auto = True
203 auto = True
203
204
204 if not always and not auto:
205 if not always and not auto:
205 return None
206 return None
206
207
207 formatted = (always or (encoding.environ.get('TERM') != 'dumb'
208 formatted = (always or (encoding.environ.get('TERM') != 'dumb'
208 and ui.formatted()))
209 and ui.formatted()))
209
210
210 mode = ui.config('color', 'mode', 'auto')
211 mode = ui.config('color', 'mode', 'auto')
211
212
212 # If pager is active, color.pagermode overrides color.mode.
213 # If pager is active, color.pagermode overrides color.mode.
213 if getattr(ui, 'pageractive', False):
214 if getattr(ui, 'pageractive', False):
214 mode = ui.config('color', 'pagermode', mode)
215 mode = ui.config('color', 'pagermode', mode)
215
216
216 realmode = mode
217 realmode = mode
217 if mode == 'auto':
218 if mode == 'auto':
218 if pycompat.osname == 'nt':
219 if pycompat.osname == 'nt':
219 term = encoding.environ.get('TERM')
220 term = encoding.environ.get('TERM')
220 # TERM won't be defined in a vanilla cmd.exe environment.
221 # TERM won't be defined in a vanilla cmd.exe environment.
221
222
222 # UNIX-like environments on Windows such as Cygwin and MSYS will
223 # UNIX-like environments on Windows such as Cygwin and MSYS will
223 # set TERM. They appear to make a best effort attempt at setting it
224 # set TERM. They appear to make a best effort attempt at setting it
224 # to something appropriate. However, not all environments with TERM
225 # to something appropriate. However, not all environments with TERM
225 # defined support ANSI. Since "ansi" could result in terminal
226 # defined support ANSI. Since "ansi" could result in terminal
226 # gibberish, we error on the side of selecting "win32". However, if
227 # gibberish, we error on the side of selecting "win32". However, if
227 # w32effects is not defined, we almost certainly don't support
228 # w32effects is not defined, we almost certainly don't support
228 # "win32", so don't even try.
229 # "win32", so don't even try.
229 if (term and 'xterm' in term) or not w32effects:
230 if (term and 'xterm' in term) or not w32effects:
230 realmode = 'ansi'
231 realmode = 'ansi'
231 else:
232 else:
232 realmode = 'win32'
233 realmode = 'win32'
233 else:
234 else:
234 realmode = 'ansi'
235 realmode = 'ansi'
235
236
236 def modewarn():
237 def modewarn():
237 # only warn if color.mode was explicitly set and we're in
238 # only warn if color.mode was explicitly set and we're in
238 # a formatted terminal
239 # a formatted terminal
239 if mode == realmode and ui.formatted():
240 if mode == realmode and ui.formatted():
240 ui.warn(_('warning: failed to set color mode to %s\n') % mode)
241 ui.warn(_('warning: failed to set color mode to %s\n') % mode)
241
242
242 if realmode == 'win32':
243 if realmode == 'win32':
243 ui._terminfoparams.clear()
244 ui._terminfoparams.clear()
244 if not w32effects:
245 if not w32effects:
245 modewarn()
246 modewarn()
246 return None
247 return None
247 elif realmode == 'ansi':
248 elif realmode == 'ansi':
248 ui._terminfoparams.clear()
249 ui._terminfoparams.clear()
249 elif realmode == 'terminfo':
250 elif realmode == 'terminfo':
250 _terminfosetup(ui, mode)
251 _terminfosetup(ui, mode)
251 if not ui._terminfoparams:
252 if not ui._terminfoparams:
252 ## FIXME Shouldn't we return None in this case too?
253 ## FIXME Shouldn't we return None in this case too?
253 modewarn()
254 modewarn()
254 realmode = 'ansi'
255 realmode = 'ansi'
255 else:
256 else:
256 return None
257 return None
257
258
258 if always or (auto and formatted):
259 if always or (auto and formatted):
259 return realmode
260 return realmode
260 return None
261 return None
261
262
262 def configstyles(ui):
263 def configstyles(ui):
263 ui._styles.update(_defaultstyles)
264 ui._styles.update(_defaultstyles)
264 for status, cfgeffects in ui.configitems('color'):
265 for status, cfgeffects in ui.configitems('color'):
265 if '.' not in status or status.startswith(('color.', 'terminfo.')):
266 if '.' not in status or status.startswith(('color.', 'terminfo.')):
266 continue
267 continue
267 cfgeffects = ui.configlist('color', status)
268 cfgeffects = ui.configlist('color', status)
268 if cfgeffects:
269 if cfgeffects:
269 good = []
270 good = []
270 for e in cfgeffects:
271 for e in cfgeffects:
271 if valideffect(ui, e):
272 if valideffect(ui, e):
272 good.append(e)
273 good.append(e)
273 else:
274 else:
274 ui.warn(_("ignoring unknown color/effect %r "
275 ui.warn(_("ignoring unknown color/effect %r "
275 "(configured in color.%s)\n")
276 "(configured in color.%s)\n")
276 % (e, status))
277 % (e, status))
277 ui._styles[status] = ' '.join(good)
278 ui._styles[status] = ' '.join(good)
278
279
279 def _activeeffects(ui):
280 def _activeeffects(ui):
280 '''Return the effects map for the color mode set on the ui.'''
281 '''Return the effects map for the color mode set on the ui.'''
281 if ui._colormode == 'win32':
282 if ui._colormode == 'win32':
282 return w32effects
283 return w32effects
283 elif ui._colormode is not None:
284 elif ui._colormode is not None:
284 return _effects
285 return _effects
285 return {}
286 return {}
286
287
287 def valideffect(ui, effect):
288 def valideffect(ui, effect):
288 'Determine if the effect is valid or not.'
289 'Determine if the effect is valid or not.'
289 return ((not ui._terminfoparams and effect in _activeeffects(ui))
290 return ((not ui._terminfoparams and effect in _activeeffects(ui))
290 or (effect in ui._terminfoparams
291 or (effect in ui._terminfoparams
291 or effect[:-11] in ui._terminfoparams))
292 or effect[:-11] in ui._terminfoparams))
292
293
293 def _effect_str(ui, effect):
294 def _effect_str(ui, effect):
294 '''Helper function for render_effects().'''
295 '''Helper function for render_effects().'''
295
296
296 bg = False
297 bg = False
297 if effect.endswith('_background'):
298 if effect.endswith('_background'):
298 bg = True
299 bg = True
299 effect = effect[:-11]
300 effect = effect[:-11]
300 try:
301 try:
301 attr, val, termcode = ui._terminfoparams[effect]
302 attr, val, termcode = ui._terminfoparams[effect]
302 except KeyError:
303 except KeyError:
303 return ''
304 return ''
304 if attr:
305 if attr:
305 if termcode:
306 if termcode:
306 return termcode
307 return termcode
307 else:
308 else:
308 return curses.tigetstr(val)
309 return curses.tigetstr(val)
309 elif bg:
310 elif bg:
310 return curses.tparm(curses.tigetstr('setab'), val)
311 return curses.tparm(curses.tigetstr('setab'), val)
311 else:
312 else:
312 return curses.tparm(curses.tigetstr('setaf'), val)
313 return curses.tparm(curses.tigetstr('setaf'), val)
313
314
314 def _mergeeffects(text, start, stop):
315 def _mergeeffects(text, start, stop):
315 """Insert start sequence at every occurrence of stop sequence
316 """Insert start sequence at every occurrence of stop sequence
316
317
317 >>> s = _mergeeffects('cyan', '[C]', '|')
318 >>> s = _mergeeffects('cyan', '[C]', '|')
318 >>> s = _mergeeffects(s + 'yellow', '[Y]', '|')
319 >>> s = _mergeeffects(s + 'yellow', '[Y]', '|')
319 >>> s = _mergeeffects('ma' + s + 'genta', '[M]', '|')
320 >>> s = _mergeeffects('ma' + s + 'genta', '[M]', '|')
320 >>> s = _mergeeffects('red' + s, '[R]', '|')
321 >>> s = _mergeeffects('red' + s, '[R]', '|')
321 >>> s
322 >>> s
322 '[R]red[M]ma[Y][C]cyan|[R][M][Y]yellow|[R][M]genta|'
323 '[R]red[M]ma[Y][C]cyan|[R][M][Y]yellow|[R][M]genta|'
323 """
324 """
324 parts = []
325 parts = []
325 for t in text.split(stop):
326 for t in text.split(stop):
326 if not t:
327 if not t:
327 continue
328 continue
328 parts.extend([start, t, stop])
329 parts.extend([start, t, stop])
329 return ''.join(parts)
330 return ''.join(parts)
330
331
331 def _render_effects(ui, text, effects):
332 def _render_effects(ui, text, effects):
332 'Wrap text in commands to turn on each effect.'
333 'Wrap text in commands to turn on each effect.'
333 if not text:
334 if not text:
334 return text
335 return text
335 if ui._terminfoparams:
336 if ui._terminfoparams:
336 start = ''.join(_effect_str(ui, effect)
337 start = ''.join(_effect_str(ui, effect)
337 for effect in ['none'] + effects.split())
338 for effect in ['none'] + effects.split())
338 stop = _effect_str(ui, 'none')
339 stop = _effect_str(ui, 'none')
339 else:
340 else:
340 activeeffects = _activeeffects(ui)
341 activeeffects = _activeeffects(ui)
341 start = [pycompat.bytestr(activeeffects[e])
342 start = [pycompat.bytestr(activeeffects[e])
342 for e in ['none'] + effects.split()]
343 for e in ['none'] + effects.split()]
343 start = '\033[' + ';'.join(start) + 'm'
344 start = '\033[' + ';'.join(start) + 'm'
344 stop = '\033[' + pycompat.bytestr(activeeffects['none']) + 'm'
345 stop = '\033[' + pycompat.bytestr(activeeffects['none']) + 'm'
345 return _mergeeffects(text, start, stop)
346 return _mergeeffects(text, start, stop)
346
347
347 _ansieffectre = re.compile(br'\x1b\[[0-9;]*m')
348 _ansieffectre = re.compile(br'\x1b\[[0-9;]*m')
348
349
349 def stripeffects(text):
350 def stripeffects(text):
350 """Strip ANSI control codes which could be inserted by colorlabel()"""
351 """Strip ANSI control codes which could be inserted by colorlabel()"""
351 return _ansieffectre.sub('', text)
352 return _ansieffectre.sub('', text)
352
353
353 def colorlabel(ui, msg, label):
354 def colorlabel(ui, msg, label):
354 """add color control code according to the mode"""
355 """add color control code according to the mode"""
355 if ui._colormode == 'debug':
356 if ui._colormode == 'debug':
356 if label and msg:
357 if label and msg:
357 if msg[-1] == '\n':
358 if msg[-1] == '\n':
358 msg = "[%s|%s]\n" % (label, msg[:-1])
359 msg = "[%s|%s]\n" % (label, msg[:-1])
359 else:
360 else:
360 msg = "[%s|%s]" % (label, msg)
361 msg = "[%s|%s]" % (label, msg)
361 elif ui._colormode is not None:
362 elif ui._colormode is not None:
362 effects = []
363 effects = []
363 for l in label.split():
364 for l in label.split():
364 s = ui._styles.get(l, '')
365 s = ui._styles.get(l, '')
365 if s:
366 if s:
366 effects.append(s)
367 effects.append(s)
367 elif valideffect(ui, l):
368 elif valideffect(ui, l):
368 effects.append(l)
369 effects.append(l)
369 effects = ' '.join(effects)
370 effects = ' '.join(effects)
370 if effects:
371 if effects:
371 msg = '\n'.join([_render_effects(ui, line, effects)
372 msg = '\n'.join([_render_effects(ui, line, effects)
372 for line in msg.split('\n')])
373 for line in msg.split('\n')])
373 return msg
374 return msg
374
375
375 w32effects = None
376 w32effects = None
376 if pycompat.osname == 'nt':
377 if pycompat.osname == 'nt':
377 import ctypes
378 import ctypes
378
379
379 _kernel32 = ctypes.windll.kernel32
380 _kernel32 = ctypes.windll.kernel32
380
381
381 _WORD = ctypes.c_ushort
382 _WORD = ctypes.c_ushort
382
383
383 _INVALID_HANDLE_VALUE = -1
384 _INVALID_HANDLE_VALUE = -1
384
385
385 class _COORD(ctypes.Structure):
386 class _COORD(ctypes.Structure):
386 _fields_ = [('X', ctypes.c_short),
387 _fields_ = [('X', ctypes.c_short),
387 ('Y', ctypes.c_short)]
388 ('Y', ctypes.c_short)]
388
389
389 class _SMALL_RECT(ctypes.Structure):
390 class _SMALL_RECT(ctypes.Structure):
390 _fields_ = [('Left', ctypes.c_short),
391 _fields_ = [('Left', ctypes.c_short),
391 ('Top', ctypes.c_short),
392 ('Top', ctypes.c_short),
392 ('Right', ctypes.c_short),
393 ('Right', ctypes.c_short),
393 ('Bottom', ctypes.c_short)]
394 ('Bottom', ctypes.c_short)]
394
395
395 class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
396 class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
396 _fields_ = [('dwSize', _COORD),
397 _fields_ = [('dwSize', _COORD),
397 ('dwCursorPosition', _COORD),
398 ('dwCursorPosition', _COORD),
398 ('wAttributes', _WORD),
399 ('wAttributes', _WORD),
399 ('srWindow', _SMALL_RECT),
400 ('srWindow', _SMALL_RECT),
400 ('dwMaximumWindowSize', _COORD)]
401 ('dwMaximumWindowSize', _COORD)]
401
402
402 _STD_OUTPUT_HANDLE = 0xfffffff5 # (DWORD)-11
403 _STD_OUTPUT_HANDLE = 0xfffffff5 # (DWORD)-11
403 _STD_ERROR_HANDLE = 0xfffffff4 # (DWORD)-12
404 _STD_ERROR_HANDLE = 0xfffffff4 # (DWORD)-12
404
405
405 _FOREGROUND_BLUE = 0x0001
406 _FOREGROUND_BLUE = 0x0001
406 _FOREGROUND_GREEN = 0x0002
407 _FOREGROUND_GREEN = 0x0002
407 _FOREGROUND_RED = 0x0004
408 _FOREGROUND_RED = 0x0004
408 _FOREGROUND_INTENSITY = 0x0008
409 _FOREGROUND_INTENSITY = 0x0008
409
410
410 _BACKGROUND_BLUE = 0x0010
411 _BACKGROUND_BLUE = 0x0010
411 _BACKGROUND_GREEN = 0x0020
412 _BACKGROUND_GREEN = 0x0020
412 _BACKGROUND_RED = 0x0040
413 _BACKGROUND_RED = 0x0040
413 _BACKGROUND_INTENSITY = 0x0080
414 _BACKGROUND_INTENSITY = 0x0080
414
415
415 _COMMON_LVB_REVERSE_VIDEO = 0x4000
416 _COMMON_LVB_REVERSE_VIDEO = 0x4000
416 _COMMON_LVB_UNDERSCORE = 0x8000
417 _COMMON_LVB_UNDERSCORE = 0x8000
417
418
418 # http://msdn.microsoft.com/en-us/library/ms682088%28VS.85%29.aspx
419 # http://msdn.microsoft.com/en-us/library/ms682088%28VS.85%29.aspx
419 w32effects = {
420 w32effects = {
420 'none': -1,
421 'none': -1,
421 'black': 0,
422 'black': 0,
422 'red': _FOREGROUND_RED,
423 'red': _FOREGROUND_RED,
423 'green': _FOREGROUND_GREEN,
424 'green': _FOREGROUND_GREEN,
424 'yellow': _FOREGROUND_RED | _FOREGROUND_GREEN,
425 'yellow': _FOREGROUND_RED | _FOREGROUND_GREEN,
425 'blue': _FOREGROUND_BLUE,
426 'blue': _FOREGROUND_BLUE,
426 'magenta': _FOREGROUND_BLUE | _FOREGROUND_RED,
427 'magenta': _FOREGROUND_BLUE | _FOREGROUND_RED,
427 'cyan': _FOREGROUND_BLUE | _FOREGROUND_GREEN,
428 'cyan': _FOREGROUND_BLUE | _FOREGROUND_GREEN,
428 'white': _FOREGROUND_RED | _FOREGROUND_GREEN | _FOREGROUND_BLUE,
429 'white': _FOREGROUND_RED | _FOREGROUND_GREEN | _FOREGROUND_BLUE,
429 'bold': _FOREGROUND_INTENSITY,
430 'bold': _FOREGROUND_INTENSITY,
430 'black_background': 0x100, # unused value > 0x0f
431 'black_background': 0x100, # unused value > 0x0f
431 'red_background': _BACKGROUND_RED,
432 'red_background': _BACKGROUND_RED,
432 'green_background': _BACKGROUND_GREEN,
433 'green_background': _BACKGROUND_GREEN,
433 'yellow_background': _BACKGROUND_RED | _BACKGROUND_GREEN,
434 'yellow_background': _BACKGROUND_RED | _BACKGROUND_GREEN,
434 'blue_background': _BACKGROUND_BLUE,
435 'blue_background': _BACKGROUND_BLUE,
435 'purple_background': _BACKGROUND_BLUE | _BACKGROUND_RED,
436 'purple_background': _BACKGROUND_BLUE | _BACKGROUND_RED,
436 'cyan_background': _BACKGROUND_BLUE | _BACKGROUND_GREEN,
437 'cyan_background': _BACKGROUND_BLUE | _BACKGROUND_GREEN,
437 'white_background': (_BACKGROUND_RED | _BACKGROUND_GREEN |
438 'white_background': (_BACKGROUND_RED | _BACKGROUND_GREEN |
438 _BACKGROUND_BLUE),
439 _BACKGROUND_BLUE),
439 'bold_background': _BACKGROUND_INTENSITY,
440 'bold_background': _BACKGROUND_INTENSITY,
440 'underline': _COMMON_LVB_UNDERSCORE, # double-byte charsets only
441 'underline': _COMMON_LVB_UNDERSCORE, # double-byte charsets only
441 'inverse': _COMMON_LVB_REVERSE_VIDEO, # double-byte charsets only
442 'inverse': _COMMON_LVB_REVERSE_VIDEO, # double-byte charsets only
442 }
443 }
443
444
444 passthrough = set([_FOREGROUND_INTENSITY,
445 passthrough = set([_FOREGROUND_INTENSITY,
445 _BACKGROUND_INTENSITY,
446 _BACKGROUND_INTENSITY,
446 _COMMON_LVB_UNDERSCORE,
447 _COMMON_LVB_UNDERSCORE,
447 _COMMON_LVB_REVERSE_VIDEO])
448 _COMMON_LVB_REVERSE_VIDEO])
448
449
449 stdout = _kernel32.GetStdHandle(
450 stdout = _kernel32.GetStdHandle(
450 _STD_OUTPUT_HANDLE) # don't close the handle returned
451 _STD_OUTPUT_HANDLE) # don't close the handle returned
451 if stdout is None or stdout == _INVALID_HANDLE_VALUE:
452 if stdout is None or stdout == _INVALID_HANDLE_VALUE:
452 w32effects = None
453 w32effects = None
453 else:
454 else:
454 csbi = _CONSOLE_SCREEN_BUFFER_INFO()
455 csbi = _CONSOLE_SCREEN_BUFFER_INFO()
455 if not _kernel32.GetConsoleScreenBufferInfo(
456 if not _kernel32.GetConsoleScreenBufferInfo(
456 stdout, ctypes.byref(csbi)):
457 stdout, ctypes.byref(csbi)):
457 # stdout may not support GetConsoleScreenBufferInfo()
458 # stdout may not support GetConsoleScreenBufferInfo()
458 # when called from subprocess or redirected
459 # when called from subprocess or redirected
459 w32effects = None
460 w32effects = None
460 else:
461 else:
461 origattr = csbi.wAttributes
462 origattr = csbi.wAttributes
462 ansire = re.compile('\033\[([^m]*)m([^\033]*)(.*)',
463 ansire = re.compile('\033\[([^m]*)m([^\033]*)(.*)',
463 re.MULTILINE | re.DOTALL)
464 re.MULTILINE | re.DOTALL)
464
465
465 def win32print(ui, writefunc, *msgs, **opts):
466 def win32print(ui, writefunc, *msgs, **opts):
466 for text in msgs:
467 for text in msgs:
467 _win32print(ui, text, writefunc, **opts)
468 _win32print(ui, text, writefunc, **opts)
468
469
469 def _win32print(ui, text, writefunc, **opts):
470 def _win32print(ui, text, writefunc, **opts):
470 label = opts.get('label', '')
471 label = opts.get('label', '')
471 attr = origattr
472 attr = origattr
472
473
473 def mapcolor(val, attr):
474 def mapcolor(val, attr):
474 if val == -1:
475 if val == -1:
475 return origattr
476 return origattr
476 elif val in passthrough:
477 elif val in passthrough:
477 return attr | val
478 return attr | val
478 elif val > 0x0f:
479 elif val > 0x0f:
479 return (val & 0x70) | (attr & 0x8f)
480 return (val & 0x70) | (attr & 0x8f)
480 else:
481 else:
481 return (val & 0x07) | (attr & 0xf8)
482 return (val & 0x07) | (attr & 0xf8)
482
483
483 # determine console attributes based on labels
484 # determine console attributes based on labels
484 for l in label.split():
485 for l in label.split():
485 style = ui._styles.get(l, '')
486 style = ui._styles.get(l, '')
486 for effect in style.split():
487 for effect in style.split():
487 try:
488 try:
488 attr = mapcolor(w32effects[effect], attr)
489 attr = mapcolor(w32effects[effect], attr)
489 except KeyError:
490 except KeyError:
490 # w32effects could not have certain attributes so we skip
491 # w32effects could not have certain attributes so we skip
491 # them if not found
492 # them if not found
492 pass
493 pass
493 # hack to ensure regexp finds data
494 # hack to ensure regexp finds data
494 if not text.startswith('\033['):
495 if not text.startswith('\033['):
495 text = '\033[m' + text
496 text = '\033[m' + text
496
497
497 # Look for ANSI-like codes embedded in text
498 # Look for ANSI-like codes embedded in text
498 m = re.match(ansire, text)
499 m = re.match(ansire, text)
499
500
500 try:
501 try:
501 while m:
502 while m:
502 for sattr in m.group(1).split(';'):
503 for sattr in m.group(1).split(';'):
503 if sattr:
504 if sattr:
504 attr = mapcolor(int(sattr), attr)
505 attr = mapcolor(int(sattr), attr)
505 ui.flush()
506 ui.flush()
506 _kernel32.SetConsoleTextAttribute(stdout, attr)
507 _kernel32.SetConsoleTextAttribute(stdout, attr)
507 writefunc(m.group(2), **opts)
508 writefunc(m.group(2), **opts)
508 m = re.match(ansire, m.group(3))
509 m = re.match(ansire, m.group(3))
509 finally:
510 finally:
510 # Explicitly reset original attributes
511 # Explicitly reset original attributes
511 ui.flush()
512 ui.flush()
512 _kernel32.SetConsoleTextAttribute(stdout, origattr)
513 _kernel32.SetConsoleTextAttribute(stdout, origattr)
@@ -1,2409 +1,2409 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 - ``${XDG_CONFIG_HOME:-$HOME/.config}/hg/hgrc`` (per-user)
59 - ``${XDG_CONFIG_HOME:-$HOME/.config}/hg/hgrc`` (per-user)
60 - ``<install-root>/etc/mercurial/hgrc`` (per-installation)
60 - ``<install-root>/etc/mercurial/hgrc`` (per-installation)
61 - ``<install-root>/etc/mercurial/hgrc.d/*.rc`` (per-installation)
61 - ``<install-root>/etc/mercurial/hgrc.d/*.rc`` (per-installation)
62 - ``/etc/mercurial/hgrc`` (per-system)
62 - ``/etc/mercurial/hgrc`` (per-system)
63 - ``/etc/mercurial/hgrc.d/*.rc`` (per-system)
63 - ``/etc/mercurial/hgrc.d/*.rc`` (per-system)
64 - ``<internal>/default.d/*.rc`` (defaults)
64 - ``<internal>/default.d/*.rc`` (defaults)
65
65
66 .. container:: verbose.windows
66 .. container:: verbose.windows
67
67
68 On Windows, the following files are consulted:
68 On Windows, the following files are consulted:
69
69
70 - ``<repo>/.hg/hgrc`` (per-repository)
70 - ``<repo>/.hg/hgrc`` (per-repository)
71 - ``%USERPROFILE%\.hgrc`` (per-user)
71 - ``%USERPROFILE%\.hgrc`` (per-user)
72 - ``%USERPROFILE%\Mercurial.ini`` (per-user)
72 - ``%USERPROFILE%\Mercurial.ini`` (per-user)
73 - ``%HOME%\.hgrc`` (per-user)
73 - ``%HOME%\.hgrc`` (per-user)
74 - ``%HOME%\Mercurial.ini`` (per-user)
74 - ``%HOME%\Mercurial.ini`` (per-user)
75 - ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial`` (per-installation)
75 - ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial`` (per-installation)
76 - ``<install-dir>\hgrc.d\*.rc`` (per-installation)
76 - ``<install-dir>\hgrc.d\*.rc`` (per-installation)
77 - ``<install-dir>\Mercurial.ini`` (per-installation)
77 - ``<install-dir>\Mercurial.ini`` (per-installation)
78 - ``<internal>/default.d/*.rc`` (defaults)
78 - ``<internal>/default.d/*.rc`` (defaults)
79
79
80 .. note::
80 .. note::
81
81
82 The registry key ``HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mercurial``
82 The registry key ``HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mercurial``
83 is used when running 32-bit Python on 64-bit Windows.
83 is used when running 32-bit Python on 64-bit Windows.
84
84
85 .. container:: windows
85 .. container:: windows
86
86
87 On Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``.
87 On Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``.
88
88
89 .. container:: verbose.plan9
89 .. container:: verbose.plan9
90
90
91 On Plan9, the following files are consulted:
91 On Plan9, the following files are consulted:
92
92
93 - ``<repo>/.hg/hgrc`` (per-repository)
93 - ``<repo>/.hg/hgrc`` (per-repository)
94 - ``$home/lib/hgrc`` (per-user)
94 - ``$home/lib/hgrc`` (per-user)
95 - ``<install-root>/lib/mercurial/hgrc`` (per-installation)
95 - ``<install-root>/lib/mercurial/hgrc`` (per-installation)
96 - ``<install-root>/lib/mercurial/hgrc.d/*.rc`` (per-installation)
96 - ``<install-root>/lib/mercurial/hgrc.d/*.rc`` (per-installation)
97 - ``/lib/mercurial/hgrc`` (per-system)
97 - ``/lib/mercurial/hgrc`` (per-system)
98 - ``/lib/mercurial/hgrc.d/*.rc`` (per-system)
98 - ``/lib/mercurial/hgrc.d/*.rc`` (per-system)
99 - ``<internal>/default.d/*.rc`` (defaults)
99 - ``<internal>/default.d/*.rc`` (defaults)
100
100
101 Per-repository configuration options only apply in a
101 Per-repository configuration options only apply in a
102 particular repository. This file is not version-controlled, and
102 particular repository. This file is not version-controlled, and
103 will not get transferred during a "clone" operation. Options in
103 will not get transferred during a "clone" operation. Options in
104 this file override options in all other configuration files.
104 this file override options in all other configuration files.
105
105
106 .. container:: unix.plan9
106 .. container:: unix.plan9
107
107
108 On Plan 9 and Unix, most of this file will be ignored if it doesn't
108 On Plan 9 and Unix, most of this file will be ignored if it doesn't
109 belong to a trusted user or to a trusted group. See
109 belong to a trusted user or to a trusted group. See
110 :hg:`help config.trusted` for more details.
110 :hg:`help config.trusted` for more details.
111
111
112 Per-user configuration file(s) are for the user running Mercurial. Options
112 Per-user configuration file(s) are for the user running Mercurial. Options
113 in these files apply to all Mercurial commands executed by this user in any
113 in these files apply to all Mercurial commands executed by this user in any
114 directory. Options in these files override per-system and per-installation
114 directory. Options in these files override per-system and per-installation
115 options.
115 options.
116
116
117 Per-installation configuration files are searched for in the
117 Per-installation configuration files are searched for in the
118 directory where Mercurial is installed. ``<install-root>`` is the
118 directory where Mercurial is installed. ``<install-root>`` is the
119 parent directory of the **hg** executable (or symlink) being run.
119 parent directory of the **hg** executable (or symlink) being run.
120
120
121 .. container:: unix.plan9
121 .. container:: unix.plan9
122
122
123 For example, if installed in ``/shared/tools/bin/hg``, Mercurial
123 For example, if installed in ``/shared/tools/bin/hg``, Mercurial
124 will look in ``/shared/tools/etc/mercurial/hgrc``. Options in these
124 will look in ``/shared/tools/etc/mercurial/hgrc``. Options in these
125 files apply to all Mercurial commands executed by any user in any
125 files apply to all Mercurial commands executed by any user in any
126 directory.
126 directory.
127
127
128 Per-installation configuration files are for the system on
128 Per-installation configuration files are for the system on
129 which Mercurial is running. Options in these files apply to all
129 which Mercurial is running. Options in these files apply to all
130 Mercurial commands executed by any user in any directory. Registry
130 Mercurial commands executed by any user in any directory. Registry
131 keys contain PATH-like strings, every part of which must reference
131 keys contain PATH-like strings, every part of which must reference
132 a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
132 a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
133 be read. Mercurial checks each of these locations in the specified
133 be read. Mercurial checks each of these locations in the specified
134 order until one or more configuration files are detected.
134 order until one or more configuration files are detected.
135
135
136 Per-system configuration files are for the system on which Mercurial
136 Per-system configuration files are for the system on which Mercurial
137 is running. Options in these files apply to all Mercurial commands
137 is running. Options in these files apply to all Mercurial commands
138 executed by any user in any directory. Options in these files
138 executed by any user in any directory. Options in these files
139 override per-installation options.
139 override per-installation options.
140
140
141 Mercurial comes with some default configuration. The default configuration
141 Mercurial comes with some default configuration. The default configuration
142 files are installed with Mercurial and will be overwritten on upgrades. Default
142 files are installed with Mercurial and will be overwritten on upgrades. Default
143 configuration files should never be edited by users or administrators but can
143 configuration files should never be edited by users or administrators but can
144 be overridden in other configuration files. So far the directory only contains
144 be overridden in other configuration files. So far the directory only contains
145 merge tool configuration but packagers can also put other default configuration
145 merge tool configuration but packagers can also put other default configuration
146 there.
146 there.
147
147
148 Syntax
148 Syntax
149 ======
149 ======
150
150
151 A configuration file consists of sections, led by a ``[section]`` header
151 A configuration file consists of sections, led by a ``[section]`` header
152 and followed by ``name = value`` entries (sometimes called
152 and followed by ``name = value`` entries (sometimes called
153 ``configuration keys``)::
153 ``configuration keys``)::
154
154
155 [spam]
155 [spam]
156 eggs=ham
156 eggs=ham
157 green=
157 green=
158 eggs
158 eggs
159
159
160 Each line contains one entry. If the lines that follow are indented,
160 Each line contains one entry. If the lines that follow are indented,
161 they are treated as continuations of that entry. Leading whitespace is
161 they are treated as continuations of that entry. Leading whitespace is
162 removed from values. Empty lines are skipped. Lines beginning with
162 removed from values. Empty lines are skipped. Lines beginning with
163 ``#`` or ``;`` are ignored and may be used to provide comments.
163 ``#`` or ``;`` are ignored and may be used to provide comments.
164
164
165 Configuration keys can be set multiple times, in which case Mercurial
165 Configuration keys can be set multiple times, in which case Mercurial
166 will use the value that was configured last. As an example::
166 will use the value that was configured last. As an example::
167
167
168 [spam]
168 [spam]
169 eggs=large
169 eggs=large
170 ham=serrano
170 ham=serrano
171 eggs=small
171 eggs=small
172
172
173 This would set the configuration key named ``eggs`` to ``small``.
173 This would set the configuration key named ``eggs`` to ``small``.
174
174
175 It is also possible to define a section multiple times. A section can
175 It is also possible to define a section multiple times. A section can
176 be redefined on the same and/or on different configuration files. For
176 be redefined on the same and/or on different configuration files. For
177 example::
177 example::
178
178
179 [foo]
179 [foo]
180 eggs=large
180 eggs=large
181 ham=serrano
181 ham=serrano
182 eggs=small
182 eggs=small
183
183
184 [bar]
184 [bar]
185 eggs=ham
185 eggs=ham
186 green=
186 green=
187 eggs
187 eggs
188
188
189 [foo]
189 [foo]
190 ham=prosciutto
190 ham=prosciutto
191 eggs=medium
191 eggs=medium
192 bread=toasted
192 bread=toasted
193
193
194 This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
194 This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
195 of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
195 of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
196 respectively. As you can see there only thing that matters is the last
196 respectively. As you can see there only thing that matters is the last
197 value that was set for each of the configuration keys.
197 value that was set for each of the configuration keys.
198
198
199 If a configuration key is set multiple times in different
199 If a configuration key is set multiple times in different
200 configuration files the final value will depend on the order in which
200 configuration files the final value will depend on the order in which
201 the different configuration files are read, with settings from earlier
201 the different configuration files are read, with settings from earlier
202 paths overriding later ones as described on the ``Files`` section
202 paths overriding later ones as described on the ``Files`` section
203 above.
203 above.
204
204
205 A line of the form ``%include file`` will include ``file`` into the
205 A line of the form ``%include file`` will include ``file`` into the
206 current configuration file. The inclusion is recursive, which means
206 current configuration file. The inclusion is recursive, which means
207 that included files can include other files. Filenames are relative to
207 that included files can include other files. Filenames are relative to
208 the configuration file in which the ``%include`` directive is found.
208 the configuration file in which the ``%include`` directive is found.
209 Environment variables and ``~user`` constructs are expanded in
209 Environment variables and ``~user`` constructs are expanded in
210 ``file``. This lets you do something like::
210 ``file``. This lets you do something like::
211
211
212 %include ~/.hgrc.d/$HOST.rc
212 %include ~/.hgrc.d/$HOST.rc
213
213
214 to include a different configuration file on each computer you use.
214 to include a different configuration file on each computer you use.
215
215
216 A line with ``%unset name`` will remove ``name`` from the current
216 A line with ``%unset name`` will remove ``name`` from the current
217 section, if it has been set previously.
217 section, if it has been set previously.
218
218
219 The values are either free-form text strings, lists of text strings,
219 The values are either free-form text strings, lists of text strings,
220 or Boolean values. Boolean values can be set to true using any of "1",
220 or Boolean values. Boolean values can be set to true using any of "1",
221 "yes", "true", or "on" and to false using "0", "no", "false", or "off"
221 "yes", "true", or "on" and to false using "0", "no", "false", or "off"
222 (all case insensitive).
222 (all case insensitive).
223
223
224 List values are separated by whitespace or comma, except when values are
224 List values are separated by whitespace or comma, except when values are
225 placed in double quotation marks::
225 placed in double quotation marks::
226
226
227 allow_read = "John Doe, PhD", brian, betty
227 allow_read = "John Doe, PhD", brian, betty
228
228
229 Quotation marks can be escaped by prefixing them with a backslash. Only
229 Quotation marks can be escaped by prefixing them with a backslash. Only
230 quotation marks at the beginning of a word is counted as a quotation
230 quotation marks at the beginning of a word is counted as a quotation
231 (e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
231 (e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
232
232
233 Sections
233 Sections
234 ========
234 ========
235
235
236 This section describes the different sections that may appear in a
236 This section describes the different sections that may appear in a
237 Mercurial configuration file, the purpose of each section, its possible
237 Mercurial configuration file, the purpose of each section, its possible
238 keys, and their possible values.
238 keys, and their possible values.
239
239
240 ``alias``
240 ``alias``
241 ---------
241 ---------
242
242
243 Defines command aliases.
243 Defines command aliases.
244
244
245 Aliases allow you to define your own commands in terms of other
245 Aliases allow you to define your own commands in terms of other
246 commands (or aliases), optionally including arguments. Positional
246 commands (or aliases), optionally including arguments. Positional
247 arguments in the form of ``$1``, ``$2``, etc. in the alias definition
247 arguments in the form of ``$1``, ``$2``, etc. in the alias definition
248 are expanded by Mercurial before execution. Positional arguments not
248 are expanded by Mercurial before execution. Positional arguments not
249 already used by ``$N`` in the definition are put at the end of the
249 already used by ``$N`` in the definition are put at the end of the
250 command to be executed.
250 command to be executed.
251
251
252 Alias definitions consist of lines of the form::
252 Alias definitions consist of lines of the form::
253
253
254 <alias> = <command> [<argument>]...
254 <alias> = <command> [<argument>]...
255
255
256 For example, this definition::
256 For example, this definition::
257
257
258 latest = log --limit 5
258 latest = log --limit 5
259
259
260 creates a new command ``latest`` that shows only the five most recent
260 creates a new command ``latest`` that shows only the five most recent
261 changesets. You can define subsequent aliases using earlier ones::
261 changesets. You can define subsequent aliases using earlier ones::
262
262
263 stable5 = latest -b stable
263 stable5 = latest -b stable
264
264
265 .. note::
265 .. note::
266
266
267 It is possible to create aliases with the same names as
267 It is possible to create aliases with the same names as
268 existing commands, which will then override the original
268 existing commands, which will then override the original
269 definitions. This is almost always a bad idea!
269 definitions. This is almost always a bad idea!
270
270
271 An alias can start with an exclamation point (``!``) to make it a
271 An alias can start with an exclamation point (``!``) to make it a
272 shell alias. A shell alias is executed with the shell and will let you
272 shell alias. A shell alias is executed with the shell and will let you
273 run arbitrary commands. As an example, ::
273 run arbitrary commands. As an example, ::
274
274
275 echo = !echo $@
275 echo = !echo $@
276
276
277 will let you do ``hg echo foo`` to have ``foo`` printed in your
277 will let you do ``hg echo foo`` to have ``foo`` printed in your
278 terminal. A better example might be::
278 terminal. A better example might be::
279
279
280 purge = !$HG status --no-status --unknown -0 re: | xargs -0 rm -f
280 purge = !$HG status --no-status --unknown -0 re: | xargs -0 rm -f
281
281
282 which will make ``hg purge`` delete all unknown files in the
282 which will make ``hg purge`` delete all unknown files in the
283 repository in the same manner as the purge extension.
283 repository in the same manner as the purge extension.
284
284
285 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
285 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
286 expand to the command arguments. Unmatched arguments are
286 expand to the command arguments. Unmatched arguments are
287 removed. ``$0`` expands to the alias name and ``$@`` expands to all
287 removed. ``$0`` expands to the alias name and ``$@`` expands to all
288 arguments separated by a space. ``"$@"`` (with quotes) expands to all
288 arguments separated by a space. ``"$@"`` (with quotes) expands to all
289 arguments quoted individually and separated by a space. These expansions
289 arguments quoted individually and separated by a space. These expansions
290 happen before the command is passed to the shell.
290 happen before the command is passed to the shell.
291
291
292 Shell aliases are executed in an environment where ``$HG`` expands to
292 Shell aliases are executed in an environment where ``$HG`` expands to
293 the path of the Mercurial that was used to execute the alias. This is
293 the path of the Mercurial that was used to execute the alias. This is
294 useful when you want to call further Mercurial commands in a shell
294 useful when you want to call further Mercurial commands in a shell
295 alias, as was done above for the purge alias. In addition,
295 alias, as was done above for the purge alias. In addition,
296 ``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
296 ``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
297 echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
297 echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
298
298
299 .. note::
299 .. note::
300
300
301 Some global configuration options such as ``-R`` are
301 Some global configuration options such as ``-R`` are
302 processed before shell aliases and will thus not be passed to
302 processed before shell aliases and will thus not be passed to
303 aliases.
303 aliases.
304
304
305
305
306 ``annotate``
306 ``annotate``
307 ------------
307 ------------
308
308
309 Settings used when displaying file annotations. All values are
309 Settings used when displaying file annotations. All values are
310 Booleans and default to False. See :hg:`help config.diff` for
310 Booleans and default to False. See :hg:`help config.diff` for
311 related options for the diff command.
311 related options for the diff command.
312
312
313 ``ignorews``
313 ``ignorews``
314 Ignore white space when comparing lines.
314 Ignore white space when comparing lines.
315
315
316 ``ignorewsamount``
316 ``ignorewsamount``
317 Ignore changes in the amount of white space.
317 Ignore changes in the amount of white space.
318
318
319 ``ignoreblanklines``
319 ``ignoreblanklines``
320 Ignore changes whose lines are all blank.
320 Ignore changes whose lines are all blank.
321
321
322
322
323 ``auth``
323 ``auth``
324 --------
324 --------
325
325
326 Authentication credentials and other authentication-like configuration
326 Authentication credentials and other authentication-like configuration
327 for HTTP connections. This section allows you to store usernames and
327 for HTTP connections. This section allows you to store usernames and
328 passwords for use when logging *into* HTTP servers. See
328 passwords for use when logging *into* HTTP servers. See
329 :hg:`help config.web` if you want to configure *who* can login to
329 :hg:`help config.web` if you want to configure *who* can login to
330 your HTTP server.
330 your HTTP server.
331
331
332 The following options apply to all hosts.
332 The following options apply to all hosts.
333
333
334 ``cookiefile``
334 ``cookiefile``
335 Path to a file containing HTTP cookie lines. Cookies matching a
335 Path to a file containing HTTP cookie lines. Cookies matching a
336 host will be sent automatically.
336 host will be sent automatically.
337
337
338 The file format uses the Mozilla cookies.txt format, which defines cookies
338 The file format uses the Mozilla cookies.txt format, which defines cookies
339 on their own lines. Each line contains 7 fields delimited by the tab
339 on their own lines. Each line contains 7 fields delimited by the tab
340 character (domain, is_domain_cookie, path, is_secure, expires, name,
340 character (domain, is_domain_cookie, path, is_secure, expires, name,
341 value). For more info, do an Internet search for "Netscape cookies.txt
341 value). For more info, do an Internet search for "Netscape cookies.txt
342 format."
342 format."
343
343
344 Note: the cookies parser does not handle port numbers on domains. You
344 Note: the cookies parser does not handle port numbers on domains. You
345 will need to remove ports from the domain for the cookie to be recognized.
345 will need to remove ports from the domain for the cookie to be recognized.
346 This could result in a cookie being disclosed to an unwanted server.
346 This could result in a cookie being disclosed to an unwanted server.
347
347
348 The cookies file is read-only.
348 The cookies file is read-only.
349
349
350 Other options in this section are grouped by name and have the following
350 Other options in this section are grouped by name and have the following
351 format::
351 format::
352
352
353 <name>.<argument> = <value>
353 <name>.<argument> = <value>
354
354
355 where ``<name>`` is used to group arguments into authentication
355 where ``<name>`` is used to group arguments into authentication
356 entries. Example::
356 entries. Example::
357
357
358 foo.prefix = hg.intevation.de/mercurial
358 foo.prefix = hg.intevation.de/mercurial
359 foo.username = foo
359 foo.username = foo
360 foo.password = bar
360 foo.password = bar
361 foo.schemes = http https
361 foo.schemes = http https
362
362
363 bar.prefix = secure.example.org
363 bar.prefix = secure.example.org
364 bar.key = path/to/file.key
364 bar.key = path/to/file.key
365 bar.cert = path/to/file.cert
365 bar.cert = path/to/file.cert
366 bar.schemes = https
366 bar.schemes = https
367
367
368 Supported arguments:
368 Supported arguments:
369
369
370 ``prefix``
370 ``prefix``
371 Either ``*`` or a URI prefix with or without the scheme part.
371 Either ``*`` or a URI prefix with or without the scheme part.
372 The authentication entry with the longest matching prefix is used
372 The authentication entry with the longest matching prefix is used
373 (where ``*`` matches everything and counts as a match of length
373 (where ``*`` matches everything and counts as a match of length
374 1). If the prefix doesn't include a scheme, the match is performed
374 1). If the prefix doesn't include a scheme, the match is performed
375 against the URI with its scheme stripped as well, and the schemes
375 against the URI with its scheme stripped as well, and the schemes
376 argument, q.v., is then subsequently consulted.
376 argument, q.v., is then subsequently consulted.
377
377
378 ``username``
378 ``username``
379 Optional. Username to authenticate with. If not given, and the
379 Optional. Username to authenticate with. If not given, and the
380 remote site requires basic or digest authentication, the user will
380 remote site requires basic or digest authentication, the user will
381 be prompted for it. Environment variables are expanded in the
381 be prompted for it. Environment variables are expanded in the
382 username letting you do ``foo.username = $USER``. If the URI
382 username letting you do ``foo.username = $USER``. If the URI
383 includes a username, only ``[auth]`` entries with a matching
383 includes a username, only ``[auth]`` entries with a matching
384 username or without a username will be considered.
384 username or without a username will be considered.
385
385
386 ``password``
386 ``password``
387 Optional. Password to authenticate with. If not given, and the
387 Optional. Password to authenticate with. If not given, and the
388 remote site requires basic or digest authentication, the user
388 remote site requires basic or digest authentication, the user
389 will be prompted for it.
389 will be prompted for it.
390
390
391 ``key``
391 ``key``
392 Optional. PEM encoded client certificate key file. Environment
392 Optional. PEM encoded client certificate key file. Environment
393 variables are expanded in the filename.
393 variables are expanded in the filename.
394
394
395 ``cert``
395 ``cert``
396 Optional. PEM encoded client certificate chain file. Environment
396 Optional. PEM encoded client certificate chain file. Environment
397 variables are expanded in the filename.
397 variables are expanded in the filename.
398
398
399 ``schemes``
399 ``schemes``
400 Optional. Space separated list of URI schemes to use this
400 Optional. Space separated list of URI schemes to use this
401 authentication entry with. Only used if the prefix doesn't include
401 authentication entry with. Only used if the prefix doesn't include
402 a scheme. Supported schemes are http and https. They will match
402 a scheme. Supported schemes are http and https. They will match
403 static-http and static-https respectively, as well.
403 static-http and static-https respectively, as well.
404 (default: https)
404 (default: https)
405
405
406 If no suitable authentication entry is found, the user is prompted
406 If no suitable authentication entry is found, the user is prompted
407 for credentials as usual if required by the remote.
407 for credentials as usual if required by the remote.
408
408
409 ``color``
409 ``color``
410 ---------
410 ---------
411
411
412 Configure the Mercurial color mode. For details about how to define your custom
412 Configure the Mercurial color mode. For details about how to define your custom
413 effect and style see :hg:`help color`.
413 effect and style see :hg:`help color`.
414
414
415 ``mode``
415 ``mode``
416 String: control the method used to output color. One of ``auto``, ``ansi``,
416 String: control the method used to output color. One of ``auto``, ``ansi``,
417 ``win32``, ``terminfo`` or ``debug``. In auto mode, Mercurial will
417 ``win32``, ``terminfo`` or ``debug``. In auto mode, Mercurial will
418 use ANSI mode by default (or win32 mode on Windows) if it detects a
418 use ANSI mode by default (or win32 mode on Windows) if it detects a
419 terminal. Any invalid value will disable color.
419 terminal. Any invalid value will disable color.
420
420
421 ``pagermode``
421 ``pagermode``
422 String: optinal override of ``color.mode`` used with pager.
422 String: optinal override of ``color.mode`` used with pager.
423
423
424 On some systems, terminfo mode may cause problems when using
424 On some systems, terminfo mode may cause problems when using
425 color with ``less -R`` as a pager program. less with the -R option
425 color with ``less -R`` as a pager program. less with the -R option
426 will only display ECMA-48 color codes, and terminfo mode may sometimes
426 will only display ECMA-48 color codes, and terminfo mode may sometimes
427 emit codes that less doesn't understand. You can work around this by
427 emit codes that less doesn't understand. You can work around this by
428 either using ansi mode (or auto mode), or by using less -r (which will
428 either using ansi mode (or auto mode), or by using less -r (which will
429 pass through all terminal control codes, not just color control
429 pass through all terminal control codes, not just color control
430 codes).
430 codes).
431
431
432 On some systems (such as MSYS in Windows), the terminal may support
432 On some systems (such as MSYS in Windows), the terminal may support
433 a different color mode than the pager program.
433 a different color mode than the pager program.
434
434
435 ``commands``
435 ``commands``
436 ------------
436 ------------
437
437
438 ``status.relative``
438 ``status.relative``
439 Make paths in :hg:`status` output relative to the current directory.
439 Make paths in :hg:`status` output relative to the current directory.
440 (default: False)
440 (default: False)
441
441
442 ``update.requiredest``
442 ``update.requiredest``
443 Require that the user pass a destination when running :hg:`update`.
443 Require that the user pass a destination when running :hg:`update`.
444 For example, :hg:`update .::` will be allowed, but a plain :hg:`update`
444 For example, :hg:`update .::` will be allowed, but a plain :hg:`update`
445 will be disallowed.
445 will be disallowed.
446 (default: False)
446 (default: False)
447
447
448 ``committemplate``
448 ``committemplate``
449 ------------------
449 ------------------
450
450
451 ``changeset``
451 ``changeset``
452 String: configuration in this section is used as the template to
452 String: configuration in this section is used as the template to
453 customize the text shown in the editor when committing.
453 customize the text shown in the editor when committing.
454
454
455 In addition to pre-defined template keywords, commit log specific one
455 In addition to pre-defined template keywords, commit log specific one
456 below can be used for customization:
456 below can be used for customization:
457
457
458 ``extramsg``
458 ``extramsg``
459 String: Extra message (typically 'Leave message empty to abort
459 String: Extra message (typically 'Leave message empty to abort
460 commit.'). This may be changed by some commands or extensions.
460 commit.'). This may be changed by some commands or extensions.
461
461
462 For example, the template configuration below shows as same text as
462 For example, the template configuration below shows as same text as
463 one shown by default::
463 one shown by default::
464
464
465 [committemplate]
465 [committemplate]
466 changeset = {desc}\n\n
466 changeset = {desc}\n\n
467 HG: Enter commit message. Lines beginning with 'HG:' are removed.
467 HG: Enter commit message. Lines beginning with 'HG:' are removed.
468 HG: {extramsg}
468 HG: {extramsg}
469 HG: --
469 HG: --
470 HG: user: {author}\n{ifeq(p2rev, "-1", "",
470 HG: user: {author}\n{ifeq(p2rev, "-1", "",
471 "HG: branch merge\n")
471 "HG: branch merge\n")
472 }HG: branch '{branch}'\n{if(activebookmark,
472 }HG: branch '{branch}'\n{if(activebookmark,
473 "HG: bookmark '{activebookmark}'\n") }{subrepos %
473 "HG: bookmark '{activebookmark}'\n") }{subrepos %
474 "HG: subrepo {subrepo}\n" }{file_adds %
474 "HG: subrepo {subrepo}\n" }{file_adds %
475 "HG: added {file}\n" }{file_mods %
475 "HG: added {file}\n" }{file_mods %
476 "HG: changed {file}\n" }{file_dels %
476 "HG: changed {file}\n" }{file_dels %
477 "HG: removed {file}\n" }{if(files, "",
477 "HG: removed {file}\n" }{if(files, "",
478 "HG: no files changed\n")}
478 "HG: no files changed\n")}
479
479
480 ``diff()``
480 ``diff()``
481 String: show the diff (see :hg:`help templates` for detail)
481 String: show the diff (see :hg:`help templates` for detail)
482
482
483 Sometimes it is helpful to show the diff of the changeset in the editor without
483 Sometimes it is helpful to show the diff of the changeset in the editor without
484 having to prefix 'HG: ' to each line so that highlighting works correctly. For
484 having to prefix 'HG: ' to each line so that highlighting works correctly. For
485 this, Mercurial provides a special string which will ignore everything below
485 this, Mercurial provides a special string which will ignore everything below
486 it::
486 it::
487
487
488 HG: ------------------------ >8 ------------------------
488 HG: ------------------------ >8 ------------------------
489
489
490 For example, the template configuration below will show the diff below the
490 For example, the template configuration below will show the diff below the
491 extra message::
491 extra message::
492
492
493 [committemplate]
493 [committemplate]
494 changeset = {desc}\n\n
494 changeset = {desc}\n\n
495 HG: Enter commit message. Lines beginning with 'HG:' are removed.
495 HG: Enter commit message. Lines beginning with 'HG:' are removed.
496 HG: {extramsg}
496 HG: {extramsg}
497 HG: ------------------------ >8 ------------------------
497 HG: ------------------------ >8 ------------------------
498 HG: Do not touch the line above.
498 HG: Do not touch the line above.
499 HG: Everything below will be removed.
499 HG: Everything below will be removed.
500 {diff()}
500 {diff()}
501
501
502 .. note::
502 .. note::
503
503
504 For some problematic encodings (see :hg:`help win32mbcs` for
504 For some problematic encodings (see :hg:`help win32mbcs` for
505 detail), this customization should be configured carefully, to
505 detail), this customization should be configured carefully, to
506 avoid showing broken characters.
506 avoid showing broken characters.
507
507
508 For example, if a multibyte character ending with backslash (0x5c) is
508 For example, if a multibyte character ending with backslash (0x5c) is
509 followed by the ASCII character 'n' in the customized template,
509 followed by the ASCII character 'n' in the customized template,
510 the sequence of backslash and 'n' is treated as line-feed unexpectedly
510 the sequence of backslash and 'n' is treated as line-feed unexpectedly
511 (and the multibyte character is broken, too).
511 (and the multibyte character is broken, too).
512
512
513 Customized template is used for commands below (``--edit`` may be
513 Customized template is used for commands below (``--edit`` may be
514 required):
514 required):
515
515
516 - :hg:`backout`
516 - :hg:`backout`
517 - :hg:`commit`
517 - :hg:`commit`
518 - :hg:`fetch` (for merge commit only)
518 - :hg:`fetch` (for merge commit only)
519 - :hg:`graft`
519 - :hg:`graft`
520 - :hg:`histedit`
520 - :hg:`histedit`
521 - :hg:`import`
521 - :hg:`import`
522 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
522 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
523 - :hg:`rebase`
523 - :hg:`rebase`
524 - :hg:`shelve`
524 - :hg:`shelve`
525 - :hg:`sign`
525 - :hg:`sign`
526 - :hg:`tag`
526 - :hg:`tag`
527 - :hg:`transplant`
527 - :hg:`transplant`
528
528
529 Configuring items below instead of ``changeset`` allows showing
529 Configuring items below instead of ``changeset`` allows showing
530 customized message only for specific actions, or showing different
530 customized message only for specific actions, or showing different
531 messages for each action.
531 messages for each action.
532
532
533 - ``changeset.backout`` for :hg:`backout`
533 - ``changeset.backout`` for :hg:`backout`
534 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
534 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
535 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
535 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
536 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
536 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
537 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
537 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
538 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
538 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
539 - ``changeset.gpg.sign`` for :hg:`sign`
539 - ``changeset.gpg.sign`` for :hg:`sign`
540 - ``changeset.graft`` for :hg:`graft`
540 - ``changeset.graft`` for :hg:`graft`
541 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
541 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
542 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
542 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
543 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
543 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
544 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
544 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
545 - ``changeset.import.bypass`` for :hg:`import --bypass`
545 - ``changeset.import.bypass`` for :hg:`import --bypass`
546 - ``changeset.import.normal.merge`` for :hg:`import` on merges
546 - ``changeset.import.normal.merge`` for :hg:`import` on merges
547 - ``changeset.import.normal.normal`` for :hg:`import` on other
547 - ``changeset.import.normal.normal`` for :hg:`import` on other
548 - ``changeset.mq.qnew`` for :hg:`qnew`
548 - ``changeset.mq.qnew`` for :hg:`qnew`
549 - ``changeset.mq.qfold`` for :hg:`qfold`
549 - ``changeset.mq.qfold`` for :hg:`qfold`
550 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
550 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
551 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
551 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
552 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
552 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
553 - ``changeset.rebase.normal`` for :hg:`rebase` on other
553 - ``changeset.rebase.normal`` for :hg:`rebase` on other
554 - ``changeset.shelve.shelve`` for :hg:`shelve`
554 - ``changeset.shelve.shelve`` for :hg:`shelve`
555 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
555 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
556 - ``changeset.tag.remove`` for :hg:`tag --remove`
556 - ``changeset.tag.remove`` for :hg:`tag --remove`
557 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
557 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
558 - ``changeset.transplant.normal`` for :hg:`transplant` on other
558 - ``changeset.transplant.normal`` for :hg:`transplant` on other
559
559
560 These dot-separated lists of names are treated as hierarchical ones.
560 These dot-separated lists of names are treated as hierarchical ones.
561 For example, ``changeset.tag.remove`` customizes the commit message
561 For example, ``changeset.tag.remove`` customizes the commit message
562 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
562 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
563 commit message for :hg:`tag` regardless of ``--remove`` option.
563 commit message for :hg:`tag` regardless of ``--remove`` option.
564
564
565 When the external editor is invoked for a commit, the corresponding
565 When the external editor is invoked for a commit, the corresponding
566 dot-separated list of names without the ``changeset.`` prefix
566 dot-separated list of names without the ``changeset.`` prefix
567 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
567 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
568 variable.
568 variable.
569
569
570 In this section, items other than ``changeset`` can be referred from
570 In this section, items other than ``changeset`` can be referred from
571 others. For example, the configuration to list committed files up
571 others. For example, the configuration to list committed files up
572 below can be referred as ``{listupfiles}``::
572 below can be referred as ``{listupfiles}``::
573
573
574 [committemplate]
574 [committemplate]
575 listupfiles = {file_adds %
575 listupfiles = {file_adds %
576 "HG: added {file}\n" }{file_mods %
576 "HG: added {file}\n" }{file_mods %
577 "HG: changed {file}\n" }{file_dels %
577 "HG: changed {file}\n" }{file_dels %
578 "HG: removed {file}\n" }{if(files, "",
578 "HG: removed {file}\n" }{if(files, "",
579 "HG: no files changed\n")}
579 "HG: no files changed\n")}
580
580
581 ``decode/encode``
581 ``decode/encode``
582 -----------------
582 -----------------
583
583
584 Filters for transforming files on checkout/checkin. This would
584 Filters for transforming files on checkout/checkin. This would
585 typically be used for newline processing or other
585 typically be used for newline processing or other
586 localization/canonicalization of files.
586 localization/canonicalization of files.
587
587
588 Filters consist of a filter pattern followed by a filter command.
588 Filters consist of a filter pattern followed by a filter command.
589 Filter patterns are globs by default, rooted at the repository root.
589 Filter patterns are globs by default, rooted at the repository root.
590 For example, to match any file ending in ``.txt`` in the root
590 For example, to match any file ending in ``.txt`` in the root
591 directory only, use the pattern ``*.txt``. To match any file ending
591 directory only, use the pattern ``*.txt``. To match any file ending
592 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
592 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
593 For each file only the first matching filter applies.
593 For each file only the first matching filter applies.
594
594
595 The filter command can start with a specifier, either ``pipe:`` or
595 The filter command can start with a specifier, either ``pipe:`` or
596 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
596 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
597
597
598 A ``pipe:`` command must accept data on stdin and return the transformed
598 A ``pipe:`` command must accept data on stdin and return the transformed
599 data on stdout.
599 data on stdout.
600
600
601 Pipe example::
601 Pipe example::
602
602
603 [encode]
603 [encode]
604 # uncompress gzip files on checkin to improve delta compression
604 # uncompress gzip files on checkin to improve delta compression
605 # note: not necessarily a good idea, just an example
605 # note: not necessarily a good idea, just an example
606 *.gz = pipe: gunzip
606 *.gz = pipe: gunzip
607
607
608 [decode]
608 [decode]
609 # recompress gzip files when writing them to the working dir (we
609 # recompress gzip files when writing them to the working dir (we
610 # can safely omit "pipe:", because it's the default)
610 # can safely omit "pipe:", because it's the default)
611 *.gz = gzip
611 *.gz = gzip
612
612
613 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
613 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
614 with the name of a temporary file that contains the data to be
614 with the name of a temporary file that contains the data to be
615 filtered by the command. The string ``OUTFILE`` is replaced with the name
615 filtered by the command. The string ``OUTFILE`` is replaced with the name
616 of an empty temporary file, where the filtered data must be written by
616 of an empty temporary file, where the filtered data must be written by
617 the command.
617 the command.
618
618
619 .. container:: windows
619 .. container:: windows
620
620
621 .. note::
621 .. note::
622
622
623 The tempfile mechanism is recommended for Windows systems,
623 The tempfile mechanism is recommended for Windows systems,
624 where the standard shell I/O redirection operators often have
624 where the standard shell I/O redirection operators often have
625 strange effects and may corrupt the contents of your files.
625 strange effects and may corrupt the contents of your files.
626
626
627 This filter mechanism is used internally by the ``eol`` extension to
627 This filter mechanism is used internally by the ``eol`` extension to
628 translate line ending characters between Windows (CRLF) and Unix (LF)
628 translate line ending characters between Windows (CRLF) and Unix (LF)
629 format. We suggest you use the ``eol`` extension for convenience.
629 format. We suggest you use the ``eol`` extension for convenience.
630
630
631
631
632 ``defaults``
632 ``defaults``
633 ------------
633 ------------
634
634
635 (defaults are deprecated. Don't use them. Use aliases instead.)
635 (defaults are deprecated. Don't use them. Use aliases instead.)
636
636
637 Use the ``[defaults]`` section to define command defaults, i.e. the
637 Use the ``[defaults]`` section to define command defaults, i.e. the
638 default options/arguments to pass to the specified commands.
638 default options/arguments to pass to the specified commands.
639
639
640 The following example makes :hg:`log` run in verbose mode, and
640 The following example makes :hg:`log` run in verbose mode, and
641 :hg:`status` show only the modified files, by default::
641 :hg:`status` show only the modified files, by default::
642
642
643 [defaults]
643 [defaults]
644 log = -v
644 log = -v
645 status = -m
645 status = -m
646
646
647 The actual commands, instead of their aliases, must be used when
647 The actual commands, instead of their aliases, must be used when
648 defining command defaults. The command defaults will also be applied
648 defining command defaults. The command defaults will also be applied
649 to the aliases of the commands defined.
649 to the aliases of the commands defined.
650
650
651
651
652 ``diff``
652 ``diff``
653 --------
653 --------
654
654
655 Settings used when displaying diffs. Everything except for ``unified``
655 Settings used when displaying diffs. Everything except for ``unified``
656 is a Boolean and defaults to False. See :hg:`help config.annotate`
656 is a Boolean and defaults to False. See :hg:`help config.annotate`
657 for related options for the annotate command.
657 for related options for the annotate command.
658
658
659 ``git``
659 ``git``
660 Use git extended diff format.
660 Use git extended diff format.
661
661
662 ``nobinary``
662 ``nobinary``
663 Omit git binary patches.
663 Omit git binary patches.
664
664
665 ``nodates``
665 ``nodates``
666 Don't include dates in diff headers.
666 Don't include dates in diff headers.
667
667
668 ``noprefix``
668 ``noprefix``
669 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
669 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
670
670
671 ``showfunc``
671 ``showfunc``
672 Show which function each change is in.
672 Show which function each change is in.
673
673
674 ``ignorews``
674 ``ignorews``
675 Ignore white space when comparing lines.
675 Ignore white space when comparing lines.
676
676
677 ``ignorewsamount``
677 ``ignorewsamount``
678 Ignore changes in the amount of white space.
678 Ignore changes in the amount of white space.
679
679
680 ``ignoreblanklines``
680 ``ignoreblanklines``
681 Ignore changes whose lines are all blank.
681 Ignore changes whose lines are all blank.
682
682
683 ``unified``
683 ``unified``
684 Number of lines of context to show.
684 Number of lines of context to show.
685
685
686 ``email``
686 ``email``
687 ---------
687 ---------
688
688
689 Settings for extensions that send email messages.
689 Settings for extensions that send email messages.
690
690
691 ``from``
691 ``from``
692 Optional. Email address to use in "From" header and SMTP envelope
692 Optional. Email address to use in "From" header and SMTP envelope
693 of outgoing messages.
693 of outgoing messages.
694
694
695 ``to``
695 ``to``
696 Optional. Comma-separated list of recipients' email addresses.
696 Optional. Comma-separated list of recipients' email addresses.
697
697
698 ``cc``
698 ``cc``
699 Optional. Comma-separated list of carbon copy recipients'
699 Optional. Comma-separated list of carbon copy recipients'
700 email addresses.
700 email addresses.
701
701
702 ``bcc``
702 ``bcc``
703 Optional. Comma-separated list of blind carbon copy recipients'
703 Optional. Comma-separated list of blind carbon copy recipients'
704 email addresses.
704 email addresses.
705
705
706 ``method``
706 ``method``
707 Optional. Method to use to send email messages. If value is ``smtp``
707 Optional. Method to use to send email messages. If value is ``smtp``
708 (default), use SMTP (see the ``[smtp]`` section for configuration).
708 (default), use SMTP (see the ``[smtp]`` section for configuration).
709 Otherwise, use as name of program to run that acts like sendmail
709 Otherwise, use as name of program to run that acts like sendmail
710 (takes ``-f`` option for sender, list of recipients on command line,
710 (takes ``-f`` option for sender, list of recipients on command line,
711 message on stdin). Normally, setting this to ``sendmail`` or
711 message on stdin). Normally, setting this to ``sendmail`` or
712 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
712 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
713
713
714 ``charsets``
714 ``charsets``
715 Optional. Comma-separated list of character sets considered
715 Optional. Comma-separated list of character sets considered
716 convenient for recipients. Addresses, headers, and parts not
716 convenient for recipients. Addresses, headers, and parts not
717 containing patches of outgoing messages will be encoded in the
717 containing patches of outgoing messages will be encoded in the
718 first character set to which conversion from local encoding
718 first character set to which conversion from local encoding
719 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
719 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
720 conversion fails, the text in question is sent as is.
720 conversion fails, the text in question is sent as is.
721 (default: '')
721 (default: '')
722
722
723 Order of outgoing email character sets:
723 Order of outgoing email character sets:
724
724
725 1. ``us-ascii``: always first, regardless of settings
725 1. ``us-ascii``: always first, regardless of settings
726 2. ``email.charsets``: in order given by user
726 2. ``email.charsets``: in order given by user
727 3. ``ui.fallbackencoding``: if not in email.charsets
727 3. ``ui.fallbackencoding``: if not in email.charsets
728 4. ``$HGENCODING``: if not in email.charsets
728 4. ``$HGENCODING``: if not in email.charsets
729 5. ``utf-8``: always last, regardless of settings
729 5. ``utf-8``: always last, regardless of settings
730
730
731 Email example::
731 Email example::
732
732
733 [email]
733 [email]
734 from = Joseph User <joe.user@example.com>
734 from = Joseph User <joe.user@example.com>
735 method = /usr/sbin/sendmail
735 method = /usr/sbin/sendmail
736 # charsets for western Europeans
736 # charsets for western Europeans
737 # us-ascii, utf-8 omitted, as they are tried first and last
737 # us-ascii, utf-8 omitted, as they are tried first and last
738 charsets = iso-8859-1, iso-8859-15, windows-1252
738 charsets = iso-8859-1, iso-8859-15, windows-1252
739
739
740
740
741 ``extensions``
741 ``extensions``
742 --------------
742 --------------
743
743
744 Mercurial has an extension mechanism for adding new features. To
744 Mercurial has an extension mechanism for adding new features. To
745 enable an extension, create an entry for it in this section.
745 enable an extension, create an entry for it in this section.
746
746
747 If you know that the extension is already in Python's search path,
747 If you know that the extension is already in Python's search path,
748 you can give the name of the module, followed by ``=``, with nothing
748 you can give the name of the module, followed by ``=``, with nothing
749 after the ``=``.
749 after the ``=``.
750
750
751 Otherwise, give a name that you choose, followed by ``=``, followed by
751 Otherwise, give a name that you choose, followed by ``=``, followed by
752 the path to the ``.py`` file (including the file name extension) that
752 the path to the ``.py`` file (including the file name extension) that
753 defines the extension.
753 defines the extension.
754
754
755 To explicitly disable an extension that is enabled in an hgrc of
755 To explicitly disable an extension that is enabled in an hgrc of
756 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
756 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
757 or ``foo = !`` when path is not supplied.
757 or ``foo = !`` when path is not supplied.
758
758
759 Example for ``~/.hgrc``::
759 Example for ``~/.hgrc``::
760
760
761 [extensions]
761 [extensions]
762 # (the churn extension will get loaded from Mercurial's path)
762 # (the churn extension will get loaded from Mercurial's path)
763 churn =
763 churn =
764 # (this extension will get loaded from the file specified)
764 # (this extension will get loaded from the file specified)
765 myfeature = ~/.hgext/myfeature.py
765 myfeature = ~/.hgext/myfeature.py
766
766
767
767
768 ``format``
768 ``format``
769 ----------
769 ----------
770
770
771 ``usegeneraldelta``
771 ``usegeneraldelta``
772 Enable or disable the "generaldelta" repository format which improves
772 Enable or disable the "generaldelta" repository format which improves
773 repository compression by allowing "revlog" to store delta against arbitrary
773 repository compression by allowing "revlog" to store delta against arbitrary
774 revision instead of the previous stored one. This provides significant
774 revision instead of the previous stored one. This provides significant
775 improvement for repositories with branches.
775 improvement for repositories with branches.
776
776
777 Repositories with this on-disk format require Mercurial version 1.9.
777 Repositories with this on-disk format require Mercurial version 1.9.
778
778
779 Enabled by default.
779 Enabled by default.
780
780
781 ``dotencode``
781 ``dotencode``
782 Enable or disable the "dotencode" repository format which enhances
782 Enable or disable the "dotencode" repository format which enhances
783 the "fncache" repository format (which has to be enabled to use
783 the "fncache" repository format (which has to be enabled to use
784 dotencode) to avoid issues with filenames starting with ._ on
784 dotencode) to avoid issues with filenames starting with ._ on
785 Mac OS X and spaces on Windows.
785 Mac OS X and spaces on Windows.
786
786
787 Repositories with this on-disk format require Mercurial version 1.7.
787 Repositories with this on-disk format require Mercurial version 1.7.
788
788
789 Enabled by default.
789 Enabled by default.
790
790
791 ``usefncache``
791 ``usefncache``
792 Enable or disable the "fncache" repository format which enhances
792 Enable or disable the "fncache" repository format which enhances
793 the "store" repository format (which has to be enabled to use
793 the "store" repository format (which has to be enabled to use
794 fncache) to allow longer filenames and avoids using Windows
794 fncache) to allow longer filenames and avoids using Windows
795 reserved names, e.g. "nul".
795 reserved names, e.g. "nul".
796
796
797 Repositories with this on-disk format require Mercurial version 1.1.
797 Repositories with this on-disk format require Mercurial version 1.1.
798
798
799 Enabled by default.
799 Enabled by default.
800
800
801 ``usestore``
801 ``usestore``
802 Enable or disable the "store" repository format which improves
802 Enable or disable the "store" repository format which improves
803 compatibility with systems that fold case or otherwise mangle
803 compatibility with systems that fold case or otherwise mangle
804 filenames. Disabling this option will allow you to store longer filenames
804 filenames. Disabling this option will allow you to store longer filenames
805 in some situations at the expense of compatibility.
805 in some situations at the expense of compatibility.
806
806
807 Repositories with this on-disk format require Mercurial version 0.9.4.
807 Repositories with this on-disk format require Mercurial version 0.9.4.
808
808
809 Enabled by default.
809 Enabled by default.
810
810
811 ``graph``
811 ``graph``
812 ---------
812 ---------
813
813
814 Web graph view configuration. This section let you change graph
814 Web graph view configuration. This section let you change graph
815 elements display properties by branches, for instance to make the
815 elements display properties by branches, for instance to make the
816 ``default`` branch stand out.
816 ``default`` branch stand out.
817
817
818 Each line has the following format::
818 Each line has the following format::
819
819
820 <branch>.<argument> = <value>
820 <branch>.<argument> = <value>
821
821
822 where ``<branch>`` is the name of the branch being
822 where ``<branch>`` is the name of the branch being
823 customized. Example::
823 customized. Example::
824
824
825 [graph]
825 [graph]
826 # 2px width
826 # 2px width
827 default.width = 2
827 default.width = 2
828 # red color
828 # red color
829 default.color = FF0000
829 default.color = FF0000
830
830
831 Supported arguments:
831 Supported arguments:
832
832
833 ``width``
833 ``width``
834 Set branch edges width in pixels.
834 Set branch edges width in pixels.
835
835
836 ``color``
836 ``color``
837 Set branch edges color in hexadecimal RGB notation.
837 Set branch edges color in hexadecimal RGB notation.
838
838
839 ``hooks``
839 ``hooks``
840 ---------
840 ---------
841
841
842 Commands or Python functions that get automatically executed by
842 Commands or Python functions that get automatically executed by
843 various actions such as starting or finishing a commit. Multiple
843 various actions such as starting or finishing a commit. Multiple
844 hooks can be run for the same action by appending a suffix to the
844 hooks can be run for the same action by appending a suffix to the
845 action. Overriding a site-wide hook can be done by changing its
845 action. Overriding a site-wide hook can be done by changing its
846 value or setting it to an empty string. Hooks can be prioritized
846 value or setting it to an empty string. Hooks can be prioritized
847 by adding a prefix of ``priority.`` to the hook name on a new line
847 by adding a prefix of ``priority.`` to the hook name on a new line
848 and setting the priority. The default priority is 0.
848 and setting the priority. The default priority is 0.
849
849
850 Example ``.hg/hgrc``::
850 Example ``.hg/hgrc``::
851
851
852 [hooks]
852 [hooks]
853 # update working directory after adding changesets
853 # update working directory after adding changesets
854 changegroup.update = hg update
854 changegroup.update = hg update
855 # do not use the site-wide hook
855 # do not use the site-wide hook
856 incoming =
856 incoming =
857 incoming.email = /my/email/hook
857 incoming.email = /my/email/hook
858 incoming.autobuild = /my/build/hook
858 incoming.autobuild = /my/build/hook
859 # force autobuild hook to run before other incoming hooks
859 # force autobuild hook to run before other incoming hooks
860 priority.incoming.autobuild = 1
860 priority.incoming.autobuild = 1
861
861
862 Most hooks are run with environment variables set that give useful
862 Most hooks are run with environment variables set that give useful
863 additional information. For each hook below, the environment variables
863 additional information. For each hook below, the environment variables
864 it is passed are listed with names of the form ``$HG_foo``. The
864 it is passed are listed with names of the form ``$HG_foo``. The
865 ``$HG_HOOKTYPE`` and ``$HG_HOOKNAME`` variables are set for all hooks.
865 ``$HG_HOOKTYPE`` and ``$HG_HOOKNAME`` variables are set for all hooks.
866 their respectively contains the type of hook which triggered the run and
866 their respectively contains the type of hook which triggered the run and
867 the full name of the hooks in the config. In the example about this will
867 the full name of the hooks in the config. In the example about this will
868 be ``$HG_HOOKTYPE=incoming`` and ``$HG_HOOKNAME=incoming.email``.
868 be ``$HG_HOOKTYPE=incoming`` and ``$HG_HOOKNAME=incoming.email``.
869
869
870 ``changegroup``
870 ``changegroup``
871 Run after a changegroup has been added via push, pull or unbundle. ID of the
871 Run after a changegroup has been added via push, pull or unbundle. ID of the
872 first new changeset is in ``$HG_NODE`` and last in ``$HG_NODE_LAST``. URL
872 first new changeset is in ``$HG_NODE`` and last in ``$HG_NODE_LAST``. URL
873 from which changes came is in ``$HG_URL``.
873 from which changes came is in ``$HG_URL``.
874
874
875 ``commit``
875 ``commit``
876 Run after a changeset has been created in the local repository. ID
876 Run after a changeset has been created in the local repository. ID
877 of the newly created changeset is in ``$HG_NODE``. Parent changeset
877 of the newly created changeset is in ``$HG_NODE``. Parent changeset
878 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
878 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
879
879
880 ``incoming``
880 ``incoming``
881 Run after a changeset has been pulled, pushed, or unbundled into
881 Run after a changeset has been pulled, pushed, or unbundled into
882 the local repository. The ID of the newly arrived changeset is in
882 the local repository. The ID of the newly arrived changeset is in
883 ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``.
883 ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``.
884
884
885 ``outgoing``
885 ``outgoing``
886 Run after sending changes from local repository to another. ID of
886 Run after sending changes from local repository to another. ID of
887 first changeset sent is in ``$HG_NODE``. Source of operation is in
887 first changeset sent is in ``$HG_NODE``. Source of operation is in
888 ``$HG_SOURCE``; Also see :hg:`help config.hooks.preoutgoing` hook.
888 ``$HG_SOURCE``; Also see :hg:`help config.hooks.preoutgoing` hook.
889
889
890 ``post-<command>``
890 ``post-<command>``
891 Run after successful invocations of the associated command. The
891 Run after successful invocations of the associated command. The
892 contents of the command line are passed as ``$HG_ARGS`` and the result
892 contents of the command line are passed as ``$HG_ARGS`` and the result
893 code in ``$HG_RESULT``. Parsed command line arguments are passed as
893 code in ``$HG_RESULT``. Parsed command line arguments are passed as
894 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
894 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
895 the python data internally passed to <command>. ``$HG_OPTS`` is a
895 the python data internally passed to <command>. ``$HG_OPTS`` is a
896 dictionary of options (with unspecified options set to their defaults).
896 dictionary of options (with unspecified options set to their defaults).
897 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
897 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
898
898
899 ``fail-<command>``
899 ``fail-<command>``
900 Run after a failed invocation of an associated command. The contents
900 Run after a failed invocation of an associated command. The contents
901 of the command line are passed as ``$HG_ARGS``. Parsed command line
901 of the command line are passed as ``$HG_ARGS``. Parsed command line
902 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
902 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
903 string representations of the python data internally passed to
903 string representations of the python data internally passed to
904 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
904 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
905 options set to their defaults). ``$HG_PATS`` is a list of arguments.
905 options set to their defaults). ``$HG_PATS`` is a list of arguments.
906 Hook failure is ignored.
906 Hook failure is ignored.
907
907
908 ``pre-<command>``
908 ``pre-<command>``
909 Run before executing the associated command. The contents of the
909 Run before executing the associated command. The contents of the
910 command line are passed as ``$HG_ARGS``. Parsed command line arguments
910 command line are passed as ``$HG_ARGS``. Parsed command line arguments
911 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
911 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
912 representations of the data internally passed to <command>. ``$HG_OPTS``
912 representations of the data internally passed to <command>. ``$HG_OPTS``
913 is a dictionary of options (with unspecified options set to their
913 is a dictionary of options (with unspecified options set to their
914 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
914 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
915 failure, the command doesn't execute and Mercurial returns the failure
915 failure, the command doesn't execute and Mercurial returns the failure
916 code.
916 code.
917
917
918 ``prechangegroup``
918 ``prechangegroup``
919 Run before a changegroup is added via push, pull or unbundle. Exit
919 Run before a changegroup is added via push, pull or unbundle. Exit
920 status 0 allows the changegroup to proceed. Non-zero status will
920 status 0 allows the changegroup to proceed. Non-zero status will
921 cause the push, pull or unbundle to fail. URL from which changes
921 cause the push, pull or unbundle to fail. URL from which changes
922 will come is in ``$HG_URL``.
922 will come is in ``$HG_URL``.
923
923
924 ``precommit``
924 ``precommit``
925 Run before starting a local commit. Exit status 0 allows the
925 Run before starting a local commit. Exit status 0 allows the
926 commit to proceed. Non-zero status will cause the commit to fail.
926 commit to proceed. Non-zero status will cause the commit to fail.
927 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
927 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
928
928
929 ``prelistkeys``
929 ``prelistkeys``
930 Run before listing pushkeys (like bookmarks) in the
930 Run before listing pushkeys (like bookmarks) in the
931 repository. Non-zero status will cause failure. The key namespace is
931 repository. Non-zero status will cause failure. The key namespace is
932 in ``$HG_NAMESPACE``.
932 in ``$HG_NAMESPACE``.
933
933
934 ``preoutgoing``
934 ``preoutgoing``
935 Run before collecting changes to send from the local repository to
935 Run before collecting changes to send from the local repository to
936 another. Non-zero status will cause failure. This lets you prevent
936 another. Non-zero status will cause failure. This lets you prevent
937 pull over HTTP or SSH. Also prevents against local pull, push
937 pull over HTTP or SSH. Also prevents against local pull, push
938 (outbound) or bundle commands, but not effective, since you can
938 (outbound) or bundle commands, but not effective, since you can
939 just copy files instead then. Source of operation is in
939 just copy files instead then. Source of operation is in
940 ``$HG_SOURCE``. If "serve", operation is happening on behalf of remote
940 ``$HG_SOURCE``. If "serve", operation is happening on behalf of remote
941 SSH or HTTP repository. If "push", "pull" or "bundle", operation
941 SSH or HTTP repository. If "push", "pull" or "bundle", operation
942 is happening on behalf of repository on same system.
942 is happening on behalf of repository on same system.
943
943
944 ``prepushkey``
944 ``prepushkey``
945 Run before a pushkey (like a bookmark) is added to the
945 Run before a pushkey (like a bookmark) is added to the
946 repository. Non-zero status will cause the key to be rejected. The
946 repository. Non-zero status will cause the key to be rejected. The
947 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
947 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
948 the old value (if any) is in ``$HG_OLD``, and the new value is in
948 the old value (if any) is in ``$HG_OLD``, and the new value is in
949 ``$HG_NEW``.
949 ``$HG_NEW``.
950
950
951 ``pretag``
951 ``pretag``
952 Run before creating a tag. Exit status 0 allows the tag to be
952 Run before creating a tag. Exit status 0 allows the tag to be
953 created. Non-zero status will cause the tag to fail. ID of
953 created. Non-zero status will cause the tag to fail. ID of
954 changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is
954 changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is
955 local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``.
955 local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``.
956
956
957 ``pretxnopen``
957 ``pretxnopen``
958 Run before any new repository transaction is open. The reason for the
958 Run before any new repository transaction is open. The reason for the
959 transaction will be in ``$HG_TXNNAME`` and a unique identifier for the
959 transaction will be in ``$HG_TXNNAME`` and a unique identifier for the
960 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
960 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
961 transaction from being opened.
961 transaction from being opened.
962
962
963 ``pretxnclose``
963 ``pretxnclose``
964 Run right before the transaction is actually finalized. Any repository change
964 Run right before the transaction is actually finalized. Any repository change
965 will be visible to the hook program. This lets you validate the transaction
965 will be visible to the hook program. This lets you validate the transaction
966 content or change it. Exit status 0 allows the commit to proceed. Non-zero
966 content or change it. Exit status 0 allows the commit to proceed. Non-zero
967 status will cause the transaction to be rolled back. The reason for the
967 status will cause the transaction to be rolled back. The reason for the
968 transaction opening will be in ``$HG_TXNNAME`` and a unique identifier for
968 transaction opening will be in ``$HG_TXNNAME`` and a unique identifier for
969 the transaction will be in ``HG_TXNID``. The rest of the available data will
969 the transaction will be in ``HG_TXNID``. The rest of the available data will
970 vary according the transaction type. New changesets will add ``$HG_NODE`` (id
970 vary according the transaction type. New changesets will add ``$HG_NODE`` (id
971 of the first added changeset), ``$HG_NODE_LAST`` (id of the last added
971 of the first added changeset), ``$HG_NODE_LAST`` (id of the last added
972 changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables, bookmarks and phases
972 changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables, bookmarks and phases
973 changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``, etc.
973 changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``, etc.
974
974
975 ``txnclose``
975 ``txnclose``
976 Run after any repository transaction has been committed. At this
976 Run after any repository transaction has been committed. At this
977 point, the transaction can no longer be rolled back. The hook will run
977 point, the transaction can no longer be rolled back. The hook will run
978 after the lock is released. See :hg:`help config.hooks.pretxnclose` docs for
978 after the lock is released. See :hg:`help config.hooks.pretxnclose` docs for
979 details about available variables.
979 details about available variables.
980
980
981 ``txnabort``
981 ``txnabort``
982 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
982 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
983 docs for details about available variables.
983 docs for details about available variables.
984
984
985 ``pretxnchangegroup``
985 ``pretxnchangegroup``
986 Run after a changegroup has been added via push, pull or unbundle, but before
986 Run after a changegroup has been added via push, pull or unbundle, but before
987 the transaction has been committed. Changegroup is visible to hook program.
987 the transaction has been committed. Changegroup is visible to hook program.
988 This lets you validate incoming changes before accepting them. Passed the ID
988 This lets you validate incoming changes before accepting them. Passed the ID
989 of the first new changeset in ``$HG_NODE`` and last in ``$HG_NODE_LAST``.
989 of the first new changeset in ``$HG_NODE`` and last in ``$HG_NODE_LAST``.
990 Exit status 0 allows the transaction to commit. Non-zero status will cause
990 Exit status 0 allows the transaction to commit. Non-zero status will cause
991 the transaction to be rolled back and the push, pull or unbundle will fail.
991 the transaction to be rolled back and the push, pull or unbundle will fail.
992 URL that was source of changes is in ``$HG_URL``.
992 URL that was source of changes is in ``$HG_URL``.
993
993
994 ``pretxncommit``
994 ``pretxncommit``
995 Run after a changeset has been created but the transaction not yet
995 Run after a changeset has been created but the transaction not yet
996 committed. Changeset is visible to hook program. This lets you
996 committed. Changeset is visible to hook program. This lets you
997 validate commit message and changes. Exit status 0 allows the
997 validate commit message and changes. Exit status 0 allows the
998 commit to proceed. Non-zero status will cause the transaction to
998 commit to proceed. Non-zero status will cause the transaction to
999 be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset
999 be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset
1000 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1000 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1001
1001
1002 ``preupdate``
1002 ``preupdate``
1003 Run before updating the working directory. Exit status 0 allows
1003 Run before updating the working directory. Exit status 0 allows
1004 the update to proceed. Non-zero status will prevent the update.
1004 the update to proceed. Non-zero status will prevent the update.
1005 Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID
1005 Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID
1006 of second new parent is in ``$HG_PARENT2``.
1006 of second new parent is in ``$HG_PARENT2``.
1007
1007
1008 ``listkeys``
1008 ``listkeys``
1009 Run after listing pushkeys (like bookmarks) in the repository. The
1009 Run after listing pushkeys (like bookmarks) in the repository. The
1010 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
1010 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
1011 dictionary containing the keys and values.
1011 dictionary containing the keys and values.
1012
1012
1013 ``pushkey``
1013 ``pushkey``
1014 Run after a pushkey (like a bookmark) is added to the
1014 Run after a pushkey (like a bookmark) is added to the
1015 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
1015 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
1016 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
1016 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
1017 value is in ``$HG_NEW``.
1017 value is in ``$HG_NEW``.
1018
1018
1019 ``tag``
1019 ``tag``
1020 Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.
1020 Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.
1021 Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in
1021 Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in
1022 repository if ``$HG_LOCAL=0``.
1022 repository if ``$HG_LOCAL=0``.
1023
1023
1024 ``update``
1024 ``update``
1025 Run after updating the working directory. Changeset ID of first
1025 Run after updating the working directory. Changeset ID of first
1026 new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is
1026 new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is
1027 in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
1027 in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
1028 update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``.
1028 update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``.
1029
1029
1030 .. note::
1030 .. note::
1031
1031
1032 It is generally better to use standard hooks rather than the
1032 It is generally better to use standard hooks rather than the
1033 generic pre- and post- command hooks as they are guaranteed to be
1033 generic pre- and post- command hooks as they are guaranteed to be
1034 called in the appropriate contexts for influencing transactions.
1034 called in the appropriate contexts for influencing transactions.
1035 Also, hooks like "commit" will be called in all contexts that
1035 Also, hooks like "commit" will be called in all contexts that
1036 generate a commit (e.g. tag) and not just the commit command.
1036 generate a commit (e.g. tag) and not just the commit command.
1037
1037
1038 .. note::
1038 .. note::
1039
1039
1040 Environment variables with empty values may not be passed to
1040 Environment variables with empty values may not be passed to
1041 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
1041 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
1042 will have an empty value under Unix-like platforms for non-merge
1042 will have an empty value under Unix-like platforms for non-merge
1043 changesets, while it will not be available at all under Windows.
1043 changesets, while it will not be available at all under Windows.
1044
1044
1045 The syntax for Python hooks is as follows::
1045 The syntax for Python hooks is as follows::
1046
1046
1047 hookname = python:modulename.submodule.callable
1047 hookname = python:modulename.submodule.callable
1048 hookname = python:/path/to/python/module.py:callable
1048 hookname = python:/path/to/python/module.py:callable
1049
1049
1050 Python hooks are run within the Mercurial process. Each hook is
1050 Python hooks are run within the Mercurial process. Each hook is
1051 called with at least three keyword arguments: a ui object (keyword
1051 called with at least three keyword arguments: a ui object (keyword
1052 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
1052 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
1053 keyword that tells what kind of hook is used. Arguments listed as
1053 keyword that tells what kind of hook is used. Arguments listed as
1054 environment variables above are passed as keyword arguments, with no
1054 environment variables above are passed as keyword arguments, with no
1055 ``HG_`` prefix, and names in lower case.
1055 ``HG_`` prefix, and names in lower case.
1056
1056
1057 If a Python hook returns a "true" value or raises an exception, this
1057 If a Python hook returns a "true" value or raises an exception, this
1058 is treated as a failure.
1058 is treated as a failure.
1059
1059
1060
1060
1061 ``hostfingerprints``
1061 ``hostfingerprints``
1062 --------------------
1062 --------------------
1063
1063
1064 (Deprecated. Use ``[hostsecurity]``'s ``fingerprints`` options instead.)
1064 (Deprecated. Use ``[hostsecurity]``'s ``fingerprints`` options instead.)
1065
1065
1066 Fingerprints of the certificates of known HTTPS servers.
1066 Fingerprints of the certificates of known HTTPS servers.
1067
1067
1068 A HTTPS connection to a server with a fingerprint configured here will
1068 A HTTPS connection to a server with a fingerprint configured here will
1069 only succeed if the servers certificate matches the fingerprint.
1069 only succeed if the servers certificate matches the fingerprint.
1070 This is very similar to how ssh known hosts works.
1070 This is very similar to how ssh known hosts works.
1071
1071
1072 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
1072 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
1073 Multiple values can be specified (separated by spaces or commas). This can
1073 Multiple values can be specified (separated by spaces or commas). This can
1074 be used to define both old and new fingerprints while a host transitions
1074 be used to define both old and new fingerprints while a host transitions
1075 to a new certificate.
1075 to a new certificate.
1076
1076
1077 The CA chain and web.cacerts is not used for servers with a fingerprint.
1077 The CA chain and web.cacerts is not used for servers with a fingerprint.
1078
1078
1079 For example::
1079 For example::
1080
1080
1081 [hostfingerprints]
1081 [hostfingerprints]
1082 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1082 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1083 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1083 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1084
1084
1085 ``hostsecurity``
1085 ``hostsecurity``
1086 ----------------
1086 ----------------
1087
1087
1088 Used to specify global and per-host security settings for connecting to
1088 Used to specify global and per-host security settings for connecting to
1089 other machines.
1089 other machines.
1090
1090
1091 The following options control default behavior for all hosts.
1091 The following options control default behavior for all hosts.
1092
1092
1093 ``ciphers``
1093 ``ciphers``
1094 Defines the cryptographic ciphers to use for connections.
1094 Defines the cryptographic ciphers to use for connections.
1095
1095
1096 Value must be a valid OpenSSL Cipher List Format as documented at
1096 Value must be a valid OpenSSL Cipher List Format as documented at
1097 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-LIST-FORMAT.
1097 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-LIST-FORMAT.
1098
1098
1099 This setting is for advanced users only. Setting to incorrect values
1099 This setting is for advanced users only. Setting to incorrect values
1100 can significantly lower connection security or decrease performance.
1100 can significantly lower connection security or decrease performance.
1101 You have been warned.
1101 You have been warned.
1102
1102
1103 This option requires Python 2.7.
1103 This option requires Python 2.7.
1104
1104
1105 ``minimumprotocol``
1105 ``minimumprotocol``
1106 Defines the minimum channel encryption protocol to use.
1106 Defines the minimum channel encryption protocol to use.
1107
1107
1108 By default, the highest version of TLS supported by both client and server
1108 By default, the highest version of TLS supported by both client and server
1109 is used.
1109 is used.
1110
1110
1111 Allowed values are: ``tls1.0``, ``tls1.1``, ``tls1.2``.
1111 Allowed values are: ``tls1.0``, ``tls1.1``, ``tls1.2``.
1112
1112
1113 When running on an old Python version, only ``tls1.0`` is allowed since
1113 When running on an old Python version, only ``tls1.0`` is allowed since
1114 old versions of Python only support up to TLS 1.0.
1114 old versions of Python only support up to TLS 1.0.
1115
1115
1116 When running a Python that supports modern TLS versions, the default is
1116 When running a Python that supports modern TLS versions, the default is
1117 ``tls1.1``. ``tls1.0`` can still be used to allow TLS 1.0. However, this
1117 ``tls1.1``. ``tls1.0`` can still be used to allow TLS 1.0. However, this
1118 weakens security and should only be used as a feature of last resort if
1118 weakens security and should only be used as a feature of last resort if
1119 a server does not support TLS 1.1+.
1119 a server does not support TLS 1.1+.
1120
1120
1121 Options in the ``[hostsecurity]`` section can have the form
1121 Options in the ``[hostsecurity]`` section can have the form
1122 ``hostname``:``setting``. This allows multiple settings to be defined on a
1122 ``hostname``:``setting``. This allows multiple settings to be defined on a
1123 per-host basis.
1123 per-host basis.
1124
1124
1125 The following per-host settings can be defined.
1125 The following per-host settings can be defined.
1126
1126
1127 ``ciphers``
1127 ``ciphers``
1128 This behaves like ``ciphers`` as described above except it only applies
1128 This behaves like ``ciphers`` as described above except it only applies
1129 to the host on which it is defined.
1129 to the host on which it is defined.
1130
1130
1131 ``fingerprints``
1131 ``fingerprints``
1132 A list of hashes of the DER encoded peer/remote certificate. Values have
1132 A list of hashes of the DER encoded peer/remote certificate. Values have
1133 the form ``algorithm``:``fingerprint``. e.g.
1133 the form ``algorithm``:``fingerprint``. e.g.
1134 ``sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2``.
1134 ``sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2``.
1135
1135
1136 The following algorithms/prefixes are supported: ``sha1``, ``sha256``,
1136 The following algorithms/prefixes are supported: ``sha1``, ``sha256``,
1137 ``sha512``.
1137 ``sha512``.
1138
1138
1139 Use of ``sha256`` or ``sha512`` is preferred.
1139 Use of ``sha256`` or ``sha512`` is preferred.
1140
1140
1141 If a fingerprint is specified, the CA chain is not validated for this
1141 If a fingerprint is specified, the CA chain is not validated for this
1142 host and Mercurial will require the remote certificate to match one
1142 host and Mercurial will require the remote certificate to match one
1143 of the fingerprints specified. This means if the server updates its
1143 of the fingerprints specified. This means if the server updates its
1144 certificate, Mercurial will abort until a new fingerprint is defined.
1144 certificate, Mercurial will abort until a new fingerprint is defined.
1145 This can provide stronger security than traditional CA-based validation
1145 This can provide stronger security than traditional CA-based validation
1146 at the expense of convenience.
1146 at the expense of convenience.
1147
1147
1148 This option takes precedence over ``verifycertsfile``.
1148 This option takes precedence over ``verifycertsfile``.
1149
1149
1150 ``minimumprotocol``
1150 ``minimumprotocol``
1151 This behaves like ``minimumprotocol`` as described above except it
1151 This behaves like ``minimumprotocol`` as described above except it
1152 only applies to the host on which it is defined.
1152 only applies to the host on which it is defined.
1153
1153
1154 ``verifycertsfile``
1154 ``verifycertsfile``
1155 Path to file a containing a list of PEM encoded certificates used to
1155 Path to file a containing a list of PEM encoded certificates used to
1156 verify the server certificate. Environment variables and ``~user``
1156 verify the server certificate. Environment variables and ``~user``
1157 constructs are expanded in the filename.
1157 constructs are expanded in the filename.
1158
1158
1159 The server certificate or the certificate's certificate authority (CA)
1159 The server certificate or the certificate's certificate authority (CA)
1160 must match a certificate from this file or certificate verification
1160 must match a certificate from this file or certificate verification
1161 will fail and connections to the server will be refused.
1161 will fail and connections to the server will be refused.
1162
1162
1163 If defined, only certificates provided by this file will be used:
1163 If defined, only certificates provided by this file will be used:
1164 ``web.cacerts`` and any system/default certificates will not be
1164 ``web.cacerts`` and any system/default certificates will not be
1165 used.
1165 used.
1166
1166
1167 This option has no effect if the per-host ``fingerprints`` option
1167 This option has no effect if the per-host ``fingerprints`` option
1168 is set.
1168 is set.
1169
1169
1170 The format of the file is as follows::
1170 The format of the file is as follows::
1171
1171
1172 -----BEGIN CERTIFICATE-----
1172 -----BEGIN CERTIFICATE-----
1173 ... (certificate in base64 PEM encoding) ...
1173 ... (certificate in base64 PEM encoding) ...
1174 -----END CERTIFICATE-----
1174 -----END CERTIFICATE-----
1175 -----BEGIN CERTIFICATE-----
1175 -----BEGIN CERTIFICATE-----
1176 ... (certificate in base64 PEM encoding) ...
1176 ... (certificate in base64 PEM encoding) ...
1177 -----END CERTIFICATE-----
1177 -----END CERTIFICATE-----
1178
1178
1179 For example::
1179 For example::
1180
1180
1181 [hostsecurity]
1181 [hostsecurity]
1182 hg.example.com:fingerprints = sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
1182 hg.example.com:fingerprints = sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
1183 hg2.example.com:fingerprints = sha1:914f1aff87249c09b6859b88b1906d30756491ca, sha1:fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1183 hg2.example.com:fingerprints = sha1:914f1aff87249c09b6859b88b1906d30756491ca, sha1:fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1184 foo.example.com:verifycertsfile = /etc/ssl/trusted-ca-certs.pem
1184 foo.example.com:verifycertsfile = /etc/ssl/trusted-ca-certs.pem
1185
1185
1186 To change the default minimum protocol version to TLS 1.2 but to allow TLS 1.1
1186 To change the default minimum protocol version to TLS 1.2 but to allow TLS 1.1
1187 when connecting to ``hg.example.com``::
1187 when connecting to ``hg.example.com``::
1188
1188
1189 [hostsecurity]
1189 [hostsecurity]
1190 minimumprotocol = tls1.2
1190 minimumprotocol = tls1.2
1191 hg.example.com:minimumprotocol = tls1.1
1191 hg.example.com:minimumprotocol = tls1.1
1192
1192
1193 ``http_proxy``
1193 ``http_proxy``
1194 --------------
1194 --------------
1195
1195
1196 Used to access web-based Mercurial repositories through a HTTP
1196 Used to access web-based Mercurial repositories through a HTTP
1197 proxy.
1197 proxy.
1198
1198
1199 ``host``
1199 ``host``
1200 Host name and (optional) port of the proxy server, for example
1200 Host name and (optional) port of the proxy server, for example
1201 "myproxy:8000".
1201 "myproxy:8000".
1202
1202
1203 ``no``
1203 ``no``
1204 Optional. Comma-separated list of host names that should bypass
1204 Optional. Comma-separated list of host names that should bypass
1205 the proxy.
1205 the proxy.
1206
1206
1207 ``passwd``
1207 ``passwd``
1208 Optional. Password to authenticate with at the proxy server.
1208 Optional. Password to authenticate with at the proxy server.
1209
1209
1210 ``user``
1210 ``user``
1211 Optional. User name to authenticate with at the proxy server.
1211 Optional. User name to authenticate with at the proxy server.
1212
1212
1213 ``always``
1213 ``always``
1214 Optional. Always use the proxy, even for localhost and any entries
1214 Optional. Always use the proxy, even for localhost and any entries
1215 in ``http_proxy.no``. (default: False)
1215 in ``http_proxy.no``. (default: False)
1216
1216
1217 ``merge``
1217 ``merge``
1218 ---------
1218 ---------
1219
1219
1220 This section specifies behavior during merges and updates.
1220 This section specifies behavior during merges and updates.
1221
1221
1222 ``checkignored``
1222 ``checkignored``
1223 Controls behavior when an ignored file on disk has the same name as a tracked
1223 Controls behavior when an ignored file on disk has the same name as a tracked
1224 file in the changeset being merged or updated to, and has different
1224 file in the changeset being merged or updated to, and has different
1225 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1225 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1226 abort on such files. With ``warn``, warn on such files and back them up as
1226 abort on such files. With ``warn``, warn on such files and back them up as
1227 ``.orig``. With ``ignore``, don't print a warning and back them up as
1227 ``.orig``. With ``ignore``, don't print a warning and back them up as
1228 ``.orig``. (default: ``abort``)
1228 ``.orig``. (default: ``abort``)
1229
1229
1230 ``checkunknown``
1230 ``checkunknown``
1231 Controls behavior when an unknown file that isn't ignored has the same name
1231 Controls behavior when an unknown file that isn't ignored has the same name
1232 as a tracked file in the changeset being merged or updated to, and has
1232 as a tracked file in the changeset being merged or updated to, and has
1233 different contents. Similar to ``merge.checkignored``, except for files that
1233 different contents. Similar to ``merge.checkignored``, except for files that
1234 are not ignored. (default: ``abort``)
1234 are not ignored. (default: ``abort``)
1235
1235
1236 ``merge-patterns``
1236 ``merge-patterns``
1237 ------------------
1237 ------------------
1238
1238
1239 This section specifies merge tools to associate with particular file
1239 This section specifies merge tools to associate with particular file
1240 patterns. Tools matched here will take precedence over the default
1240 patterns. Tools matched here will take precedence over the default
1241 merge tool. Patterns are globs by default, rooted at the repository
1241 merge tool. Patterns are globs by default, rooted at the repository
1242 root.
1242 root.
1243
1243
1244 Example::
1244 Example::
1245
1245
1246 [merge-patterns]
1246 [merge-patterns]
1247 **.c = kdiff3
1247 **.c = kdiff3
1248 **.jpg = myimgmerge
1248 **.jpg = myimgmerge
1249
1249
1250 ``merge-tools``
1250 ``merge-tools``
1251 ---------------
1251 ---------------
1252
1252
1253 This section configures external merge tools to use for file-level
1253 This section configures external merge tools to use for file-level
1254 merges. This section has likely been preconfigured at install time.
1254 merges. This section has likely been preconfigured at install time.
1255 Use :hg:`config merge-tools` to check the existing configuration.
1255 Use :hg:`config merge-tools` to check the existing configuration.
1256 Also see :hg:`help merge-tools` for more details.
1256 Also see :hg:`help merge-tools` for more details.
1257
1257
1258 Example ``~/.hgrc``::
1258 Example ``~/.hgrc``::
1259
1259
1260 [merge-tools]
1260 [merge-tools]
1261 # Override stock tool location
1261 # Override stock tool location
1262 kdiff3.executable = ~/bin/kdiff3
1262 kdiff3.executable = ~/bin/kdiff3
1263 # Specify command line
1263 # Specify command line
1264 kdiff3.args = $base $local $other -o $output
1264 kdiff3.args = $base $local $other -o $output
1265 # Give higher priority
1265 # Give higher priority
1266 kdiff3.priority = 1
1266 kdiff3.priority = 1
1267
1267
1268 # Changing the priority of preconfigured tool
1268 # Changing the priority of preconfigured tool
1269 meld.priority = 0
1269 meld.priority = 0
1270
1270
1271 # Disable a preconfigured tool
1271 # Disable a preconfigured tool
1272 vimdiff.disabled = yes
1272 vimdiff.disabled = yes
1273
1273
1274 # Define new tool
1274 # Define new tool
1275 myHtmlTool.args = -m $local $other $base $output
1275 myHtmlTool.args = -m $local $other $base $output
1276 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1276 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1277 myHtmlTool.priority = 1
1277 myHtmlTool.priority = 1
1278
1278
1279 Supported arguments:
1279 Supported arguments:
1280
1280
1281 ``priority``
1281 ``priority``
1282 The priority in which to evaluate this tool.
1282 The priority in which to evaluate this tool.
1283 (default: 0)
1283 (default: 0)
1284
1284
1285 ``executable``
1285 ``executable``
1286 Either just the name of the executable or its pathname.
1286 Either just the name of the executable or its pathname.
1287
1287
1288 .. container:: windows
1288 .. container:: windows
1289
1289
1290 On Windows, the path can use environment variables with ${ProgramFiles}
1290 On Windows, the path can use environment variables with ${ProgramFiles}
1291 syntax.
1291 syntax.
1292
1292
1293 (default: the tool name)
1293 (default: the tool name)
1294
1294
1295 ``args``
1295 ``args``
1296 The arguments to pass to the tool executable. You can refer to the
1296 The arguments to pass to the tool executable. You can refer to the
1297 files being merged as well as the output file through these
1297 files being merged as well as the output file through these
1298 variables: ``$base``, ``$local``, ``$other``, ``$output``. The meaning
1298 variables: ``$base``, ``$local``, ``$other``, ``$output``. The meaning
1299 of ``$local`` and ``$other`` can vary depending on which action is being
1299 of ``$local`` and ``$other`` can vary depending on which action is being
1300 performed. During and update or merge, ``$local`` represents the original
1300 performed. During and update or merge, ``$local`` represents the original
1301 state of the file, while ``$other`` represents the commit you are updating
1301 state of the file, while ``$other`` represents the commit you are updating
1302 to or the commit you are merging with. During a rebase ``$local``
1302 to or the commit you are merging with. During a rebase ``$local``
1303 represents the destination of the rebase, and ``$other`` represents the
1303 represents the destination of the rebase, and ``$other`` represents the
1304 commit being rebased.
1304 commit being rebased.
1305 (default: ``$local $base $other``)
1305 (default: ``$local $base $other``)
1306
1306
1307 ``premerge``
1307 ``premerge``
1308 Attempt to run internal non-interactive 3-way merge tool before
1308 Attempt to run internal non-interactive 3-way merge tool before
1309 launching external tool. Options are ``true``, ``false``, ``keep`` or
1309 launching external tool. Options are ``true``, ``false``, ``keep`` or
1310 ``keep-merge3``. The ``keep`` option will leave markers in the file if the
1310 ``keep-merge3``. The ``keep`` option will leave markers in the file if the
1311 premerge fails. The ``keep-merge3`` will do the same but include information
1311 premerge fails. The ``keep-merge3`` will do the same but include information
1312 about the base of the merge in the marker (see internal :merge3 in
1312 about the base of the merge in the marker (see internal :merge3 in
1313 :hg:`help merge-tools`).
1313 :hg:`help merge-tools`).
1314 (default: True)
1314 (default: True)
1315
1315
1316 ``binary``
1316 ``binary``
1317 This tool can merge binary files. (default: False, unless tool
1317 This tool can merge binary files. (default: False, unless tool
1318 was selected by file pattern match)
1318 was selected by file pattern match)
1319
1319
1320 ``symlink``
1320 ``symlink``
1321 This tool can merge symlinks. (default: False)
1321 This tool can merge symlinks. (default: False)
1322
1322
1323 ``check``
1323 ``check``
1324 A list of merge success-checking options:
1324 A list of merge success-checking options:
1325
1325
1326 ``changed``
1326 ``changed``
1327 Ask whether merge was successful when the merged file shows no changes.
1327 Ask whether merge was successful when the merged file shows no changes.
1328 ``conflicts``
1328 ``conflicts``
1329 Check whether there are conflicts even though the tool reported success.
1329 Check whether there are conflicts even though the tool reported success.
1330 ``prompt``
1330 ``prompt``
1331 Always prompt for merge success, regardless of success reported by tool.
1331 Always prompt for merge success, regardless of success reported by tool.
1332
1332
1333 ``fixeol``
1333 ``fixeol``
1334 Attempt to fix up EOL changes caused by the merge tool.
1334 Attempt to fix up EOL changes caused by the merge tool.
1335 (default: False)
1335 (default: False)
1336
1336
1337 ``gui``
1337 ``gui``
1338 This tool requires a graphical interface to run. (default: False)
1338 This tool requires a graphical interface to run. (default: False)
1339
1339
1340 .. container:: windows
1340 .. container:: windows
1341
1341
1342 ``regkey``
1342 ``regkey``
1343 Windows registry key which describes install location of this
1343 Windows registry key which describes install location of this
1344 tool. Mercurial will search for this key first under
1344 tool. Mercurial will search for this key first under
1345 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1345 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1346 (default: None)
1346 (default: None)
1347
1347
1348 ``regkeyalt``
1348 ``regkeyalt``
1349 An alternate Windows registry key to try if the first key is not
1349 An alternate Windows registry key to try if the first key is not
1350 found. The alternate key uses the same ``regname`` and ``regappend``
1350 found. The alternate key uses the same ``regname`` and ``regappend``
1351 semantics of the primary key. The most common use for this key
1351 semantics of the primary key. The most common use for this key
1352 is to search for 32bit applications on 64bit operating systems.
1352 is to search for 32bit applications on 64bit operating systems.
1353 (default: None)
1353 (default: None)
1354
1354
1355 ``regname``
1355 ``regname``
1356 Name of value to read from specified registry key.
1356 Name of value to read from specified registry key.
1357 (default: the unnamed (default) value)
1357 (default: the unnamed (default) value)
1358
1358
1359 ``regappend``
1359 ``regappend``
1360 String to append to the value read from the registry, typically
1360 String to append to the value read from the registry, typically
1361 the executable name of the tool.
1361 the executable name of the tool.
1362 (default: None)
1362 (default: None)
1363
1363
1364 ``pager``
1364 ``pager``
1365 ---------
1365 ---------
1366
1366
1367 Setting used to control when to paginate and with what external tool. See
1367 Setting used to control when to paginate and with what external tool. See
1368 :hg:`help pager` for details.
1368 :hg:`help pager` for details.
1369
1369
1370 ``enable``
1370 ``enable``
1371 Control the pagination of command output (default: True).
1371 Control the pagination of command output (default: True).
1372
1372
1373 ``pager``
1373 ``pager``
1374 Define the external tool used as pager.
1374 Define the external tool used as pager.
1375
1375
1376 If no pager is set, Mercurial uses the environment variable $PAGER.
1376 If no pager is set, Mercurial uses the environment variable $PAGER.
1377 If neither pager.pager, nor $PAGER is set, a default pager will be
1377 If neither pager.pager, nor $PAGER is set, a default pager will be
1378 used, typically `less` on Unix and `more` on Windows. Example::
1378 used, typically `less` on Unix and `more` on Windows. Example::
1379
1379
1380 [pager]
1380 [pager]
1381 pager = less -FRX
1381 pager = less -FRX
1382
1382
1383 ``ignore``
1383 ``ignore``
1384 List of commands to disable the pager for. Example::
1384 List of commands to disable the pager for. Example::
1385
1385
1386 [pager]
1386 [pager]
1387 ignore = version, help, update
1387 ignore = version, help, update
1388
1388
1389 ``patch``
1389 ``patch``
1390 ---------
1390 ---------
1391
1391
1392 Settings used when applying patches, for instance through the 'import'
1392 Settings used when applying patches, for instance through the 'import'
1393 command or with Mercurial Queues extension.
1393 command or with Mercurial Queues extension.
1394
1394
1395 ``eol``
1395 ``eol``
1396 When set to 'strict' patch content and patched files end of lines
1396 When set to 'strict' patch content and patched files end of lines
1397 are preserved. When set to ``lf`` or ``crlf``, both files end of
1397 are preserved. When set to ``lf`` or ``crlf``, both files end of
1398 lines are ignored when patching and the result line endings are
1398 lines are ignored when patching and the result line endings are
1399 normalized to either LF (Unix) or CRLF (Windows). When set to
1399 normalized to either LF (Unix) or CRLF (Windows). When set to
1400 ``auto``, end of lines are again ignored while patching but line
1400 ``auto``, end of lines are again ignored while patching but line
1401 endings in patched files are normalized to their original setting
1401 endings in patched files are normalized to their original setting
1402 on a per-file basis. If target file does not exist or has no end
1402 on a per-file basis. If target file does not exist or has no end
1403 of line, patch line endings are preserved.
1403 of line, patch line endings are preserved.
1404 (default: strict)
1404 (default: strict)
1405
1405
1406 ``fuzz``
1406 ``fuzz``
1407 The number of lines of 'fuzz' to allow when applying patches. This
1407 The number of lines of 'fuzz' to allow when applying patches. This
1408 controls how much context the patcher is allowed to ignore when
1408 controls how much context the patcher is allowed to ignore when
1409 trying to apply a patch.
1409 trying to apply a patch.
1410 (default: 2)
1410 (default: 2)
1411
1411
1412 ``paths``
1412 ``paths``
1413 ---------
1413 ---------
1414
1414
1415 Assigns symbolic names and behavior to repositories.
1415 Assigns symbolic names and behavior to repositories.
1416
1416
1417 Options are symbolic names defining the URL or directory that is the
1417 Options are symbolic names defining the URL or directory that is the
1418 location of the repository. Example::
1418 location of the repository. Example::
1419
1419
1420 [paths]
1420 [paths]
1421 my_server = https://example.com/my_repo
1421 my_server = https://example.com/my_repo
1422 local_path = /home/me/repo
1422 local_path = /home/me/repo
1423
1423
1424 These symbolic names can be used from the command line. To pull
1424 These symbolic names can be used from the command line. To pull
1425 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1425 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1426 :hg:`push local_path`.
1426 :hg:`push local_path`.
1427
1427
1428 Options containing colons (``:``) denote sub-options that can influence
1428 Options containing colons (``:``) denote sub-options that can influence
1429 behavior for that specific path. Example::
1429 behavior for that specific path. Example::
1430
1430
1431 [paths]
1431 [paths]
1432 my_server = https://example.com/my_path
1432 my_server = https://example.com/my_path
1433 my_server:pushurl = ssh://example.com/my_path
1433 my_server:pushurl = ssh://example.com/my_path
1434
1434
1435 The following sub-options can be defined:
1435 The following sub-options can be defined:
1436
1436
1437 ``pushurl``
1437 ``pushurl``
1438 The URL to use for push operations. If not defined, the location
1438 The URL to use for push operations. If not defined, the location
1439 defined by the path's main entry is used.
1439 defined by the path's main entry is used.
1440
1440
1441 ``pushrev``
1441 ``pushrev``
1442 A revset defining which revisions to push by default.
1442 A revset defining which revisions to push by default.
1443
1443
1444 When :hg:`push` is executed without a ``-r`` argument, the revset
1444 When :hg:`push` is executed without a ``-r`` argument, the revset
1445 defined by this sub-option is evaluated to determine what to push.
1445 defined by this sub-option is evaluated to determine what to push.
1446
1446
1447 For example, a value of ``.`` will push the working directory's
1447 For example, a value of ``.`` will push the working directory's
1448 revision by default.
1448 revision by default.
1449
1449
1450 Revsets specifying bookmarks will not result in the bookmark being
1450 Revsets specifying bookmarks will not result in the bookmark being
1451 pushed.
1451 pushed.
1452
1452
1453 The following special named paths exist:
1453 The following special named paths exist:
1454
1454
1455 ``default``
1455 ``default``
1456 The URL or directory to use when no source or remote is specified.
1456 The URL or directory to use when no source or remote is specified.
1457
1457
1458 :hg:`clone` will automatically define this path to the location the
1458 :hg:`clone` will automatically define this path to the location the
1459 repository was cloned from.
1459 repository was cloned from.
1460
1460
1461 ``default-push``
1461 ``default-push``
1462 (deprecated) The URL or directory for the default :hg:`push` location.
1462 (deprecated) The URL or directory for the default :hg:`push` location.
1463 ``default:pushurl`` should be used instead.
1463 ``default:pushurl`` should be used instead.
1464
1464
1465 ``phases``
1465 ``phases``
1466 ----------
1466 ----------
1467
1467
1468 Specifies default handling of phases. See :hg:`help phases` for more
1468 Specifies default handling of phases. See :hg:`help phases` for more
1469 information about working with phases.
1469 information about working with phases.
1470
1470
1471 ``publish``
1471 ``publish``
1472 Controls draft phase behavior when working as a server. When true,
1472 Controls draft phase behavior when working as a server. When true,
1473 pushed changesets are set to public in both client and server and
1473 pushed changesets are set to public in both client and server and
1474 pulled or cloned changesets are set to public in the client.
1474 pulled or cloned changesets are set to public in the client.
1475 (default: True)
1475 (default: True)
1476
1476
1477 ``new-commit``
1477 ``new-commit``
1478 Phase of newly-created commits.
1478 Phase of newly-created commits.
1479 (default: draft)
1479 (default: draft)
1480
1480
1481 ``checksubrepos``
1481 ``checksubrepos``
1482 Check the phase of the current revision of each subrepository. Allowed
1482 Check the phase of the current revision of each subrepository. Allowed
1483 values are "ignore", "follow" and "abort". For settings other than
1483 values are "ignore", "follow" and "abort". For settings other than
1484 "ignore", the phase of the current revision of each subrepository is
1484 "ignore", the phase of the current revision of each subrepository is
1485 checked before committing the parent repository. If any of those phases is
1485 checked before committing the parent repository. If any of those phases is
1486 greater than the phase of the parent repository (e.g. if a subrepo is in a
1486 greater than the phase of the parent repository (e.g. if a subrepo is in a
1487 "secret" phase while the parent repo is in "draft" phase), the commit is
1487 "secret" phase while the parent repo is in "draft" phase), the commit is
1488 either aborted (if checksubrepos is set to "abort") or the higher phase is
1488 either aborted (if checksubrepos is set to "abort") or the higher phase is
1489 used for the parent repository commit (if set to "follow").
1489 used for the parent repository commit (if set to "follow").
1490 (default: follow)
1490 (default: follow)
1491
1491
1492
1492
1493 ``profiling``
1493 ``profiling``
1494 -------------
1494 -------------
1495
1495
1496 Specifies profiling type, format, and file output. Two profilers are
1496 Specifies profiling type, format, and file output. Two profilers are
1497 supported: an instrumenting profiler (named ``ls``), and a sampling
1497 supported: an instrumenting profiler (named ``ls``), and a sampling
1498 profiler (named ``stat``).
1498 profiler (named ``stat``).
1499
1499
1500 In this section description, 'profiling data' stands for the raw data
1500 In this section description, 'profiling data' stands for the raw data
1501 collected during profiling, while 'profiling report' stands for a
1501 collected during profiling, while 'profiling report' stands for a
1502 statistical text report generated from the profiling data. The
1502 statistical text report generated from the profiling data. The
1503 profiling is done using lsprof.
1503 profiling is done using lsprof.
1504
1504
1505 ``enabled``
1505 ``enabled``
1506 Enable the profiler.
1506 Enable the profiler.
1507 (default: false)
1507 (default: false)
1508
1508
1509 This is equivalent to passing ``--profile`` on the command line.
1509 This is equivalent to passing ``--profile`` on the command line.
1510
1510
1511 ``type``
1511 ``type``
1512 The type of profiler to use.
1512 The type of profiler to use.
1513 (default: stat)
1513 (default: stat)
1514
1514
1515 ``ls``
1515 ``ls``
1516 Use Python's built-in instrumenting profiler. This profiler
1516 Use Python's built-in instrumenting profiler. This profiler
1517 works on all platforms, but each line number it reports is the
1517 works on all platforms, but each line number it reports is the
1518 first line of a function. This restriction makes it difficult to
1518 first line of a function. This restriction makes it difficult to
1519 identify the expensive parts of a non-trivial function.
1519 identify the expensive parts of a non-trivial function.
1520 ``stat``
1520 ``stat``
1521 Use a statistical profiler, statprof. This profiler is most
1521 Use a statistical profiler, statprof. This profiler is most
1522 useful for profiling commands that run for longer than about 0.1
1522 useful for profiling commands that run for longer than about 0.1
1523 seconds.
1523 seconds.
1524
1524
1525 ``format``
1525 ``format``
1526 Profiling format. Specific to the ``ls`` instrumenting profiler.
1526 Profiling format. Specific to the ``ls`` instrumenting profiler.
1527 (default: text)
1527 (default: text)
1528
1528
1529 ``text``
1529 ``text``
1530 Generate a profiling report. When saving to a file, it should be
1530 Generate a profiling report. When saving to a file, it should be
1531 noted that only the report is saved, and the profiling data is
1531 noted that only the report is saved, and the profiling data is
1532 not kept.
1532 not kept.
1533 ``kcachegrind``
1533 ``kcachegrind``
1534 Format profiling data for kcachegrind use: when saving to a
1534 Format profiling data for kcachegrind use: when saving to a
1535 file, the generated file can directly be loaded into
1535 file, the generated file can directly be loaded into
1536 kcachegrind.
1536 kcachegrind.
1537
1537
1538 ``statformat``
1538 ``statformat``
1539 Profiling format for the ``stat`` profiler.
1539 Profiling format for the ``stat`` profiler.
1540 (default: hotpath)
1540 (default: hotpath)
1541
1541
1542 ``hotpath``
1542 ``hotpath``
1543 Show a tree-based display containing the hot path of execution (where
1543 Show a tree-based display containing the hot path of execution (where
1544 most time was spent).
1544 most time was spent).
1545 ``bymethod``
1545 ``bymethod``
1546 Show a table of methods ordered by how frequently they are active.
1546 Show a table of methods ordered by how frequently they are active.
1547 ``byline``
1547 ``byline``
1548 Show a table of lines in files ordered by how frequently they are active.
1548 Show a table of lines in files ordered by how frequently they are active.
1549 ``json``
1549 ``json``
1550 Render profiling data as JSON.
1550 Render profiling data as JSON.
1551
1551
1552 ``frequency``
1552 ``frequency``
1553 Sampling frequency. Specific to the ``stat`` sampling profiler.
1553 Sampling frequency. Specific to the ``stat`` sampling profiler.
1554 (default: 1000)
1554 (default: 1000)
1555
1555
1556 ``output``
1556 ``output``
1557 File path where profiling data or report should be saved. If the
1557 File path where profiling data or report should be saved. If the
1558 file exists, it is replaced. (default: None, data is printed on
1558 file exists, it is replaced. (default: None, data is printed on
1559 stderr)
1559 stderr)
1560
1560
1561 ``sort``
1561 ``sort``
1562 Sort field. Specific to the ``ls`` instrumenting profiler.
1562 Sort field. Specific to the ``ls`` instrumenting profiler.
1563 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1563 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1564 ``inlinetime``.
1564 ``inlinetime``.
1565 (default: inlinetime)
1565 (default: inlinetime)
1566
1566
1567 ``limit``
1567 ``limit``
1568 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1568 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1569 (default: 30)
1569 (default: 30)
1570
1570
1571 ``nested``
1571 ``nested``
1572 Show at most this number of lines of drill-down info after each main entry.
1572 Show at most this number of lines of drill-down info after each main entry.
1573 This can help explain the difference between Total and Inline.
1573 This can help explain the difference between Total and Inline.
1574 Specific to the ``ls`` instrumenting profiler.
1574 Specific to the ``ls`` instrumenting profiler.
1575 (default: 5)
1575 (default: 5)
1576
1576
1577 ``progress``
1577 ``progress``
1578 ------------
1578 ------------
1579
1579
1580 Mercurial commands can draw progress bars that are as informative as
1580 Mercurial commands can draw progress bars that are as informative as
1581 possible. Some progress bars only offer indeterminate information, while others
1581 possible. Some progress bars only offer indeterminate information, while others
1582 have a definite end point.
1582 have a definite end point.
1583
1583
1584 ``delay``
1584 ``delay``
1585 Number of seconds (float) before showing the progress bar. (default: 3)
1585 Number of seconds (float) before showing the progress bar. (default: 3)
1586
1586
1587 ``changedelay``
1587 ``changedelay``
1588 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1588 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1589 that value will be used instead. (default: 1)
1589 that value will be used instead. (default: 1)
1590
1590
1591 ``refresh``
1591 ``refresh``
1592 Time in seconds between refreshes of the progress bar. (default: 0.1)
1592 Time in seconds between refreshes of the progress bar. (default: 0.1)
1593
1593
1594 ``format``
1594 ``format``
1595 Format of the progress bar.
1595 Format of the progress bar.
1596
1596
1597 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1597 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1598 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1598 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1599 last 20 characters of the item, but this can be changed by adding either
1599 last 20 characters of the item, but this can be changed by adding either
1600 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1600 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1601 first num characters.
1601 first num characters.
1602
1602
1603 (default: topic bar number estimate)
1603 (default: topic bar number estimate)
1604
1604
1605 ``width``
1605 ``width``
1606 If set, the maximum width of the progress information (that is, min(width,
1606 If set, the maximum width of the progress information (that is, min(width,
1607 term width) will be used).
1607 term width) will be used).
1608
1608
1609 ``clear-complete``
1609 ``clear-complete``
1610 Clear the progress bar after it's done. (default: True)
1610 Clear the progress bar after it's done. (default: True)
1611
1611
1612 ``disable``
1612 ``disable``
1613 If true, don't show a progress bar.
1613 If true, don't show a progress bar.
1614
1614
1615 ``assume-tty``
1615 ``assume-tty``
1616 If true, ALWAYS show a progress bar, unless disable is given.
1616 If true, ALWAYS show a progress bar, unless disable is given.
1617
1617
1618 ``rebase``
1618 ``rebase``
1619 ----------
1619 ----------
1620
1620
1621 ``allowdivergence``
1621 ``allowdivergence``
1622 Default to False, when True allow creating divergence when performing
1622 Default to False, when True allow creating divergence when performing
1623 rebase of obsolete changesets.
1623 rebase of obsolete changesets.
1624
1624
1625 ``revsetalias``
1625 ``revsetalias``
1626 ---------------
1626 ---------------
1627
1627
1628 Alias definitions for revsets. See :hg:`help revsets` for details.
1628 Alias definitions for revsets. See :hg:`help revsets` for details.
1629
1629
1630 ``server``
1630 ``server``
1631 ----------
1631 ----------
1632
1632
1633 Controls generic server settings.
1633 Controls generic server settings.
1634
1634
1635 ``compressionengines``
1635 ``compressionengines``
1636 List of compression engines and their relative priority to advertise
1636 List of compression engines and their relative priority to advertise
1637 to clients.
1637 to clients.
1638
1638
1639 The order of compression engines determines their priority, the first
1639 The order of compression engines determines their priority, the first
1640 having the highest priority. If a compression engine is not listed
1640 having the highest priority. If a compression engine is not listed
1641 here, it won't be advertised to clients.
1641 here, it won't be advertised to clients.
1642
1642
1643 If not set (the default), built-in defaults are used. Run
1643 If not set (the default), built-in defaults are used. Run
1644 :hg:`debuginstall` to list available compression engines and their
1644 :hg:`debuginstall` to list available compression engines and their
1645 default wire protocol priority.
1645 default wire protocol priority.
1646
1646
1647 Older Mercurial clients only support zlib compression and this setting
1647 Older Mercurial clients only support zlib compression and this setting
1648 has no effect for legacy clients.
1648 has no effect for legacy clients.
1649
1649
1650 ``uncompressed``
1650 ``uncompressed``
1651 Whether to allow clients to clone a repository using the
1651 Whether to allow clients to clone a repository using the
1652 uncompressed streaming protocol. This transfers about 40% more
1652 uncompressed streaming protocol. This transfers about 40% more
1653 data than a regular clone, but uses less memory and CPU on both
1653 data than a regular clone, but uses less memory and CPU on both
1654 server and client. Over a LAN (100 Mbps or better) or a very fast
1654 server and client. Over a LAN (100 Mbps or better) or a very fast
1655 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
1655 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
1656 regular clone. Over most WAN connections (anything slower than
1656 regular clone. Over most WAN connections (anything slower than
1657 about 6 Mbps), uncompressed streaming is slower, because of the
1657 about 6 Mbps), uncompressed streaming is slower, because of the
1658 extra data transfer overhead. This mode will also temporarily hold
1658 extra data transfer overhead. This mode will also temporarily hold
1659 the write lock while determining what data to transfer.
1659 the write lock while determining what data to transfer.
1660 (default: True)
1660 (default: True)
1661
1661
1662 ``preferuncompressed``
1662 ``preferuncompressed``
1663 When set, clients will try to use the uncompressed streaming
1663 When set, clients will try to use the uncompressed streaming
1664 protocol. (default: False)
1664 protocol. (default: False)
1665
1665
1666 ``validate``
1666 ``validate``
1667 Whether to validate the completeness of pushed changesets by
1667 Whether to validate the completeness of pushed changesets by
1668 checking that all new file revisions specified in manifests are
1668 checking that all new file revisions specified in manifests are
1669 present. (default: False)
1669 present. (default: False)
1670
1670
1671 ``maxhttpheaderlen``
1671 ``maxhttpheaderlen``
1672 Instruct HTTP clients not to send request headers longer than this
1672 Instruct HTTP clients not to send request headers longer than this
1673 many bytes. (default: 1024)
1673 many bytes. (default: 1024)
1674
1674
1675 ``bundle1``
1675 ``bundle1``
1676 Whether to allow clients to push and pull using the legacy bundle1
1676 Whether to allow clients to push and pull using the legacy bundle1
1677 exchange format. (default: True)
1677 exchange format. (default: True)
1678
1678
1679 ``bundle1gd``
1679 ``bundle1gd``
1680 Like ``bundle1`` but only used if the repository is using the
1680 Like ``bundle1`` but only used if the repository is using the
1681 *generaldelta* storage format. (default: True)
1681 *generaldelta* storage format. (default: True)
1682
1682
1683 ``bundle1.push``
1683 ``bundle1.push``
1684 Whether to allow clients to push using the legacy bundle1 exchange
1684 Whether to allow clients to push using the legacy bundle1 exchange
1685 format. (default: True)
1685 format. (default: True)
1686
1686
1687 ``bundle1gd.push``
1687 ``bundle1gd.push``
1688 Like ``bundle1.push`` but only used if the repository is using the
1688 Like ``bundle1.push`` but only used if the repository is using the
1689 *generaldelta* storage format. (default: True)
1689 *generaldelta* storage format. (default: True)
1690
1690
1691 ``bundle1.pull``
1691 ``bundle1.pull``
1692 Whether to allow clients to pull using the legacy bundle1 exchange
1692 Whether to allow clients to pull using the legacy bundle1 exchange
1693 format. (default: True)
1693 format. (default: True)
1694
1694
1695 ``bundle1gd.pull``
1695 ``bundle1gd.pull``
1696 Like ``bundle1.pull`` but only used if the repository is using the
1696 Like ``bundle1.pull`` but only used if the repository is using the
1697 *generaldelta* storage format. (default: True)
1697 *generaldelta* storage format. (default: True)
1698
1698
1699 Large repositories using the *generaldelta* storage format should
1699 Large repositories using the *generaldelta* storage format should
1700 consider setting this option because converting *generaldelta*
1700 consider setting this option because converting *generaldelta*
1701 repositories to the exchange format required by the bundle1 data
1701 repositories to the exchange format required by the bundle1 data
1702 format can consume a lot of CPU.
1702 format can consume a lot of CPU.
1703
1703
1704 ``zliblevel``
1704 ``zliblevel``
1705 Integer between ``-1`` and ``9`` that controls the zlib compression level
1705 Integer between ``-1`` and ``9`` that controls the zlib compression level
1706 for wire protocol commands that send zlib compressed output (notably the
1706 for wire protocol commands that send zlib compressed output (notably the
1707 commands that send repository history data).
1707 commands that send repository history data).
1708
1708
1709 The default (``-1``) uses the default zlib compression level, which is
1709 The default (``-1``) uses the default zlib compression level, which is
1710 likely equivalent to ``6``. ``0`` means no compression. ``9`` means
1710 likely equivalent to ``6``. ``0`` means no compression. ``9`` means
1711 maximum compression.
1711 maximum compression.
1712
1712
1713 Setting this option allows server operators to make trade-offs between
1713 Setting this option allows server operators to make trade-offs between
1714 bandwidth and CPU used. Lowering the compression lowers CPU utilization
1714 bandwidth and CPU used. Lowering the compression lowers CPU utilization
1715 but sends more bytes to clients.
1715 but sends more bytes to clients.
1716
1716
1717 This option only impacts the HTTP server.
1717 This option only impacts the HTTP server.
1718
1718
1719 ``zstdlevel``
1719 ``zstdlevel``
1720 Integer between ``1`` and ``22`` that controls the zstd compression level
1720 Integer between ``1`` and ``22`` that controls the zstd compression level
1721 for wire protocol commands. ``1`` is the minimal amount of compression and
1721 for wire protocol commands. ``1`` is the minimal amount of compression and
1722 ``22`` is the highest amount of compression.
1722 ``22`` is the highest amount of compression.
1723
1723
1724 The default (``3``) should be significantly faster than zlib while likely
1724 The default (``3``) should be significantly faster than zlib while likely
1725 delivering better compression ratios.
1725 delivering better compression ratios.
1726
1726
1727 This option only impacts the HTTP server.
1727 This option only impacts the HTTP server.
1728
1728
1729 See also ``server.zliblevel``.
1729 See also ``server.zliblevel``.
1730
1730
1731 ``smtp``
1731 ``smtp``
1732 --------
1732 --------
1733
1733
1734 Configuration for extensions that need to send email messages.
1734 Configuration for extensions that need to send email messages.
1735
1735
1736 ``host``
1736 ``host``
1737 Host name of mail server, e.g. "mail.example.com".
1737 Host name of mail server, e.g. "mail.example.com".
1738
1738
1739 ``port``
1739 ``port``
1740 Optional. Port to connect to on mail server. (default: 465 if
1740 Optional. Port to connect to on mail server. (default: 465 if
1741 ``tls`` is smtps; 25 otherwise)
1741 ``tls`` is smtps; 25 otherwise)
1742
1742
1743 ``tls``
1743 ``tls``
1744 Optional. Method to enable TLS when connecting to mail server: starttls,
1744 Optional. Method to enable TLS when connecting to mail server: starttls,
1745 smtps or none. (default: none)
1745 smtps or none. (default: none)
1746
1746
1747 ``username``
1747 ``username``
1748 Optional. User name for authenticating with the SMTP server.
1748 Optional. User name for authenticating with the SMTP server.
1749 (default: None)
1749 (default: None)
1750
1750
1751 ``password``
1751 ``password``
1752 Optional. Password for authenticating with the SMTP server. If not
1752 Optional. Password for authenticating with the SMTP server. If not
1753 specified, interactive sessions will prompt the user for a
1753 specified, interactive sessions will prompt the user for a
1754 password; non-interactive sessions will fail. (default: None)
1754 password; non-interactive sessions will fail. (default: None)
1755
1755
1756 ``local_hostname``
1756 ``local_hostname``
1757 Optional. The hostname that the sender can use to identify
1757 Optional. The hostname that the sender can use to identify
1758 itself to the MTA.
1758 itself to the MTA.
1759
1759
1760
1760
1761 ``subpaths``
1761 ``subpaths``
1762 ------------
1762 ------------
1763
1763
1764 Subrepository source URLs can go stale if a remote server changes name
1764 Subrepository source URLs can go stale if a remote server changes name
1765 or becomes temporarily unavailable. This section lets you define
1765 or becomes temporarily unavailable. This section lets you define
1766 rewrite rules of the form::
1766 rewrite rules of the form::
1767
1767
1768 <pattern> = <replacement>
1768 <pattern> = <replacement>
1769
1769
1770 where ``pattern`` is a regular expression matching a subrepository
1770 where ``pattern`` is a regular expression matching a subrepository
1771 source URL and ``replacement`` is the replacement string used to
1771 source URL and ``replacement`` is the replacement string used to
1772 rewrite it. Groups can be matched in ``pattern`` and referenced in
1772 rewrite it. Groups can be matched in ``pattern`` and referenced in
1773 ``replacements``. For instance::
1773 ``replacements``. For instance::
1774
1774
1775 http://server/(.*)-hg/ = http://hg.server/\1/
1775 http://server/(.*)-hg/ = http://hg.server/\1/
1776
1776
1777 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
1777 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
1778
1778
1779 Relative subrepository paths are first made absolute, and the
1779 Relative subrepository paths are first made absolute, and the
1780 rewrite rules are then applied on the full (absolute) path. If ``pattern``
1780 rewrite rules are then applied on the full (absolute) path. If ``pattern``
1781 doesn't match the full path, an attempt is made to apply it on the
1781 doesn't match the full path, an attempt is made to apply it on the
1782 relative path alone. The rules are applied in definition order.
1782 relative path alone. The rules are applied in definition order.
1783
1783
1784 ``templatealias``
1784 ``templatealias``
1785 -----------------
1785 -----------------
1786
1786
1787 Alias definitions for templates. See :hg:`help templates` for details.
1787 Alias definitions for templates. See :hg:`help templates` for details.
1788
1788
1789 ``templates``
1789 ``templates``
1790 -------------
1790 -------------
1791
1791
1792 Use the ``[templates]`` section to define template strings.
1792 Use the ``[templates]`` section to define template strings.
1793 See :hg:`help templates` for details.
1793 See :hg:`help templates` for details.
1794
1794
1795 ``trusted``
1795 ``trusted``
1796 -----------
1796 -----------
1797
1797
1798 Mercurial will not use the settings in the
1798 Mercurial will not use the settings in the
1799 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
1799 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
1800 user or to a trusted group, as various hgrc features allow arbitrary
1800 user or to a trusted group, as various hgrc features allow arbitrary
1801 commands to be run. This issue is often encountered when configuring
1801 commands to be run. This issue is often encountered when configuring
1802 hooks or extensions for shared repositories or servers. However,
1802 hooks or extensions for shared repositories or servers. However,
1803 the web interface will use some safe settings from the ``[web]``
1803 the web interface will use some safe settings from the ``[web]``
1804 section.
1804 section.
1805
1805
1806 This section specifies what users and groups are trusted. The
1806 This section specifies what users and groups are trusted. The
1807 current user is always trusted. To trust everybody, list a user or a
1807 current user is always trusted. To trust everybody, list a user or a
1808 group with name ``*``. These settings must be placed in an
1808 group with name ``*``. These settings must be placed in an
1809 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
1809 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
1810 user or service running Mercurial.
1810 user or service running Mercurial.
1811
1811
1812 ``users``
1812 ``users``
1813 Comma-separated list of trusted users.
1813 Comma-separated list of trusted users.
1814
1814
1815 ``groups``
1815 ``groups``
1816 Comma-separated list of trusted groups.
1816 Comma-separated list of trusted groups.
1817
1817
1818
1818
1819 ``ui``
1819 ``ui``
1820 ------
1820 ------
1821
1821
1822 User interface controls.
1822 User interface controls.
1823
1823
1824 ``archivemeta``
1824 ``archivemeta``
1825 Whether to include the .hg_archival.txt file containing meta data
1825 Whether to include the .hg_archival.txt file containing meta data
1826 (hashes for the repository base and for tip) in archives created
1826 (hashes for the repository base and for tip) in archives created
1827 by the :hg:`archive` command or downloaded via hgweb.
1827 by the :hg:`archive` command or downloaded via hgweb.
1828 (default: True)
1828 (default: True)
1829
1829
1830 ``askusername``
1830 ``askusername``
1831 Whether to prompt for a username when committing. If True, and
1831 Whether to prompt for a username when committing. If True, and
1832 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
1832 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
1833 be prompted to enter a username. If no username is entered, the
1833 be prompted to enter a username. If no username is entered, the
1834 default ``USER@HOST`` is used instead.
1834 default ``USER@HOST`` is used instead.
1835 (default: False)
1835 (default: False)
1836
1836
1837 ``clonebundles``
1837 ``clonebundles``
1838 Whether the "clone bundles" feature is enabled.
1838 Whether the "clone bundles" feature is enabled.
1839
1839
1840 When enabled, :hg:`clone` may download and apply a server-advertised
1840 When enabled, :hg:`clone` may download and apply a server-advertised
1841 bundle file from a URL instead of using the normal exchange mechanism.
1841 bundle file from a URL instead of using the normal exchange mechanism.
1842
1842
1843 This can likely result in faster and more reliable clones.
1843 This can likely result in faster and more reliable clones.
1844
1844
1845 (default: True)
1845 (default: True)
1846
1846
1847 ``clonebundlefallback``
1847 ``clonebundlefallback``
1848 Whether failure to apply an advertised "clone bundle" from a server
1848 Whether failure to apply an advertised "clone bundle" from a server
1849 should result in fallback to a regular clone.
1849 should result in fallback to a regular clone.
1850
1850
1851 This is disabled by default because servers advertising "clone
1851 This is disabled by default because servers advertising "clone
1852 bundles" often do so to reduce server load. If advertised bundles
1852 bundles" often do so to reduce server load. If advertised bundles
1853 start mass failing and clients automatically fall back to a regular
1853 start mass failing and clients automatically fall back to a regular
1854 clone, this would add significant and unexpected load to the server
1854 clone, this would add significant and unexpected load to the server
1855 since the server is expecting clone operations to be offloaded to
1855 since the server is expecting clone operations to be offloaded to
1856 pre-generated bundles. Failing fast (the default behavior) ensures
1856 pre-generated bundles. Failing fast (the default behavior) ensures
1857 clients don't overwhelm the server when "clone bundle" application
1857 clients don't overwhelm the server when "clone bundle" application
1858 fails.
1858 fails.
1859
1859
1860 (default: False)
1860 (default: False)
1861
1861
1862 ``clonebundleprefers``
1862 ``clonebundleprefers``
1863 Defines preferences for which "clone bundles" to use.
1863 Defines preferences for which "clone bundles" to use.
1864
1864
1865 Servers advertising "clone bundles" may advertise multiple available
1865 Servers advertising "clone bundles" may advertise multiple available
1866 bundles. Each bundle may have different attributes, such as the bundle
1866 bundles. Each bundle may have different attributes, such as the bundle
1867 type and compression format. This option is used to prefer a particular
1867 type and compression format. This option is used to prefer a particular
1868 bundle over another.
1868 bundle over another.
1869
1869
1870 The following keys are defined by Mercurial:
1870 The following keys are defined by Mercurial:
1871
1871
1872 BUNDLESPEC
1872 BUNDLESPEC
1873 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
1873 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
1874 e.g. ``gzip-v2`` or ``bzip2-v1``.
1874 e.g. ``gzip-v2`` or ``bzip2-v1``.
1875
1875
1876 COMPRESSION
1876 COMPRESSION
1877 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
1877 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
1878
1878
1879 Server operators may define custom keys.
1879 Server operators may define custom keys.
1880
1880
1881 Example values: ``COMPRESSION=bzip2``,
1881 Example values: ``COMPRESSION=bzip2``,
1882 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
1882 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
1883
1883
1884 By default, the first bundle advertised by the server is used.
1884 By default, the first bundle advertised by the server is used.
1885
1885
1886 ``color``
1886 ``color``
1887 When to colorize output. Possible value are Boolean ("yes" or "no"), or
1887 When to colorize output. Possible value are Boolean ("yes" or "no"), or
1888 "debug". (default: "yes"). "yes" will use color whenever it seems possible.
1888 "debug", or "always". (default: "yes"). "yes" will use color whenever it
1889 See :hg:`help color` for details.
1889 seems possible. See :hg:`help color` for details.
1890
1890
1891 ``commitsubrepos``
1891 ``commitsubrepos``
1892 Whether to commit modified subrepositories when committing the
1892 Whether to commit modified subrepositories when committing the
1893 parent repository. If False and one subrepository has uncommitted
1893 parent repository. If False and one subrepository has uncommitted
1894 changes, abort the commit.
1894 changes, abort the commit.
1895 (default: False)
1895 (default: False)
1896
1896
1897 ``debug``
1897 ``debug``
1898 Print debugging information. (default: False)
1898 Print debugging information. (default: False)
1899
1899
1900 ``editor``
1900 ``editor``
1901 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
1901 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
1902
1902
1903 ``fallbackencoding``
1903 ``fallbackencoding``
1904 Encoding to try if it's not possible to decode the changelog using
1904 Encoding to try if it's not possible to decode the changelog using
1905 UTF-8. (default: ISO-8859-1)
1905 UTF-8. (default: ISO-8859-1)
1906
1906
1907 ``graphnodetemplate``
1907 ``graphnodetemplate``
1908 The template used to print changeset nodes in an ASCII revision graph.
1908 The template used to print changeset nodes in an ASCII revision graph.
1909 (default: ``{graphnode}``)
1909 (default: ``{graphnode}``)
1910
1910
1911 ``ignore``
1911 ``ignore``
1912 A file to read per-user ignore patterns from. This file should be
1912 A file to read per-user ignore patterns from. This file should be
1913 in the same format as a repository-wide .hgignore file. Filenames
1913 in the same format as a repository-wide .hgignore file. Filenames
1914 are relative to the repository root. This option supports hook syntax,
1914 are relative to the repository root. This option supports hook syntax,
1915 so if you want to specify multiple ignore files, you can do so by
1915 so if you want to specify multiple ignore files, you can do so by
1916 setting something like ``ignore.other = ~/.hgignore2``. For details
1916 setting something like ``ignore.other = ~/.hgignore2``. For details
1917 of the ignore file format, see the ``hgignore(5)`` man page.
1917 of the ignore file format, see the ``hgignore(5)`` man page.
1918
1918
1919 ``interactive``
1919 ``interactive``
1920 Allow to prompt the user. (default: True)
1920 Allow to prompt the user. (default: True)
1921
1921
1922 ``interface``
1922 ``interface``
1923 Select the default interface for interactive features (default: text).
1923 Select the default interface for interactive features (default: text).
1924 Possible values are 'text' and 'curses'.
1924 Possible values are 'text' and 'curses'.
1925
1925
1926 ``interface.chunkselector``
1926 ``interface.chunkselector``
1927 Select the interface for change recording (e.g. :hg:`commit -i`).
1927 Select the interface for change recording (e.g. :hg:`commit -i`).
1928 Possible values are 'text' and 'curses'.
1928 Possible values are 'text' and 'curses'.
1929 This config overrides the interface specified by ui.interface.
1929 This config overrides the interface specified by ui.interface.
1930
1930
1931 ``logtemplate``
1931 ``logtemplate``
1932 Template string for commands that print changesets.
1932 Template string for commands that print changesets.
1933
1933
1934 ``merge``
1934 ``merge``
1935 The conflict resolution program to use during a manual merge.
1935 The conflict resolution program to use during a manual merge.
1936 For more information on merge tools see :hg:`help merge-tools`.
1936 For more information on merge tools see :hg:`help merge-tools`.
1937 For configuring merge tools see the ``[merge-tools]`` section.
1937 For configuring merge tools see the ``[merge-tools]`` section.
1938
1938
1939 ``mergemarkers``
1939 ``mergemarkers``
1940 Sets the merge conflict marker label styling. The ``detailed``
1940 Sets the merge conflict marker label styling. The ``detailed``
1941 style uses the ``mergemarkertemplate`` setting to style the labels.
1941 style uses the ``mergemarkertemplate`` setting to style the labels.
1942 The ``basic`` style just uses 'local' and 'other' as the marker label.
1942 The ``basic`` style just uses 'local' and 'other' as the marker label.
1943 One of ``basic`` or ``detailed``.
1943 One of ``basic`` or ``detailed``.
1944 (default: ``basic``)
1944 (default: ``basic``)
1945
1945
1946 ``mergemarkertemplate``
1946 ``mergemarkertemplate``
1947 The template used to print the commit description next to each conflict
1947 The template used to print the commit description next to each conflict
1948 marker during merge conflicts. See :hg:`help templates` for the template
1948 marker during merge conflicts. See :hg:`help templates` for the template
1949 format.
1949 format.
1950
1950
1951 Defaults to showing the hash, tags, branches, bookmarks, author, and
1951 Defaults to showing the hash, tags, branches, bookmarks, author, and
1952 the first line of the commit description.
1952 the first line of the commit description.
1953
1953
1954 If you use non-ASCII characters in names for tags, branches, bookmarks,
1954 If you use non-ASCII characters in names for tags, branches, bookmarks,
1955 authors, and/or commit descriptions, you must pay attention to encodings of
1955 authors, and/or commit descriptions, you must pay attention to encodings of
1956 managed files. At template expansion, non-ASCII characters use the encoding
1956 managed files. At template expansion, non-ASCII characters use the encoding
1957 specified by the ``--encoding`` global option, ``HGENCODING`` or other
1957 specified by the ``--encoding`` global option, ``HGENCODING`` or other
1958 environment variables that govern your locale. If the encoding of the merge
1958 environment variables that govern your locale. If the encoding of the merge
1959 markers is different from the encoding of the merged files,
1959 markers is different from the encoding of the merged files,
1960 serious problems may occur.
1960 serious problems may occur.
1961
1961
1962 ``origbackuppath``
1962 ``origbackuppath``
1963 The path to a directory used to store generated .orig files. If the path is
1963 The path to a directory used to store generated .orig files. If the path is
1964 not a directory, one will be created.
1964 not a directory, one will be created.
1965
1965
1966 ``patch``
1966 ``patch``
1967 An optional external tool that ``hg import`` and some extensions
1967 An optional external tool that ``hg import`` and some extensions
1968 will use for applying patches. By default Mercurial uses an
1968 will use for applying patches. By default Mercurial uses an
1969 internal patch utility. The external tool must work as the common
1969 internal patch utility. The external tool must work as the common
1970 Unix ``patch`` program. In particular, it must accept a ``-p``
1970 Unix ``patch`` program. In particular, it must accept a ``-p``
1971 argument to strip patch headers, a ``-d`` argument to specify the
1971 argument to strip patch headers, a ``-d`` argument to specify the
1972 current directory, a file name to patch, and a patch file to take
1972 current directory, a file name to patch, and a patch file to take
1973 from stdin.
1973 from stdin.
1974
1974
1975 It is possible to specify a patch tool together with extra
1975 It is possible to specify a patch tool together with extra
1976 arguments. For example, setting this option to ``patch --merge``
1976 arguments. For example, setting this option to ``patch --merge``
1977 will use the ``patch`` program with its 2-way merge option.
1977 will use the ``patch`` program with its 2-way merge option.
1978
1978
1979 ``portablefilenames``
1979 ``portablefilenames``
1980 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
1980 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
1981 (default: ``warn``)
1981 (default: ``warn``)
1982
1982
1983 ``warn``
1983 ``warn``
1984 Print a warning message on POSIX platforms, if a file with a non-portable
1984 Print a warning message on POSIX platforms, if a file with a non-portable
1985 filename is added (e.g. a file with a name that can't be created on
1985 filename is added (e.g. a file with a name that can't be created on
1986 Windows because it contains reserved parts like ``AUX``, reserved
1986 Windows because it contains reserved parts like ``AUX``, reserved
1987 characters like ``:``, or would cause a case collision with an existing
1987 characters like ``:``, or would cause a case collision with an existing
1988 file).
1988 file).
1989
1989
1990 ``ignore``
1990 ``ignore``
1991 Don't print a warning.
1991 Don't print a warning.
1992
1992
1993 ``abort``
1993 ``abort``
1994 The command is aborted.
1994 The command is aborted.
1995
1995
1996 ``true``
1996 ``true``
1997 Alias for ``warn``.
1997 Alias for ``warn``.
1998
1998
1999 ``false``
1999 ``false``
2000 Alias for ``ignore``.
2000 Alias for ``ignore``.
2001
2001
2002 .. container:: windows
2002 .. container:: windows
2003
2003
2004 On Windows, this configuration option is ignored and the command aborted.
2004 On Windows, this configuration option is ignored and the command aborted.
2005
2005
2006 ``quiet``
2006 ``quiet``
2007 Reduce the amount of output printed.
2007 Reduce the amount of output printed.
2008 (default: False)
2008 (default: False)
2009
2009
2010 ``remotecmd``
2010 ``remotecmd``
2011 Remote command to use for clone/push/pull operations.
2011 Remote command to use for clone/push/pull operations.
2012 (default: ``hg``)
2012 (default: ``hg``)
2013
2013
2014 ``report_untrusted``
2014 ``report_untrusted``
2015 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
2015 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
2016 trusted user or group.
2016 trusted user or group.
2017 (default: True)
2017 (default: True)
2018
2018
2019 ``slash``
2019 ``slash``
2020 Display paths using a slash (``/``) as the path separator. This
2020 Display paths using a slash (``/``) as the path separator. This
2021 only makes a difference on systems where the default path
2021 only makes a difference on systems where the default path
2022 separator is not the slash character (e.g. Windows uses the
2022 separator is not the slash character (e.g. Windows uses the
2023 backslash character (``\``)).
2023 backslash character (``\``)).
2024 (default: False)
2024 (default: False)
2025
2025
2026 ``statuscopies``
2026 ``statuscopies``
2027 Display copies in the status command.
2027 Display copies in the status command.
2028
2028
2029 ``ssh``
2029 ``ssh``
2030 Command to use for SSH connections. (default: ``ssh``)
2030 Command to use for SSH connections. (default: ``ssh``)
2031
2031
2032 ``strict``
2032 ``strict``
2033 Require exact command names, instead of allowing unambiguous
2033 Require exact command names, instead of allowing unambiguous
2034 abbreviations. (default: False)
2034 abbreviations. (default: False)
2035
2035
2036 ``style``
2036 ``style``
2037 Name of style to use for command output.
2037 Name of style to use for command output.
2038
2038
2039 ``supportcontact``
2039 ``supportcontact``
2040 A URL where users should report a Mercurial traceback. Use this if you are a
2040 A URL where users should report a Mercurial traceback. Use this if you are a
2041 large organisation with its own Mercurial deployment process and crash
2041 large organisation with its own Mercurial deployment process and crash
2042 reports should be addressed to your internal support.
2042 reports should be addressed to your internal support.
2043
2043
2044 ``textwidth``
2044 ``textwidth``
2045 Maximum width of help text. A longer line generated by ``hg help`` or
2045 Maximum width of help text. A longer line generated by ``hg help`` or
2046 ``hg subcommand --help`` will be broken after white space to get this
2046 ``hg subcommand --help`` will be broken after white space to get this
2047 width or the terminal width, whichever comes first.
2047 width or the terminal width, whichever comes first.
2048 A non-positive value will disable this and the terminal width will be
2048 A non-positive value will disable this and the terminal width will be
2049 used. (default: 78)
2049 used. (default: 78)
2050
2050
2051 ``timeout``
2051 ``timeout``
2052 The timeout used when a lock is held (in seconds), a negative value
2052 The timeout used when a lock is held (in seconds), a negative value
2053 means no timeout. (default: 600)
2053 means no timeout. (default: 600)
2054
2054
2055 ``traceback``
2055 ``traceback``
2056 Mercurial always prints a traceback when an unknown exception
2056 Mercurial always prints a traceback when an unknown exception
2057 occurs. Setting this to True will make Mercurial print a traceback
2057 occurs. Setting this to True will make Mercurial print a traceback
2058 on all exceptions, even those recognized by Mercurial (such as
2058 on all exceptions, even those recognized by Mercurial (such as
2059 IOError or MemoryError). (default: False)
2059 IOError or MemoryError). (default: False)
2060
2060
2061 ``username``
2061 ``username``
2062 The committer of a changeset created when running "commit".
2062 The committer of a changeset created when running "commit".
2063 Typically a person's name and email address, e.g. ``Fred Widget
2063 Typically a person's name and email address, e.g. ``Fred Widget
2064 <fred@example.com>``. Environment variables in the
2064 <fred@example.com>``. Environment variables in the
2065 username are expanded.
2065 username are expanded.
2066
2066
2067 (default: ``$EMAIL`` or ``username@hostname``. If the username in
2067 (default: ``$EMAIL`` or ``username@hostname``. If the username in
2068 hgrc is empty, e.g. if the system admin set ``username =`` in the
2068 hgrc is empty, e.g. if the system admin set ``username =`` in the
2069 system hgrc, it has to be specified manually or in a different
2069 system hgrc, it has to be specified manually or in a different
2070 hgrc file)
2070 hgrc file)
2071
2071
2072 ``verbose``
2072 ``verbose``
2073 Increase the amount of output printed. (default: False)
2073 Increase the amount of output printed. (default: False)
2074
2074
2075
2075
2076 ``web``
2076 ``web``
2077 -------
2077 -------
2078
2078
2079 Web interface configuration. The settings in this section apply to
2079 Web interface configuration. The settings in this section apply to
2080 both the builtin webserver (started by :hg:`serve`) and the script you
2080 both the builtin webserver (started by :hg:`serve`) and the script you
2081 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
2081 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
2082 and WSGI).
2082 and WSGI).
2083
2083
2084 The Mercurial webserver does no authentication (it does not prompt for
2084 The Mercurial webserver does no authentication (it does not prompt for
2085 usernames and passwords to validate *who* users are), but it does do
2085 usernames and passwords to validate *who* users are), but it does do
2086 authorization (it grants or denies access for *authenticated users*
2086 authorization (it grants or denies access for *authenticated users*
2087 based on settings in this section). You must either configure your
2087 based on settings in this section). You must either configure your
2088 webserver to do authentication for you, or disable the authorization
2088 webserver to do authentication for you, or disable the authorization
2089 checks.
2089 checks.
2090
2090
2091 For a quick setup in a trusted environment, e.g., a private LAN, where
2091 For a quick setup in a trusted environment, e.g., a private LAN, where
2092 you want it to accept pushes from anybody, you can use the following
2092 you want it to accept pushes from anybody, you can use the following
2093 command line::
2093 command line::
2094
2094
2095 $ hg --config web.allow_push=* --config web.push_ssl=False serve
2095 $ hg --config web.allow_push=* --config web.push_ssl=False serve
2096
2096
2097 Note that this will allow anybody to push anything to the server and
2097 Note that this will allow anybody to push anything to the server and
2098 that this should not be used for public servers.
2098 that this should not be used for public servers.
2099
2099
2100 The full set of options is:
2100 The full set of options is:
2101
2101
2102 ``accesslog``
2102 ``accesslog``
2103 Where to output the access log. (default: stdout)
2103 Where to output the access log. (default: stdout)
2104
2104
2105 ``address``
2105 ``address``
2106 Interface address to bind to. (default: all)
2106 Interface address to bind to. (default: all)
2107
2107
2108 ``allow_archive``
2108 ``allow_archive``
2109 List of archive format (bz2, gz, zip) allowed for downloading.
2109 List of archive format (bz2, gz, zip) allowed for downloading.
2110 (default: empty)
2110 (default: empty)
2111
2111
2112 ``allowbz2``
2112 ``allowbz2``
2113 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
2113 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
2114 revisions.
2114 revisions.
2115 (default: False)
2115 (default: False)
2116
2116
2117 ``allowgz``
2117 ``allowgz``
2118 (DEPRECATED) Whether to allow .tar.gz downloading of repository
2118 (DEPRECATED) Whether to allow .tar.gz downloading of repository
2119 revisions.
2119 revisions.
2120 (default: False)
2120 (default: False)
2121
2121
2122 ``allowpull``
2122 ``allowpull``
2123 Whether to allow pulling from the repository. (default: True)
2123 Whether to allow pulling from the repository. (default: True)
2124
2124
2125 ``allow_push``
2125 ``allow_push``
2126 Whether to allow pushing to the repository. If empty or not set,
2126 Whether to allow pushing to the repository. If empty or not set,
2127 pushing is not allowed. If the special value ``*``, any remote
2127 pushing is not allowed. If the special value ``*``, any remote
2128 user can push, including unauthenticated users. Otherwise, the
2128 user can push, including unauthenticated users. Otherwise, the
2129 remote user must have been authenticated, and the authenticated
2129 remote user must have been authenticated, and the authenticated
2130 user name must be present in this list. The contents of the
2130 user name must be present in this list. The contents of the
2131 allow_push list are examined after the deny_push list.
2131 allow_push list are examined after the deny_push list.
2132
2132
2133 ``allow_read``
2133 ``allow_read``
2134 If the user has not already been denied repository access due to
2134 If the user has not already been denied repository access due to
2135 the contents of deny_read, this list determines whether to grant
2135 the contents of deny_read, this list determines whether to grant
2136 repository access to the user. If this list is not empty, and the
2136 repository access to the user. If this list is not empty, and the
2137 user is unauthenticated or not present in the list, then access is
2137 user is unauthenticated or not present in the list, then access is
2138 denied for the user. If the list is empty or not set, then access
2138 denied for the user. If the list is empty or not set, then access
2139 is permitted to all users by default. Setting allow_read to the
2139 is permitted to all users by default. Setting allow_read to the
2140 special value ``*`` is equivalent to it not being set (i.e. access
2140 special value ``*`` is equivalent to it not being set (i.e. access
2141 is permitted to all users). The contents of the allow_read list are
2141 is permitted to all users). The contents of the allow_read list are
2142 examined after the deny_read list.
2142 examined after the deny_read list.
2143
2143
2144 ``allowzip``
2144 ``allowzip``
2145 (DEPRECATED) Whether to allow .zip downloading of repository
2145 (DEPRECATED) Whether to allow .zip downloading of repository
2146 revisions. This feature creates temporary files.
2146 revisions. This feature creates temporary files.
2147 (default: False)
2147 (default: False)
2148
2148
2149 ``archivesubrepos``
2149 ``archivesubrepos``
2150 Whether to recurse into subrepositories when archiving.
2150 Whether to recurse into subrepositories when archiving.
2151 (default: False)
2151 (default: False)
2152
2152
2153 ``baseurl``
2153 ``baseurl``
2154 Base URL to use when publishing URLs in other locations, so
2154 Base URL to use when publishing URLs in other locations, so
2155 third-party tools like email notification hooks can construct
2155 third-party tools like email notification hooks can construct
2156 URLs. Example: ``http://hgserver/repos/``.
2156 URLs. Example: ``http://hgserver/repos/``.
2157
2157
2158 ``cacerts``
2158 ``cacerts``
2159 Path to file containing a list of PEM encoded certificate
2159 Path to file containing a list of PEM encoded certificate
2160 authority certificates. Environment variables and ``~user``
2160 authority certificates. Environment variables and ``~user``
2161 constructs are expanded in the filename. If specified on the
2161 constructs are expanded in the filename. If specified on the
2162 client, then it will verify the identity of remote HTTPS servers
2162 client, then it will verify the identity of remote HTTPS servers
2163 with these certificates.
2163 with these certificates.
2164
2164
2165 To disable SSL verification temporarily, specify ``--insecure`` from
2165 To disable SSL verification temporarily, specify ``--insecure`` from
2166 command line.
2166 command line.
2167
2167
2168 You can use OpenSSL's CA certificate file if your platform has
2168 You can use OpenSSL's CA certificate file if your platform has
2169 one. On most Linux systems this will be
2169 one. On most Linux systems this will be
2170 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
2170 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
2171 generate this file manually. The form must be as follows::
2171 generate this file manually. The form must be as follows::
2172
2172
2173 -----BEGIN CERTIFICATE-----
2173 -----BEGIN CERTIFICATE-----
2174 ... (certificate in base64 PEM encoding) ...
2174 ... (certificate in base64 PEM encoding) ...
2175 -----END CERTIFICATE-----
2175 -----END CERTIFICATE-----
2176 -----BEGIN CERTIFICATE-----
2176 -----BEGIN CERTIFICATE-----
2177 ... (certificate in base64 PEM encoding) ...
2177 ... (certificate in base64 PEM encoding) ...
2178 -----END CERTIFICATE-----
2178 -----END CERTIFICATE-----
2179
2179
2180 ``cache``
2180 ``cache``
2181 Whether to support caching in hgweb. (default: True)
2181 Whether to support caching in hgweb. (default: True)
2182
2182
2183 ``certificate``
2183 ``certificate``
2184 Certificate to use when running :hg:`serve`.
2184 Certificate to use when running :hg:`serve`.
2185
2185
2186 ``collapse``
2186 ``collapse``
2187 With ``descend`` enabled, repositories in subdirectories are shown at
2187 With ``descend`` enabled, repositories in subdirectories are shown at
2188 a single level alongside repositories in the current path. With
2188 a single level alongside repositories in the current path. With
2189 ``collapse`` also enabled, repositories residing at a deeper level than
2189 ``collapse`` also enabled, repositories residing at a deeper level than
2190 the current path are grouped behind navigable directory entries that
2190 the current path are grouped behind navigable directory entries that
2191 lead to the locations of these repositories. In effect, this setting
2191 lead to the locations of these repositories. In effect, this setting
2192 collapses each collection of repositories found within a subdirectory
2192 collapses each collection of repositories found within a subdirectory
2193 into a single entry for that subdirectory. (default: False)
2193 into a single entry for that subdirectory. (default: False)
2194
2194
2195 ``comparisoncontext``
2195 ``comparisoncontext``
2196 Number of lines of context to show in side-by-side file comparison. If
2196 Number of lines of context to show in side-by-side file comparison. If
2197 negative or the value ``full``, whole files are shown. (default: 5)
2197 negative or the value ``full``, whole files are shown. (default: 5)
2198
2198
2199 This setting can be overridden by a ``context`` request parameter to the
2199 This setting can be overridden by a ``context`` request parameter to the
2200 ``comparison`` command, taking the same values.
2200 ``comparison`` command, taking the same values.
2201
2201
2202 ``contact``
2202 ``contact``
2203 Name or email address of the person in charge of the repository.
2203 Name or email address of the person in charge of the repository.
2204 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
2204 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
2205
2205
2206 ``csp``
2206 ``csp``
2207 Send a ``Content-Security-Policy`` HTTP header with this value.
2207 Send a ``Content-Security-Policy`` HTTP header with this value.
2208
2208
2209 The value may contain a special string ``%nonce%``, which will be replaced
2209 The value may contain a special string ``%nonce%``, which will be replaced
2210 by a randomly-generated one-time use value. If the value contains
2210 by a randomly-generated one-time use value. If the value contains
2211 ``%nonce%``, ``web.cache`` will be disabled, as caching undermines the
2211 ``%nonce%``, ``web.cache`` will be disabled, as caching undermines the
2212 one-time property of the nonce. This nonce will also be inserted into
2212 one-time property of the nonce. This nonce will also be inserted into
2213 ``<script>`` elements containing inline JavaScript.
2213 ``<script>`` elements containing inline JavaScript.
2214
2214
2215 Note: lots of HTML content sent by the server is derived from repository
2215 Note: lots of HTML content sent by the server is derived from repository
2216 data. Please consider the potential for malicious repository data to
2216 data. Please consider the potential for malicious repository data to
2217 "inject" itself into generated HTML content as part of your security
2217 "inject" itself into generated HTML content as part of your security
2218 threat model.
2218 threat model.
2219
2219
2220 ``deny_push``
2220 ``deny_push``
2221 Whether to deny pushing to the repository. If empty or not set,
2221 Whether to deny pushing to the repository. If empty or not set,
2222 push is not denied. If the special value ``*``, all remote users are
2222 push is not denied. If the special value ``*``, all remote users are
2223 denied push. Otherwise, unauthenticated users are all denied, and
2223 denied push. Otherwise, unauthenticated users are all denied, and
2224 any authenticated user name present in this list is also denied. The
2224 any authenticated user name present in this list is also denied. The
2225 contents of the deny_push list are examined before the allow_push list.
2225 contents of the deny_push list are examined before the allow_push list.
2226
2226
2227 ``deny_read``
2227 ``deny_read``
2228 Whether to deny reading/viewing of the repository. If this list is
2228 Whether to deny reading/viewing of the repository. If this list is
2229 not empty, unauthenticated users are all denied, and any
2229 not empty, unauthenticated users are all denied, and any
2230 authenticated user name present in this list is also denied access to
2230 authenticated user name present in this list is also denied access to
2231 the repository. If set to the special value ``*``, all remote users
2231 the repository. If set to the special value ``*``, all remote users
2232 are denied access (rarely needed ;). If deny_read is empty or not set,
2232 are denied access (rarely needed ;). If deny_read is empty or not set,
2233 the determination of repository access depends on the presence and
2233 the determination of repository access depends on the presence and
2234 content of the allow_read list (see description). If both
2234 content of the allow_read list (see description). If both
2235 deny_read and allow_read are empty or not set, then access is
2235 deny_read and allow_read are empty or not set, then access is
2236 permitted to all users by default. If the repository is being
2236 permitted to all users by default. If the repository is being
2237 served via hgwebdir, denied users will not be able to see it in
2237 served via hgwebdir, denied users will not be able to see it in
2238 the list of repositories. The contents of the deny_read list have
2238 the list of repositories. The contents of the deny_read list have
2239 priority over (are examined before) the contents of the allow_read
2239 priority over (are examined before) the contents of the allow_read
2240 list.
2240 list.
2241
2241
2242 ``descend``
2242 ``descend``
2243 hgwebdir indexes will not descend into subdirectories. Only repositories
2243 hgwebdir indexes will not descend into subdirectories. Only repositories
2244 directly in the current path will be shown (other repositories are still
2244 directly in the current path will be shown (other repositories are still
2245 available from the index corresponding to their containing path).
2245 available from the index corresponding to their containing path).
2246
2246
2247 ``description``
2247 ``description``
2248 Textual description of the repository's purpose or contents.
2248 Textual description of the repository's purpose or contents.
2249 (default: "unknown")
2249 (default: "unknown")
2250
2250
2251 ``encoding``
2251 ``encoding``
2252 Character encoding name. (default: the current locale charset)
2252 Character encoding name. (default: the current locale charset)
2253 Example: "UTF-8".
2253 Example: "UTF-8".
2254
2254
2255 ``errorlog``
2255 ``errorlog``
2256 Where to output the error log. (default: stderr)
2256 Where to output the error log. (default: stderr)
2257
2257
2258 ``guessmime``
2258 ``guessmime``
2259 Control MIME types for raw download of file content.
2259 Control MIME types for raw download of file content.
2260 Set to True to let hgweb guess the content type from the file
2260 Set to True to let hgweb guess the content type from the file
2261 extension. This will serve HTML files as ``text/html`` and might
2261 extension. This will serve HTML files as ``text/html`` and might
2262 allow cross-site scripting attacks when serving untrusted
2262 allow cross-site scripting attacks when serving untrusted
2263 repositories. (default: False)
2263 repositories. (default: False)
2264
2264
2265 ``hidden``
2265 ``hidden``
2266 Whether to hide the repository in the hgwebdir index.
2266 Whether to hide the repository in the hgwebdir index.
2267 (default: False)
2267 (default: False)
2268
2268
2269 ``ipv6``
2269 ``ipv6``
2270 Whether to use IPv6. (default: False)
2270 Whether to use IPv6. (default: False)
2271
2271
2272 ``labels``
2272 ``labels``
2273 List of string *labels* associated with the repository.
2273 List of string *labels* associated with the repository.
2274
2274
2275 Labels are exposed as a template keyword and can be used to customize
2275 Labels are exposed as a template keyword and can be used to customize
2276 output. e.g. the ``index`` template can group or filter repositories
2276 output. e.g. the ``index`` template can group or filter repositories
2277 by labels and the ``summary`` template can display additional content
2277 by labels and the ``summary`` template can display additional content
2278 if a specific label is present.
2278 if a specific label is present.
2279
2279
2280 ``logoimg``
2280 ``logoimg``
2281 File name of the logo image that some templates display on each page.
2281 File name of the logo image that some templates display on each page.
2282 The file name is relative to ``staticurl``. That is, the full path to
2282 The file name is relative to ``staticurl``. That is, the full path to
2283 the logo image is "staticurl/logoimg".
2283 the logo image is "staticurl/logoimg".
2284 If unset, ``hglogo.png`` will be used.
2284 If unset, ``hglogo.png`` will be used.
2285
2285
2286 ``logourl``
2286 ``logourl``
2287 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
2287 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
2288 will be used.
2288 will be used.
2289
2289
2290 ``maxchanges``
2290 ``maxchanges``
2291 Maximum number of changes to list on the changelog. (default: 10)
2291 Maximum number of changes to list on the changelog. (default: 10)
2292
2292
2293 ``maxfiles``
2293 ``maxfiles``
2294 Maximum number of files to list per changeset. (default: 10)
2294 Maximum number of files to list per changeset. (default: 10)
2295
2295
2296 ``maxshortchanges``
2296 ``maxshortchanges``
2297 Maximum number of changes to list on the shortlog, graph or filelog
2297 Maximum number of changes to list on the shortlog, graph or filelog
2298 pages. (default: 60)
2298 pages. (default: 60)
2299
2299
2300 ``name``
2300 ``name``
2301 Repository name to use in the web interface.
2301 Repository name to use in the web interface.
2302 (default: current working directory)
2302 (default: current working directory)
2303
2303
2304 ``port``
2304 ``port``
2305 Port to listen on. (default: 8000)
2305 Port to listen on. (default: 8000)
2306
2306
2307 ``prefix``
2307 ``prefix``
2308 Prefix path to serve from. (default: '' (server root))
2308 Prefix path to serve from. (default: '' (server root))
2309
2309
2310 ``push_ssl``
2310 ``push_ssl``
2311 Whether to require that inbound pushes be transported over SSL to
2311 Whether to require that inbound pushes be transported over SSL to
2312 prevent password sniffing. (default: True)
2312 prevent password sniffing. (default: True)
2313
2313
2314 ``refreshinterval``
2314 ``refreshinterval``
2315 How frequently directory listings re-scan the filesystem for new
2315 How frequently directory listings re-scan the filesystem for new
2316 repositories, in seconds. This is relevant when wildcards are used
2316 repositories, in seconds. This is relevant when wildcards are used
2317 to define paths. Depending on how much filesystem traversal is
2317 to define paths. Depending on how much filesystem traversal is
2318 required, refreshing may negatively impact performance.
2318 required, refreshing may negatively impact performance.
2319
2319
2320 Values less than or equal to 0 always refresh.
2320 Values less than or equal to 0 always refresh.
2321 (default: 20)
2321 (default: 20)
2322
2322
2323 ``staticurl``
2323 ``staticurl``
2324 Base URL to use for static files. If unset, static files (e.g. the
2324 Base URL to use for static files. If unset, static files (e.g. the
2325 hgicon.png favicon) will be served by the CGI script itself. Use
2325 hgicon.png favicon) will be served by the CGI script itself. Use
2326 this setting to serve them directly with the HTTP server.
2326 this setting to serve them directly with the HTTP server.
2327 Example: ``http://hgserver/static/``.
2327 Example: ``http://hgserver/static/``.
2328
2328
2329 ``stripes``
2329 ``stripes``
2330 How many lines a "zebra stripe" should span in multi-line output.
2330 How many lines a "zebra stripe" should span in multi-line output.
2331 Set to 0 to disable. (default: 1)
2331 Set to 0 to disable. (default: 1)
2332
2332
2333 ``style``
2333 ``style``
2334 Which template map style to use. The available options are the names of
2334 Which template map style to use. The available options are the names of
2335 subdirectories in the HTML templates path. (default: ``paper``)
2335 subdirectories in the HTML templates path. (default: ``paper``)
2336 Example: ``monoblue``.
2336 Example: ``monoblue``.
2337
2337
2338 ``templates``
2338 ``templates``
2339 Where to find the HTML templates. The default path to the HTML templates
2339 Where to find the HTML templates. The default path to the HTML templates
2340 can be obtained from ``hg debuginstall``.
2340 can be obtained from ``hg debuginstall``.
2341
2341
2342 ``websub``
2342 ``websub``
2343 ----------
2343 ----------
2344
2344
2345 Web substitution filter definition. You can use this section to
2345 Web substitution filter definition. You can use this section to
2346 define a set of regular expression substitution patterns which
2346 define a set of regular expression substitution patterns which
2347 let you automatically modify the hgweb server output.
2347 let you automatically modify the hgweb server output.
2348
2348
2349 The default hgweb templates only apply these substitution patterns
2349 The default hgweb templates only apply these substitution patterns
2350 on the revision description fields. You can apply them anywhere
2350 on the revision description fields. You can apply them anywhere
2351 you want when you create your own templates by adding calls to the
2351 you want when you create your own templates by adding calls to the
2352 "websub" filter (usually after calling the "escape" filter).
2352 "websub" filter (usually after calling the "escape" filter).
2353
2353
2354 This can be used, for example, to convert issue references to links
2354 This can be used, for example, to convert issue references to links
2355 to your issue tracker, or to convert "markdown-like" syntax into
2355 to your issue tracker, or to convert "markdown-like" syntax into
2356 HTML (see the examples below).
2356 HTML (see the examples below).
2357
2357
2358 Each entry in this section names a substitution filter.
2358 Each entry in this section names a substitution filter.
2359 The value of each entry defines the substitution expression itself.
2359 The value of each entry defines the substitution expression itself.
2360 The websub expressions follow the old interhg extension syntax,
2360 The websub expressions follow the old interhg extension syntax,
2361 which in turn imitates the Unix sed replacement syntax::
2361 which in turn imitates the Unix sed replacement syntax::
2362
2362
2363 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
2363 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
2364
2364
2365 You can use any separator other than "/". The final "i" is optional
2365 You can use any separator other than "/". The final "i" is optional
2366 and indicates that the search must be case insensitive.
2366 and indicates that the search must be case insensitive.
2367
2367
2368 Examples::
2368 Examples::
2369
2369
2370 [websub]
2370 [websub]
2371 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
2371 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
2372 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
2372 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
2373 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
2373 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
2374
2374
2375 ``worker``
2375 ``worker``
2376 ----------
2376 ----------
2377
2377
2378 Parallel master/worker configuration. We currently perform working
2378 Parallel master/worker configuration. We currently perform working
2379 directory updates in parallel on Unix-like systems, which greatly
2379 directory updates in parallel on Unix-like systems, which greatly
2380 helps performance.
2380 helps performance.
2381
2381
2382 ``numcpus``
2382 ``numcpus``
2383 Number of CPUs to use for parallel operations. A zero or
2383 Number of CPUs to use for parallel operations. A zero or
2384 negative value is treated as ``use the default``.
2384 negative value is treated as ``use the default``.
2385 (default: 4 or the number of CPUs on the system, whichever is larger)
2385 (default: 4 or the number of CPUs on the system, whichever is larger)
2386
2386
2387 ``backgroundclose``
2387 ``backgroundclose``
2388 Whether to enable closing file handles on background threads during certain
2388 Whether to enable closing file handles on background threads during certain
2389 operations. Some platforms aren't very efficient at closing file
2389 operations. Some platforms aren't very efficient at closing file
2390 handles that have been written or appended to. By performing file closing
2390 handles that have been written or appended to. By performing file closing
2391 on background threads, file write rate can increase substantially.
2391 on background threads, file write rate can increase substantially.
2392 (default: true on Windows, false elsewhere)
2392 (default: true on Windows, false elsewhere)
2393
2393
2394 ``backgroundcloseminfilecount``
2394 ``backgroundcloseminfilecount``
2395 Minimum number of files required to trigger background file closing.
2395 Minimum number of files required to trigger background file closing.
2396 Operations not writing this many files won't start background close
2396 Operations not writing this many files won't start background close
2397 threads.
2397 threads.
2398 (default: 2048)
2398 (default: 2048)
2399
2399
2400 ``backgroundclosemaxqueue``
2400 ``backgroundclosemaxqueue``
2401 The maximum number of opened file handles waiting to be closed in the
2401 The maximum number of opened file handles waiting to be closed in the
2402 background. This option only has an effect if ``backgroundclose`` is
2402 background. This option only has an effect if ``backgroundclose`` is
2403 enabled.
2403 enabled.
2404 (default: 384)
2404 (default: 384)
2405
2405
2406 ``backgroundclosethreadcount``
2406 ``backgroundclosethreadcount``
2407 Number of threads to process background file closes. Only relevant if
2407 Number of threads to process background file closes. Only relevant if
2408 ``backgroundclose`` is enabled.
2408 ``backgroundclose`` is enabled.
2409 (default: 4)
2409 (default: 4)
@@ -1,244 +1,260 b''
1 Setup
1 Setup
2
2
3 $ cat <<EOF >> $HGRCPATH
3 $ cat <<EOF >> $HGRCPATH
4 > [ui]
4 > [ui]
5 > color = always
5 > color = yes
6 > formatted = always
6 > formatted = always
7 > [color]
7 > [color]
8 > mode = ansi
8 > mode = ansi
9 > EOF
9 > EOF
10 $ hg init repo
10 $ hg init repo
11 $ cd repo
11 $ cd repo
12 $ cat > a <<EOF
12 $ cat > a <<EOF
13 > c
13 > c
14 > c
14 > c
15 > a
15 > a
16 > a
16 > a
17 > b
17 > b
18 > a
18 > a
19 > a
19 > a
20 > c
20 > c
21 > c
21 > c
22 > EOF
22 > EOF
23 $ hg ci -Am adda
23 $ hg ci -Am adda
24 adding a
24 adding a
25 $ cat > a <<EOF
25 $ cat > a <<EOF
26 > c
26 > c
27 > c
27 > c
28 > a
28 > a
29 > a
29 > a
30 > dd
30 > dd
31 > a
31 > a
32 > a
32 > a
33 > c
33 > c
34 > c
34 > c
35 > EOF
35 > EOF
36
36
37 default context
37 default context
38
38
39 $ hg diff --nodates
39 $ hg diff --nodates
40 \x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
40 \x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
41 \x1b[0;31;1m--- a/a\x1b[0m (esc)
41 \x1b[0;31;1m--- a/a\x1b[0m (esc)
42 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
42 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
43 \x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
43 \x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
44 c
44 c
45 a
45 a
46 a
46 a
47 \x1b[0;31m-b\x1b[0m (esc)
47 \x1b[0;31m-b\x1b[0m (esc)
48 \x1b[0;32m+dd\x1b[0m (esc)
48 \x1b[0;32m+dd\x1b[0m (esc)
49 a
49 a
50 a
50 a
51 c
51 c
52
52
53 (check that 'ui.color=yes' match '--color=auto')
53 (check that 'ui.color=yes' match '--color=auto')
54
54
55 $ hg diff --nodates --config ui.formatted=no
55 $ hg diff --nodates --config ui.formatted=no
56 diff -r cf9f4ba66af2 a
56 diff -r cf9f4ba66af2 a
57 --- a/a
57 --- a/a
58 +++ b/a
58 +++ b/a
59 @@ -2,7 +2,7 @@
59 @@ -2,7 +2,7 @@
60 c
60 c
61 a
61 a
62 a
62 a
63 -b
63 -b
64 +dd
64 +dd
65 a
65 a
66 a
66 a
67 c
67 c
68
68
69 (check that 'ui.color=no' disable color)
69 (check that 'ui.color=no' disable color)
70
70
71 $ hg diff --nodates --config ui.formatted=yes --config ui.color=no
71 $ hg diff --nodates --config ui.formatted=yes --config ui.color=no
72 diff -r cf9f4ba66af2 a
72 diff -r cf9f4ba66af2 a
73 --- a/a
73 --- a/a
74 +++ b/a
74 +++ b/a
75 @@ -2,7 +2,7 @@
75 @@ -2,7 +2,7 @@
76 c
76 c
77 a
77 a
78 a
78 a
79 -b
79 -b
80 +dd
80 +dd
81 a
81 a
82 a
82 a
83 c
83 c
84
84
85 (check that 'ui.color=always' force color)
86
87 $ hg diff --nodates --config ui.formatted=no --config ui.color=always
88 \x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
89 \x1b[0;31;1m--- a/a\x1b[0m (esc)
90 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
91 \x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
92 c
93 a
94 a
95 \x1b[0;31m-b\x1b[0m (esc)
96 \x1b[0;32m+dd\x1b[0m (esc)
97 a
98 a
99 c
100
85 --unified=2
101 --unified=2
86
102
87 $ hg diff --nodates -U 2
103 $ hg diff --nodates -U 2
88 \x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
104 \x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
89 \x1b[0;31;1m--- a/a\x1b[0m (esc)
105 \x1b[0;31;1m--- a/a\x1b[0m (esc)
90 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
106 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
91 \x1b[0;35m@@ -3,5 +3,5 @@\x1b[0m (esc)
107 \x1b[0;35m@@ -3,5 +3,5 @@\x1b[0m (esc)
92 a
108 a
93 a
109 a
94 \x1b[0;31m-b\x1b[0m (esc)
110 \x1b[0;31m-b\x1b[0m (esc)
95 \x1b[0;32m+dd\x1b[0m (esc)
111 \x1b[0;32m+dd\x1b[0m (esc)
96 a
112 a
97 a
113 a
98
114
99 diffstat
115 diffstat
100
116
101 $ hg diff --stat
117 $ hg diff --stat
102 a | 2 \x1b[0;32m+\x1b[0m\x1b[0;31m-\x1b[0m (esc)
118 a | 2 \x1b[0;32m+\x1b[0m\x1b[0;31m-\x1b[0m (esc)
103 1 files changed, 1 insertions(+), 1 deletions(-)
119 1 files changed, 1 insertions(+), 1 deletions(-)
104 $ cat <<EOF >> $HGRCPATH
120 $ cat <<EOF >> $HGRCPATH
105 > [extensions]
121 > [extensions]
106 > record =
122 > record =
107 > [ui]
123 > [ui]
108 > interactive = true
124 > interactive = true
109 > [diff]
125 > [diff]
110 > git = True
126 > git = True
111 > EOF
127 > EOF
112
128
113 #if execbit
129 #if execbit
114
130
115 record
131 record
116
132
117 $ chmod +x a
133 $ chmod +x a
118 $ hg record -m moda a <<EOF
134 $ hg record -m moda a <<EOF
119 > y
135 > y
120 > y
136 > y
121 > EOF
137 > EOF
122 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
138 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
123 \x1b[0;36;1mold mode 100644\x1b[0m (esc)
139 \x1b[0;36;1mold mode 100644\x1b[0m (esc)
124 \x1b[0;36;1mnew mode 100755\x1b[0m (esc)
140 \x1b[0;36;1mnew mode 100755\x1b[0m (esc)
125 1 hunks, 1 lines changed
141 1 hunks, 1 lines changed
126 \x1b[0;33mexamine changes to 'a'? [Ynesfdaq?]\x1b[0m y (esc)
142 \x1b[0;33mexamine changes to 'a'? [Ynesfdaq?]\x1b[0m y (esc)
127
143
128 \x1b[0;35m@@ -2,7 +2,7 @@ c\x1b[0m (esc)
144 \x1b[0;35m@@ -2,7 +2,7 @@ c\x1b[0m (esc)
129 c
145 c
130 a
146 a
131 a
147 a
132 \x1b[0;31m-b\x1b[0m (esc)
148 \x1b[0;31m-b\x1b[0m (esc)
133 \x1b[0;32m+dd\x1b[0m (esc)
149 \x1b[0;32m+dd\x1b[0m (esc)
134 a
150 a
135 a
151 a
136 c
152 c
137 \x1b[0;33mrecord this change to 'a'? [Ynesfdaq?]\x1b[0m y (esc)
153 \x1b[0;33mrecord this change to 'a'? [Ynesfdaq?]\x1b[0m y (esc)
138
154
139
155
140 $ echo "[extensions]" >> $HGRCPATH
156 $ echo "[extensions]" >> $HGRCPATH
141 $ echo "mq=" >> $HGRCPATH
157 $ echo "mq=" >> $HGRCPATH
142 $ hg rollback
158 $ hg rollback
143 repository tip rolled back to revision 0 (undo commit)
159 repository tip rolled back to revision 0 (undo commit)
144 working directory now based on revision 0
160 working directory now based on revision 0
145
161
146 qrecord
162 qrecord
147
163
148 $ hg qrecord -m moda patch <<EOF
164 $ hg qrecord -m moda patch <<EOF
149 > y
165 > y
150 > y
166 > y
151 > EOF
167 > EOF
152 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
168 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
153 \x1b[0;36;1mold mode 100644\x1b[0m (esc)
169 \x1b[0;36;1mold mode 100644\x1b[0m (esc)
154 \x1b[0;36;1mnew mode 100755\x1b[0m (esc)
170 \x1b[0;36;1mnew mode 100755\x1b[0m (esc)
155 1 hunks, 1 lines changed
171 1 hunks, 1 lines changed
156 \x1b[0;33mexamine changes to 'a'? [Ynesfdaq?]\x1b[0m y (esc)
172 \x1b[0;33mexamine changes to 'a'? [Ynesfdaq?]\x1b[0m y (esc)
157
173
158 \x1b[0;35m@@ -2,7 +2,7 @@ c\x1b[0m (esc)
174 \x1b[0;35m@@ -2,7 +2,7 @@ c\x1b[0m (esc)
159 c
175 c
160 a
176 a
161 a
177 a
162 \x1b[0;31m-b\x1b[0m (esc)
178 \x1b[0;31m-b\x1b[0m (esc)
163 \x1b[0;32m+dd\x1b[0m (esc)
179 \x1b[0;32m+dd\x1b[0m (esc)
164 a
180 a
165 a
181 a
166 c
182 c
167 \x1b[0;33mrecord this change to 'a'? [Ynesfdaq?]\x1b[0m y (esc)
183 \x1b[0;33mrecord this change to 'a'? [Ynesfdaq?]\x1b[0m y (esc)
168
184
169
185
170 $ hg qpop -a
186 $ hg qpop -a
171 popping patch
187 popping patch
172 patch queue now empty
188 patch queue now empty
173
189
174 #endif
190 #endif
175
191
176 issue3712: test colorization of subrepo diff
192 issue3712: test colorization of subrepo diff
177
193
178 $ hg init sub
194 $ hg init sub
179 $ echo b > sub/b
195 $ echo b > sub/b
180 $ hg -R sub commit -Am 'create sub'
196 $ hg -R sub commit -Am 'create sub'
181 adding b
197 adding b
182 $ echo 'sub = sub' > .hgsub
198 $ echo 'sub = sub' > .hgsub
183 $ hg add .hgsub
199 $ hg add .hgsub
184 $ hg commit -m 'add subrepo sub'
200 $ hg commit -m 'add subrepo sub'
185 $ echo aa >> a
201 $ echo aa >> a
186 $ echo bb >> sub/b
202 $ echo bb >> sub/b
187
203
188 $ hg diff -S
204 $ hg diff -S
189 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
205 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
190 \x1b[0;31;1m--- a/a\x1b[0m (esc)
206 \x1b[0;31;1m--- a/a\x1b[0m (esc)
191 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
207 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
192 \x1b[0;35m@@ -7,3 +7,4 @@\x1b[0m (esc)
208 \x1b[0;35m@@ -7,3 +7,4 @@\x1b[0m (esc)
193 a
209 a
194 c
210 c
195 c
211 c
196 \x1b[0;32m+aa\x1b[0m (esc)
212 \x1b[0;32m+aa\x1b[0m (esc)
197 \x1b[0;1mdiff --git a/sub/b b/sub/b\x1b[0m (esc)
213 \x1b[0;1mdiff --git a/sub/b b/sub/b\x1b[0m (esc)
198 \x1b[0;31;1m--- a/sub/b\x1b[0m (esc)
214 \x1b[0;31;1m--- a/sub/b\x1b[0m (esc)
199 \x1b[0;32;1m+++ b/sub/b\x1b[0m (esc)
215 \x1b[0;32;1m+++ b/sub/b\x1b[0m (esc)
200 \x1b[0;35m@@ -1,1 +1,2 @@\x1b[0m (esc)
216 \x1b[0;35m@@ -1,1 +1,2 @@\x1b[0m (esc)
201 b
217 b
202 \x1b[0;32m+bb\x1b[0m (esc)
218 \x1b[0;32m+bb\x1b[0m (esc)
203
219
204 test tabs
220 test tabs
205
221
206 $ cat >> a <<EOF
222 $ cat >> a <<EOF
207 > one tab
223 > one tab
208 > two tabs
224 > two tabs
209 > end tab
225 > end tab
210 > mid tab
226 > mid tab
211 > all tabs
227 > all tabs
212 > EOF
228 > EOF
213 $ hg diff --nodates
229 $ hg diff --nodates
214 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
230 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
215 \x1b[0;31;1m--- a/a\x1b[0m (esc)
231 \x1b[0;31;1m--- a/a\x1b[0m (esc)
216 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
232 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
217 \x1b[0;35m@@ -7,3 +7,9 @@\x1b[0m (esc)
233 \x1b[0;35m@@ -7,3 +7,9 @@\x1b[0m (esc)
218 a
234 a
219 c
235 c
220 c
236 c
221 \x1b[0;32m+aa\x1b[0m (esc)
237 \x1b[0;32m+aa\x1b[0m (esc)
222 \x1b[0;32m+\x1b[0m \x1b[0;32mone tab\x1b[0m (esc)
238 \x1b[0;32m+\x1b[0m \x1b[0;32mone tab\x1b[0m (esc)
223 \x1b[0;32m+\x1b[0m \x1b[0;32mtwo tabs\x1b[0m (esc)
239 \x1b[0;32m+\x1b[0m \x1b[0;32mtwo tabs\x1b[0m (esc)
224 \x1b[0;32m+end tab\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
240 \x1b[0;32m+end tab\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
225 \x1b[0;32m+mid\x1b[0m \x1b[0;32mtab\x1b[0m (esc)
241 \x1b[0;32m+mid\x1b[0m \x1b[0;32mtab\x1b[0m (esc)
226 \x1b[0;32m+\x1b[0m \x1b[0;32mall\x1b[0m \x1b[0;32mtabs\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
242 \x1b[0;32m+\x1b[0m \x1b[0;32mall\x1b[0m \x1b[0;32mtabs\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
227 $ echo "[color]" >> $HGRCPATH
243 $ echo "[color]" >> $HGRCPATH
228 $ echo "diff.tab = bold magenta" >> $HGRCPATH
244 $ echo "diff.tab = bold magenta" >> $HGRCPATH
229 $ hg diff --nodates
245 $ hg diff --nodates
230 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
246 \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
231 \x1b[0;31;1m--- a/a\x1b[0m (esc)
247 \x1b[0;31;1m--- a/a\x1b[0m (esc)
232 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
248 \x1b[0;32;1m+++ b/a\x1b[0m (esc)
233 \x1b[0;35m@@ -7,3 +7,9 @@\x1b[0m (esc)
249 \x1b[0;35m@@ -7,3 +7,9 @@\x1b[0m (esc)
234 a
250 a
235 c
251 c
236 c
252 c
237 \x1b[0;32m+aa\x1b[0m (esc)
253 \x1b[0;32m+aa\x1b[0m (esc)
238 \x1b[0;32m+\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mone tab\x1b[0m (esc)
254 \x1b[0;32m+\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mone tab\x1b[0m (esc)
239 \x1b[0;32m+\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mtwo tabs\x1b[0m (esc)
255 \x1b[0;32m+\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mtwo tabs\x1b[0m (esc)
240 \x1b[0;32m+end tab\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
256 \x1b[0;32m+end tab\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
241 \x1b[0;32m+mid\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mtab\x1b[0m (esc)
257 \x1b[0;32m+mid\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mtab\x1b[0m (esc)
242 \x1b[0;32m+\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mall\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mtabs\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
258 \x1b[0;32m+\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mall\x1b[0m\x1b[0;1;35m \x1b[0m\x1b[0;32mtabs\x1b[0m\x1b[0;1;41m \x1b[0m (esc)
243
259
244 $ cd ..
260 $ cd ..
@@ -1,234 +1,233 b''
1 $ cat >> fakepager.py <<EOF
1 $ cat >> fakepager.py <<EOF
2 > import sys
2 > import sys
3 > for line in sys.stdin:
3 > for line in sys.stdin:
4 > sys.stdout.write('paged! %r\n' % line)
4 > sys.stdout.write('paged! %r\n' % line)
5 > EOF
5 > EOF
6
6
7 Enable ui.formatted because pager won't fire without it, and set up
7 Enable ui.formatted because pager won't fire without it, and set up
8 pager and tell it to use our fake pager that lets us see when the
8 pager and tell it to use our fake pager that lets us see when the
9 pager was running.
9 pager was running.
10 $ cat >> $HGRCPATH <<EOF
10 $ cat >> $HGRCPATH <<EOF
11 > [ui]
11 > [ui]
12 > formatted = yes
12 > formatted = yes
13 > color = no
13 > color = no
14 > [extensions]
14 > [extensions]
15 > pager=
15 > pager=
16 > [pager]
16 > [pager]
17 > pager = python $TESTTMP/fakepager.py
17 > pager = python $TESTTMP/fakepager.py
18 > EOF
18 > EOF
19
19
20 $ hg init repo
20 $ hg init repo
21 $ cd repo
21 $ cd repo
22 $ echo a >> a
22 $ echo a >> a
23 $ hg add a
23 $ hg add a
24 $ hg ci -m 'add a'
24 $ hg ci -m 'add a'
25 $ for x in `python $TESTDIR/seq.py 1 10`; do
25 $ for x in `python $TESTDIR/seq.py 1 10`; do
26 > echo a $x >> a
26 > echo a $x >> a
27 > hg ci -m "modify a $x"
27 > hg ci -m "modify a $x"
28 > done
28 > done
29
29
30 By default diff and log are paged, but summary is not:
30 By default diff and log are paged, but summary is not:
31
31
32 $ hg diff -c 2 --pager=yes
32 $ hg diff -c 2 --pager=yes
33 paged! 'diff -r f4be7687d414 -r bce265549556 a\n'
33 paged! 'diff -r f4be7687d414 -r bce265549556 a\n'
34 paged! '--- a/a\tThu Jan 01 00:00:00 1970 +0000\n'
34 paged! '--- a/a\tThu Jan 01 00:00:00 1970 +0000\n'
35 paged! '+++ b/a\tThu Jan 01 00:00:00 1970 +0000\n'
35 paged! '+++ b/a\tThu Jan 01 00:00:00 1970 +0000\n'
36 paged! '@@ -1,2 +1,3 @@\n'
36 paged! '@@ -1,2 +1,3 @@\n'
37 paged! ' a\n'
37 paged! ' a\n'
38 paged! ' a 1\n'
38 paged! ' a 1\n'
39 paged! '+a 2\n'
39 paged! '+a 2\n'
40
40
41 $ hg log --limit 2
41 $ hg log --limit 2
42 paged! 'changeset: 10:46106edeeb38\n'
42 paged! 'changeset: 10:46106edeeb38\n'
43 paged! 'tag: tip\n'
43 paged! 'tag: tip\n'
44 paged! 'user: test\n'
44 paged! 'user: test\n'
45 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
45 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
46 paged! 'summary: modify a 10\n'
46 paged! 'summary: modify a 10\n'
47 paged! '\n'
47 paged! '\n'
48 paged! 'changeset: 9:6dd8ea7dd621\n'
48 paged! 'changeset: 9:6dd8ea7dd621\n'
49 paged! 'user: test\n'
49 paged! 'user: test\n'
50 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
50 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
51 paged! 'summary: modify a 9\n'
51 paged! 'summary: modify a 9\n'
52 paged! '\n'
52 paged! '\n'
53
53
54 $ hg summary
54 $ hg summary
55 parent: 10:46106edeeb38 tip
55 parent: 10:46106edeeb38 tip
56 modify a 10
56 modify a 10
57 branch: default
57 branch: default
58 commit: (clean)
58 commit: (clean)
59 update: (current)
59 update: (current)
60 phases: 11 draft
60 phases: 11 draft
61
61
62 We can enable the pager on summary:
62 We can enable the pager on summary:
63
63
64 $ hg --config pager.attend-summary=yes summary
64 $ hg --config pager.attend-summary=yes summary
65 paged! 'parent: 10:46106edeeb38 tip\n'
65 paged! 'parent: 10:46106edeeb38 tip\n'
66 paged! ' modify a 10\n'
66 paged! ' modify a 10\n'
67 paged! 'branch: default\n'
67 paged! 'branch: default\n'
68 paged! 'commit: (clean)\n'
68 paged! 'commit: (clean)\n'
69 paged! 'update: (current)\n'
69 paged! 'update: (current)\n'
70 paged! 'phases: 11 draft\n'
70 paged! 'phases: 11 draft\n'
71
71
72 $ hg --config pager.attend-diff=no diff -c 2
72 $ hg --config pager.attend-diff=no diff -c 2
73 diff -r f4be7687d414 -r bce265549556 a
73 diff -r f4be7687d414 -r bce265549556 a
74 --- a/a Thu Jan 01 00:00:00 1970 +0000
74 --- a/a Thu Jan 01 00:00:00 1970 +0000
75 +++ b/a Thu Jan 01 00:00:00 1970 +0000
75 +++ b/a Thu Jan 01 00:00:00 1970 +0000
76 @@ -1,2 +1,3 @@
76 @@ -1,2 +1,3 @@
77 a
77 a
78 a 1
78 a 1
79 +a 2
79 +a 2
80
80
81 If we completely change the attend list that's respected:
81 If we completely change the attend list that's respected:
82 $ hg --config pager.attend=summary diff -c 2
82 $ hg --config pager.attend=summary diff -c 2
83 diff -r f4be7687d414 -r bce265549556 a
83 diff -r f4be7687d414 -r bce265549556 a
84 --- a/a Thu Jan 01 00:00:00 1970 +0000
84 --- a/a Thu Jan 01 00:00:00 1970 +0000
85 +++ b/a Thu Jan 01 00:00:00 1970 +0000
85 +++ b/a Thu Jan 01 00:00:00 1970 +0000
86 @@ -1,2 +1,3 @@
86 @@ -1,2 +1,3 @@
87 a
87 a
88 a 1
88 a 1
89 +a 2
89 +a 2
90
90
91 If 'log' is in attend, then 'history' should also be paged:
91 If 'log' is in attend, then 'history' should also be paged:
92 $ hg history --limit 2 --config pager.attend=log
92 $ hg history --limit 2 --config pager.attend=log
93 paged! 'changeset: 10:46106edeeb38\n'
93 paged! 'changeset: 10:46106edeeb38\n'
94 paged! 'tag: tip\n'
94 paged! 'tag: tip\n'
95 paged! 'user: test\n'
95 paged! 'user: test\n'
96 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
96 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
97 paged! 'summary: modify a 10\n'
97 paged! 'summary: modify a 10\n'
98 paged! '\n'
98 paged! '\n'
99 paged! 'changeset: 9:6dd8ea7dd621\n'
99 paged! 'changeset: 9:6dd8ea7dd621\n'
100 paged! 'user: test\n'
100 paged! 'user: test\n'
101 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
101 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
102 paged! 'summary: modify a 9\n'
102 paged! 'summary: modify a 9\n'
103 paged! '\n'
103 paged! '\n'
104
104
105 Possible bug: history is explicitly ignored in pager config, but
105 Possible bug: history is explicitly ignored in pager config, but
106 because log is in the attend list it still gets pager treatment.
106 because log is in the attend list it still gets pager treatment.
107
107
108 $ hg history --limit 2 --config pager.attend=log \
108 $ hg history --limit 2 --config pager.attend=log \
109 > --config pager.ignore=history
109 > --config pager.ignore=history
110 paged! 'changeset: 10:46106edeeb38\n'
110 paged! 'changeset: 10:46106edeeb38\n'
111 paged! 'tag: tip\n'
111 paged! 'tag: tip\n'
112 paged! 'user: test\n'
112 paged! 'user: test\n'
113 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
113 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
114 paged! 'summary: modify a 10\n'
114 paged! 'summary: modify a 10\n'
115 paged! '\n'
115 paged! '\n'
116 paged! 'changeset: 9:6dd8ea7dd621\n'
116 paged! 'changeset: 9:6dd8ea7dd621\n'
117 paged! 'user: test\n'
117 paged! 'user: test\n'
118 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
118 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
119 paged! 'summary: modify a 9\n'
119 paged! 'summary: modify a 9\n'
120 paged! '\n'
120 paged! '\n'
121
121
122 Possible bug: history is explicitly marked as attend-history=no, but
122 Possible bug: history is explicitly marked as attend-history=no, but
123 it doesn't fail to get paged because log is still in the attend list.
123 it doesn't fail to get paged because log is still in the attend list.
124
124
125 $ hg history --limit 2 --config pager.attend-history=no
125 $ hg history --limit 2 --config pager.attend-history=no
126 paged! 'changeset: 10:46106edeeb38\n'
126 paged! 'changeset: 10:46106edeeb38\n'
127 paged! 'tag: tip\n'
127 paged! 'tag: tip\n'
128 paged! 'user: test\n'
128 paged! 'user: test\n'
129 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
129 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
130 paged! 'summary: modify a 10\n'
130 paged! 'summary: modify a 10\n'
131 paged! '\n'
131 paged! '\n'
132 paged! 'changeset: 9:6dd8ea7dd621\n'
132 paged! 'changeset: 9:6dd8ea7dd621\n'
133 paged! 'user: test\n'
133 paged! 'user: test\n'
134 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
134 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
135 paged! 'summary: modify a 9\n'
135 paged! 'summary: modify a 9\n'
136 paged! '\n'
136 paged! '\n'
137
137
138 Possible bug: disabling pager for log but enabling it for history
138 Possible bug: disabling pager for log but enabling it for history
139 doesn't result in history being paged.
139 doesn't result in history being paged.
140
140
141 $ hg history --limit 2 --config pager.attend-log=no \
141 $ hg history --limit 2 --config pager.attend-log=no \
142 > --config pager.attend-history=yes
142 > --config pager.attend-history=yes
143 changeset: 10:46106edeeb38
143 changeset: 10:46106edeeb38
144 tag: tip
144 tag: tip
145 user: test
145 user: test
146 date: Thu Jan 01 00:00:00 1970 +0000
146 date: Thu Jan 01 00:00:00 1970 +0000
147 summary: modify a 10
147 summary: modify a 10
148
148
149 changeset: 9:6dd8ea7dd621
149 changeset: 9:6dd8ea7dd621
150 user: test
150 user: test
151 date: Thu Jan 01 00:00:00 1970 +0000
151 date: Thu Jan 01 00:00:00 1970 +0000
152 summary: modify a 9
152 summary: modify a 9
153
153
154 Pager should not start if stdout is not a tty.
154 Pager should not start if stdout is not a tty.
155
155
156 $ hg log -l1 -q --config ui.formatted=False
156 $ hg log -l1 -q --config ui.formatted=False
157 10:46106edeeb38
157 10:46106edeeb38
158
158
159 Pager with color enabled allows colors to come through by default,
159 Pager with color enabled allows colors to come through by default,
160 even though stdout is no longer a tty.
160 even though stdout is no longer a tty.
161 $ cat >> $HGRCPATH <<EOF
161 $ cat >> $HGRCPATH <<EOF
162 > [ui]
162 > [ui]
163 > color = yes
163 > color = always
164 > formatted = yes
165 > [color]
164 > [color]
166 > mode = ansi
165 > mode = ansi
167 > EOF
166 > EOF
168 $ hg log --limit 3
167 $ hg log --limit 3
169 paged! '\x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m\n'
168 paged! '\x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m\n'
170 paged! 'tag: tip\n'
169 paged! 'tag: tip\n'
171 paged! 'user: test\n'
170 paged! 'user: test\n'
172 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
171 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
173 paged! 'summary: modify a 10\n'
172 paged! 'summary: modify a 10\n'
174 paged! '\n'
173 paged! '\n'
175 paged! '\x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m\n'
174 paged! '\x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m\n'
176 paged! 'user: test\n'
175 paged! 'user: test\n'
177 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
176 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
178 paged! 'summary: modify a 9\n'
177 paged! 'summary: modify a 9\n'
179 paged! '\n'
178 paged! '\n'
180 paged! '\x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m\n'
179 paged! '\x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m\n'
181 paged! 'user: test\n'
180 paged! 'user: test\n'
182 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
181 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
183 paged! 'summary: modify a 8\n'
182 paged! 'summary: modify a 8\n'
184 paged! '\n'
183 paged! '\n'
185
184
186 Pager works with shell aliases.
185 Pager works with shell aliases.
187
186
188 $ cat >> $HGRCPATH <<EOF
187 $ cat >> $HGRCPATH <<EOF
189 > [alias]
188 > [alias]
190 > echoa = !echo a
189 > echoa = !echo a
191 > EOF
190 > EOF
192
191
193 $ hg echoa
192 $ hg echoa
194 a
193 a
195 $ hg --config pager.attend-echoa=yes echoa
194 $ hg --config pager.attend-echoa=yes echoa
196 paged! 'a\n'
195 paged! 'a\n'
197
196
198 Pager works with hg aliases including environment variables.
197 Pager works with hg aliases including environment variables.
199
198
200 $ cat >> $HGRCPATH <<'EOF'
199 $ cat >> $HGRCPATH <<'EOF'
201 > [alias]
200 > [alias]
202 > printa = log -T "$A\n" -r 0
201 > printa = log -T "$A\n" -r 0
203 > EOF
202 > EOF
204
203
205 $ A=1 hg --config pager.attend-printa=yes printa
204 $ A=1 hg --config pager.attend-printa=yes printa
206 paged! '1\n'
205 paged! '1\n'
207 $ A=2 hg --config pager.attend-printa=yes printa
206 $ A=2 hg --config pager.attend-printa=yes printa
208 paged! '2\n'
207 paged! '2\n'
209
208
210 Something that's explicitly attended is still not paginated if the
209 Something that's explicitly attended is still not paginated if the
211 pager is globally set to off using a flag:
210 pager is globally set to off using a flag:
212 $ A=2 hg --config pager.attend-printa=yes printa --pager=no
211 $ A=2 hg --config pager.attend-printa=yes printa --pager=no
213 2
212 2
214
213
215 Pager should not override the exit code of other commands
214 Pager should not override the exit code of other commands
216
215
217 $ cat >> $TESTTMP/fortytwo.py <<'EOF'
216 $ cat >> $TESTTMP/fortytwo.py <<'EOF'
218 > from mercurial import cmdutil, commands
217 > from mercurial import cmdutil, commands
219 > cmdtable = {}
218 > cmdtable = {}
220 > command = cmdutil.command(cmdtable)
219 > command = cmdutil.command(cmdtable)
221 > @command('fortytwo', [], 'fortytwo', norepo=True)
220 > @command('fortytwo', [], 'fortytwo', norepo=True)
222 > def fortytwo(ui, *opts):
221 > def fortytwo(ui, *opts):
223 > ui.write('42\n')
222 > ui.write('42\n')
224 > return 42
223 > return 42
225 > EOF
224 > EOF
226
225
227 $ cat >> $HGRCPATH <<'EOF'
226 $ cat >> $HGRCPATH <<'EOF'
228 > [extensions]
227 > [extensions]
229 > fortytwo = $TESTTMP/fortytwo.py
228 > fortytwo = $TESTTMP/fortytwo.py
230 > EOF
229 > EOF
231
230
232 $ hg fortytwo --pager=on
231 $ hg fortytwo --pager=on
233 paged! '42\n'
232 paged! '42\n'
234 [42]
233 [42]
@@ -1,327 +1,326 b''
1 $ cat >> fakepager.py <<EOF
1 $ cat >> fakepager.py <<EOF
2 > import sys
2 > import sys
3 > for line in sys.stdin:
3 > for line in sys.stdin:
4 > sys.stdout.write('paged! %r\n' % line)
4 > sys.stdout.write('paged! %r\n' % line)
5 > EOF
5 > EOF
6
6
7 Enable ui.formatted because pager won't fire without it, and set up
7 Enable ui.formatted because pager won't fire without it, and set up
8 pager and tell it to use our fake pager that lets us see when the
8 pager and tell it to use our fake pager that lets us see when the
9 pager was running.
9 pager was running.
10 $ cat >> $HGRCPATH <<EOF
10 $ cat >> $HGRCPATH <<EOF
11 > [ui]
11 > [ui]
12 > formatted = yes
12 > formatted = yes
13 > color = no
13 > color = no
14 > [pager]
14 > [pager]
15 > pager = python $TESTTMP/fakepager.py
15 > pager = python $TESTTMP/fakepager.py
16 > EOF
16 > EOF
17
17
18 $ hg init repo
18 $ hg init repo
19 $ cd repo
19 $ cd repo
20 $ echo a >> a
20 $ echo a >> a
21 $ hg add a
21 $ hg add a
22 $ hg ci -m 'add a'
22 $ hg ci -m 'add a'
23 $ for x in `python $TESTDIR/seq.py 1 10`; do
23 $ for x in `python $TESTDIR/seq.py 1 10`; do
24 > echo a $x >> a
24 > echo a $x >> a
25 > hg ci -m "modify a $x"
25 > hg ci -m "modify a $x"
26 > done
26 > done
27
27
28 By default diff and log are paged, but id is not:
28 By default diff and log are paged, but id is not:
29
29
30 $ hg diff -c 2 --pager=yes
30 $ hg diff -c 2 --pager=yes
31 paged! 'diff -r f4be7687d414 -r bce265549556 a\n'
31 paged! 'diff -r f4be7687d414 -r bce265549556 a\n'
32 paged! '--- a/a\tThu Jan 01 00:00:00 1970 +0000\n'
32 paged! '--- a/a\tThu Jan 01 00:00:00 1970 +0000\n'
33 paged! '+++ b/a\tThu Jan 01 00:00:00 1970 +0000\n'
33 paged! '+++ b/a\tThu Jan 01 00:00:00 1970 +0000\n'
34 paged! '@@ -1,2 +1,3 @@\n'
34 paged! '@@ -1,2 +1,3 @@\n'
35 paged! ' a\n'
35 paged! ' a\n'
36 paged! ' a 1\n'
36 paged! ' a 1\n'
37 paged! '+a 2\n'
37 paged! '+a 2\n'
38
38
39 $ hg log --limit 2
39 $ hg log --limit 2
40 paged! 'changeset: 10:46106edeeb38\n'
40 paged! 'changeset: 10:46106edeeb38\n'
41 paged! 'tag: tip\n'
41 paged! 'tag: tip\n'
42 paged! 'user: test\n'
42 paged! 'user: test\n'
43 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
43 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
44 paged! 'summary: modify a 10\n'
44 paged! 'summary: modify a 10\n'
45 paged! '\n'
45 paged! '\n'
46 paged! 'changeset: 9:6dd8ea7dd621\n'
46 paged! 'changeset: 9:6dd8ea7dd621\n'
47 paged! 'user: test\n'
47 paged! 'user: test\n'
48 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
48 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
49 paged! 'summary: modify a 9\n'
49 paged! 'summary: modify a 9\n'
50 paged! '\n'
50 paged! '\n'
51
51
52 $ hg id
52 $ hg id
53 46106edeeb38 tip
53 46106edeeb38 tip
54
54
55 We can control the pager from the config
55 We can control the pager from the config
56
56
57 $ hg log --limit 1 --config 'pager.enable=False'
57 $ hg log --limit 1 --config 'pager.enable=False'
58 changeset: 10:46106edeeb38
58 changeset: 10:46106edeeb38
59 tag: tip
59 tag: tip
60 user: test
60 user: test
61 date: Thu Jan 01 00:00:00 1970 +0000
61 date: Thu Jan 01 00:00:00 1970 +0000
62 summary: modify a 10
62 summary: modify a 10
63
63
64 $ hg log --limit 1 --config 'pager.enable=0'
64 $ hg log --limit 1 --config 'pager.enable=0'
65 changeset: 10:46106edeeb38
65 changeset: 10:46106edeeb38
66 tag: tip
66 tag: tip
67 user: test
67 user: test
68 date: Thu Jan 01 00:00:00 1970 +0000
68 date: Thu Jan 01 00:00:00 1970 +0000
69 summary: modify a 10
69 summary: modify a 10
70
70
71 $ hg log --limit 1 --config 'pager.enable=1'
71 $ hg log --limit 1 --config 'pager.enable=1'
72 paged! 'changeset: 10:46106edeeb38\n'
72 paged! 'changeset: 10:46106edeeb38\n'
73 paged! 'tag: tip\n'
73 paged! 'tag: tip\n'
74 paged! 'user: test\n'
74 paged! 'user: test\n'
75 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
75 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
76 paged! 'summary: modify a 10\n'
76 paged! 'summary: modify a 10\n'
77 paged! '\n'
77 paged! '\n'
78
78
79 We can enable the pager on id:
79 We can enable the pager on id:
80
80
81 BROKEN: should be paged
81 BROKEN: should be paged
82 $ hg --config pager.attend-id=yes id
82 $ hg --config pager.attend-id=yes id
83 46106edeeb38 tip
83 46106edeeb38 tip
84
84
85 Setting attend-$COMMAND to a false value works, even with pager in
85 Setting attend-$COMMAND to a false value works, even with pager in
86 core:
86 core:
87 $ hg --config pager.attend-diff=no diff -c 2
87 $ hg --config pager.attend-diff=no diff -c 2
88 diff -r f4be7687d414 -r bce265549556 a
88 diff -r f4be7687d414 -r bce265549556 a
89 --- a/a Thu Jan 01 00:00:00 1970 +0000
89 --- a/a Thu Jan 01 00:00:00 1970 +0000
90 +++ b/a Thu Jan 01 00:00:00 1970 +0000
90 +++ b/a Thu Jan 01 00:00:00 1970 +0000
91 @@ -1,2 +1,3 @@
91 @@ -1,2 +1,3 @@
92 a
92 a
93 a 1
93 a 1
94 +a 2
94 +a 2
95
95
96 Command aliases should have same behavior as main command
96 Command aliases should have same behavior as main command
97
97
98 $ hg history --limit 2
98 $ hg history --limit 2
99 paged! 'changeset: 10:46106edeeb38\n'
99 paged! 'changeset: 10:46106edeeb38\n'
100 paged! 'tag: tip\n'
100 paged! 'tag: tip\n'
101 paged! 'user: test\n'
101 paged! 'user: test\n'
102 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
102 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
103 paged! 'summary: modify a 10\n'
103 paged! 'summary: modify a 10\n'
104 paged! '\n'
104 paged! '\n'
105 paged! 'changeset: 9:6dd8ea7dd621\n'
105 paged! 'changeset: 9:6dd8ea7dd621\n'
106 paged! 'user: test\n'
106 paged! 'user: test\n'
107 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
107 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
108 paged! 'summary: modify a 9\n'
108 paged! 'summary: modify a 9\n'
109 paged! '\n'
109 paged! '\n'
110
110
111 Abbreviated command alias should also be paged
111 Abbreviated command alias should also be paged
112
112
113 $ hg hist -l 1
113 $ hg hist -l 1
114 paged! 'changeset: 10:46106edeeb38\n'
114 paged! 'changeset: 10:46106edeeb38\n'
115 paged! 'tag: tip\n'
115 paged! 'tag: tip\n'
116 paged! 'user: test\n'
116 paged! 'user: test\n'
117 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
117 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
118 paged! 'summary: modify a 10\n'
118 paged! 'summary: modify a 10\n'
119 paged! '\n'
119 paged! '\n'
120
120
121 Attend for an abbreviated command does not work
121 Attend for an abbreviated command does not work
122
122
123 $ hg --config pager.attend-ident=true ident
123 $ hg --config pager.attend-ident=true ident
124 46106edeeb38 tip
124 46106edeeb38 tip
125
125
126 $ hg --config extensions.pager= --config pager.attend-ident=true ident
126 $ hg --config extensions.pager= --config pager.attend-ident=true ident
127 46106edeeb38 tip
127 46106edeeb38 tip
128
128
129 Pager should not start if stdout is not a tty.
129 Pager should not start if stdout is not a tty.
130
130
131 $ hg log -l1 -q --config ui.formatted=False
131 $ hg log -l1 -q --config ui.formatted=False
132 10:46106edeeb38
132 10:46106edeeb38
133
133
134 Pager should be disabled if pager.pager is empty (otherwise the output would
134 Pager should be disabled if pager.pager is empty (otherwise the output would
135 be silently lost.)
135 be silently lost.)
136
136
137 $ hg log -l1 -q --config pager.pager=
137 $ hg log -l1 -q --config pager.pager=
138 10:46106edeeb38
138 10:46106edeeb38
139
139
140 Pager with color enabled allows colors to come through by default,
140 Pager with color enabled allows colors to come through by default,
141 even though stdout is no longer a tty.
141 even though stdout is no longer a tty.
142 $ cat >> $HGRCPATH <<EOF
142 $ cat >> $HGRCPATH <<EOF
143 > [ui]
143 > [ui]
144 > color = yes
144 > color = always
145 > formatted = yes
146 > [color]
145 > [color]
147 > mode = ansi
146 > mode = ansi
148 > EOF
147 > EOF
149 $ hg log --limit 3
148 $ hg log --limit 3
150 paged! '\x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m\n'
149 paged! '\x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m\n'
151 paged! 'tag: tip\n'
150 paged! 'tag: tip\n'
152 paged! 'user: test\n'
151 paged! 'user: test\n'
153 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
152 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
154 paged! 'summary: modify a 10\n'
153 paged! 'summary: modify a 10\n'
155 paged! '\n'
154 paged! '\n'
156 paged! '\x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m\n'
155 paged! '\x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m\n'
157 paged! 'user: test\n'
156 paged! 'user: test\n'
158 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
157 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
159 paged! 'summary: modify a 9\n'
158 paged! 'summary: modify a 9\n'
160 paged! '\n'
159 paged! '\n'
161 paged! '\x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m\n'
160 paged! '\x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m\n'
162 paged! 'user: test\n'
161 paged! 'user: test\n'
163 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
162 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
164 paged! 'summary: modify a 8\n'
163 paged! 'summary: modify a 8\n'
165 paged! '\n'
164 paged! '\n'
166
165
167 An invalid pager command name is reported sensibly if we don't have to
166 An invalid pager command name is reported sensibly if we don't have to
168 use shell=True in the subprocess call:
167 use shell=True in the subprocess call:
169 $ hg log --limit 3 --config pager.pager=this-command-better-never-exist
168 $ hg log --limit 3 --config pager.pager=this-command-better-never-exist
170 missing pager command 'this-command-better-never-exist', skipping pager
169 missing pager command 'this-command-better-never-exist', skipping pager
171 \x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m (esc)
170 \x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m (esc)
172 tag: tip
171 tag: tip
173 user: test
172 user: test
174 date: Thu Jan 01 00:00:00 1970 +0000
173 date: Thu Jan 01 00:00:00 1970 +0000
175 summary: modify a 10
174 summary: modify a 10
176
175
177 \x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m (esc)
176 \x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m (esc)
178 user: test
177 user: test
179 date: Thu Jan 01 00:00:00 1970 +0000
178 date: Thu Jan 01 00:00:00 1970 +0000
180 summary: modify a 9
179 summary: modify a 9
181
180
182 \x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m (esc)
181 \x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m (esc)
183 user: test
182 user: test
184 date: Thu Jan 01 00:00:00 1970 +0000
183 date: Thu Jan 01 00:00:00 1970 +0000
185 summary: modify a 8
184 summary: modify a 8
186
185
187
186
188 A complicated pager command gets worse behavior. Bonus points if you can
187 A complicated pager command gets worse behavior. Bonus points if you can
189 improve this.
188 improve this.
190 $ hg log --limit 3 \
189 $ hg log --limit 3 \
191 > --config pager.pager='this-command-better-never-exist --seriously' \
190 > --config pager.pager='this-command-better-never-exist --seriously' \
192 > 2>/dev/null || true
191 > 2>/dev/null || true
193
192
194 Pager works with shell aliases.
193 Pager works with shell aliases.
195
194
196 $ cat >> $HGRCPATH <<EOF
195 $ cat >> $HGRCPATH <<EOF
197 > [alias]
196 > [alias]
198 > echoa = !echo a
197 > echoa = !echo a
199 > EOF
198 > EOF
200
199
201 $ hg echoa
200 $ hg echoa
202 a
201 a
203 BROKEN: should be paged
202 BROKEN: should be paged
204 $ hg --config pager.attend-echoa=yes echoa
203 $ hg --config pager.attend-echoa=yes echoa
205 a
204 a
206
205
207 Pager works with hg aliases including environment variables.
206 Pager works with hg aliases including environment variables.
208
207
209 $ cat >> $HGRCPATH <<'EOF'
208 $ cat >> $HGRCPATH <<'EOF'
210 > [alias]
209 > [alias]
211 > printa = log -T "$A\n" -r 0
210 > printa = log -T "$A\n" -r 0
212 > EOF
211 > EOF
213
212
214 $ A=1 hg --config pager.attend-printa=yes printa
213 $ A=1 hg --config pager.attend-printa=yes printa
215 paged! '1\n'
214 paged! '1\n'
216 $ A=2 hg --config pager.attend-printa=yes printa
215 $ A=2 hg --config pager.attend-printa=yes printa
217 paged! '2\n'
216 paged! '2\n'
218
217
219 Something that's explicitly attended is still not paginated if the
218 Something that's explicitly attended is still not paginated if the
220 pager is globally set to off using a flag:
219 pager is globally set to off using a flag:
221 $ A=2 hg --config pager.attend-printa=yes printa --pager=no
220 $ A=2 hg --config pager.attend-printa=yes printa --pager=no
222 2
221 2
223
222
224 Pager should not override the exit code of other commands
223 Pager should not override the exit code of other commands
225
224
226 $ cat >> $TESTTMP/fortytwo.py <<'EOF'
225 $ cat >> $TESTTMP/fortytwo.py <<'EOF'
227 > from mercurial import cmdutil, commands
226 > from mercurial import cmdutil, commands
228 > cmdtable = {}
227 > cmdtable = {}
229 > command = cmdutil.command(cmdtable)
228 > command = cmdutil.command(cmdtable)
230 > @command('fortytwo', [], 'fortytwo', norepo=True)
229 > @command('fortytwo', [], 'fortytwo', norepo=True)
231 > def fortytwo(ui, *opts):
230 > def fortytwo(ui, *opts):
232 > ui.write('42\n')
231 > ui.write('42\n')
233 > return 42
232 > return 42
234 > EOF
233 > EOF
235
234
236 $ cat >> $HGRCPATH <<'EOF'
235 $ cat >> $HGRCPATH <<'EOF'
237 > [extensions]
236 > [extensions]
238 > fortytwo = $TESTTMP/fortytwo.py
237 > fortytwo = $TESTTMP/fortytwo.py
239 > EOF
238 > EOF
240
239
241 $ hg fortytwo --pager=on
240 $ hg fortytwo --pager=on
242 paged! '42\n'
241 paged! '42\n'
243 [42]
242 [42]
244
243
245 A command that asks for paging using ui.pager() directly works:
244 A command that asks for paging using ui.pager() directly works:
246 $ hg blame a
245 $ hg blame a
247 paged! ' 0: a\n'
246 paged! ' 0: a\n'
248 paged! ' 1: a 1\n'
247 paged! ' 1: a 1\n'
249 paged! ' 2: a 2\n'
248 paged! ' 2: a 2\n'
250 paged! ' 3: a 3\n'
249 paged! ' 3: a 3\n'
251 paged! ' 4: a 4\n'
250 paged! ' 4: a 4\n'
252 paged! ' 5: a 5\n'
251 paged! ' 5: a 5\n'
253 paged! ' 6: a 6\n'
252 paged! ' 6: a 6\n'
254 paged! ' 7: a 7\n'
253 paged! ' 7: a 7\n'
255 paged! ' 8: a 8\n'
254 paged! ' 8: a 8\n'
256 paged! ' 9: a 9\n'
255 paged! ' 9: a 9\n'
257 paged! '10: a 10\n'
256 paged! '10: a 10\n'
258 but not with HGPLAIN
257 but not with HGPLAIN
259 $ HGPLAIN=1 hg blame a
258 $ HGPLAIN=1 hg blame a
260 0: a
259 0: a
261 1: a 1
260 1: a 1
262 2: a 2
261 2: a 2
263 3: a 3
262 3: a 3
264 4: a 4
263 4: a 4
265 5: a 5
264 5: a 5
266 6: a 6
265 6: a 6
267 7: a 7
266 7: a 7
268 8: a 8
267 8: a 8
269 9: a 9
268 9: a 9
270 10: a 10
269 10: a 10
271 explicit flags work too:
270 explicit flags work too:
272 $ hg blame --pager=no a
271 $ hg blame --pager=no a
273 0: a
272 0: a
274 1: a 1
273 1: a 1
275 2: a 2
274 2: a 2
276 3: a 3
275 3: a 3
277 4: a 4
276 4: a 4
278 5: a 5
277 5: a 5
279 6: a 6
278 6: a 6
280 7: a 7
279 7: a 7
281 8: a 8
280 8: a 8
282 9: a 9
281 9: a 9
283 10: a 10
282 10: a 10
284
283
285 Put annotate in the ignore list for pager:
284 Put annotate in the ignore list for pager:
286 $ cat >> $HGRCPATH <<EOF
285 $ cat >> $HGRCPATH <<EOF
287 > [pager]
286 > [pager]
288 > ignore = annotate
287 > ignore = annotate
289 > EOF
288 > EOF
290 $ hg blame a
289 $ hg blame a
291 0: a
290 0: a
292 1: a 1
291 1: a 1
293 2: a 2
292 2: a 2
294 3: a 3
293 3: a 3
295 4: a 4
294 4: a 4
296 5: a 5
295 5: a 5
297 6: a 6
296 6: a 6
298 7: a 7
297 7: a 7
299 8: a 8
298 8: a 8
300 9: a 9
299 9: a 9
301 10: a 10
300 10: a 10
302
301
303 Environment variables like LESS and LV are set automatically:
302 Environment variables like LESS and LV are set automatically:
304 $ cat > $TESTTMP/printlesslv.py <<EOF
303 $ cat > $TESTTMP/printlesslv.py <<EOF
305 > import os, sys
304 > import os, sys
306 > sys.stdin.read()
305 > sys.stdin.read()
307 > for name in ['LESS', 'LV']:
306 > for name in ['LESS', 'LV']:
308 > sys.stdout.write(('%s=%s\n') % (name, os.environ.get(name, '-')))
307 > sys.stdout.write(('%s=%s\n') % (name, os.environ.get(name, '-')))
309 > sys.stdout.flush()
308 > sys.stdout.flush()
310 > EOF
309 > EOF
311
310
312 $ cat >> $HGRCPATH <<EOF
311 $ cat >> $HGRCPATH <<EOF
313 > [alias]
312 > [alias]
314 > noop = log -r 0 -T ''
313 > noop = log -r 0 -T ''
315 > [ui]
314 > [ui]
316 > formatted=1
315 > formatted=1
317 > [pager]
316 > [pager]
318 > pager = $PYTHON $TESTTMP/printlesslv.py
317 > pager = $PYTHON $TESTTMP/printlesslv.py
319 > EOF
318 > EOF
320 $ unset LESS
319 $ unset LESS
321 $ unset LV
320 $ unset LV
322 $ hg noop --pager=on
321 $ hg noop --pager=on
323 LESS=FRX
322 LESS=FRX
324 LV=-c
323 LV=-c
325 $ LESS=EFGH hg noop --pager=on
324 $ LESS=EFGH hg noop --pager=on
326 LESS=EFGH
325 LESS=EFGH
327 LV=-c
326 LV=-c
@@ -1,390 +1,389 b''
1 $ cat <<EOF >> $HGRCPATH
1 $ cat <<EOF >> $HGRCPATH
2 > [ui]
2 > [ui]
3 > color = always
3 > color = always
4 > formatted = yes
5 > [color]
4 > [color]
6 > mode = ansi
5 > mode = ansi
7 > EOF
6 > EOF
8 Terminfo codes compatibility fix
7 Terminfo codes compatibility fix
9 $ echo "color.none=0" >> $HGRCPATH
8 $ echo "color.none=0" >> $HGRCPATH
10
9
11 $ hg init repo1
10 $ hg init repo1
12 $ cd repo1
11 $ cd repo1
13 $ mkdir a b a/1 b/1 b/2
12 $ mkdir a b a/1 b/1 b/2
14 $ touch in_root a/in_a b/in_b a/1/in_a_1 b/1/in_b_1 b/2/in_b_2
13 $ touch in_root a/in_a b/in_b a/1/in_a_1 b/1/in_b_1 b/2/in_b_2
15
14
16 hg status in repo root:
15 hg status in repo root:
17
16
18 $ hg status
17 $ hg status
19 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
18 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
20 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
19 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
21 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
20 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
22 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
21 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
23 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
22 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
24 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
23 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
25
24
26 $ hg status --color=debug
25 $ hg status --color=debug
27 [status.unknown|? ][status.unknown|a/1/in_a_1]
26 [status.unknown|? ][status.unknown|a/1/in_a_1]
28 [status.unknown|? ][status.unknown|a/in_a]
27 [status.unknown|? ][status.unknown|a/in_a]
29 [status.unknown|? ][status.unknown|b/1/in_b_1]
28 [status.unknown|? ][status.unknown|b/1/in_b_1]
30 [status.unknown|? ][status.unknown|b/2/in_b_2]
29 [status.unknown|? ][status.unknown|b/2/in_b_2]
31 [status.unknown|? ][status.unknown|b/in_b]
30 [status.unknown|? ][status.unknown|b/in_b]
32 [status.unknown|? ][status.unknown|in_root]
31 [status.unknown|? ][status.unknown|in_root]
33
32
34 hg status with template
33 hg status with template
35 $ hg status -T "{label('red', path)}\n" --color=debug
34 $ hg status -T "{label('red', path)}\n" --color=debug
36 [red|a/1/in_a_1]
35 [red|a/1/in_a_1]
37 [red|a/in_a]
36 [red|a/in_a]
38 [red|b/1/in_b_1]
37 [red|b/1/in_b_1]
39 [red|b/2/in_b_2]
38 [red|b/2/in_b_2]
40 [red|b/in_b]
39 [red|b/in_b]
41 [red|in_root]
40 [red|in_root]
42
41
43 hg status . in repo root:
42 hg status . in repo root:
44
43
45 $ hg status .
44 $ hg status .
46 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
45 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
47 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
46 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
48 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
47 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
49 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
48 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
50 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
49 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
51 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
50 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
52
51
53 $ hg status --cwd a
52 $ hg status --cwd a
54 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
53 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
55 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
54 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
56 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
55 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
57 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
56 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
58 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
57 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
59 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
58 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
60 $ hg status --cwd a .
59 $ hg status --cwd a .
61 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m1/in_a_1\x1b[0m (esc)
60 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m1/in_a_1\x1b[0m (esc)
62 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_a\x1b[0m (esc)
61 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_a\x1b[0m (esc)
63 $ hg status --cwd a ..
62 $ hg status --cwd a ..
64 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m1/in_a_1\x1b[0m (esc)
63 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m1/in_a_1\x1b[0m (esc)
65 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_a\x1b[0m (esc)
64 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_a\x1b[0m (esc)
66 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../b/1/in_b_1\x1b[0m (esc)
65 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../b/1/in_b_1\x1b[0m (esc)
67 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../b/2/in_b_2\x1b[0m (esc)
66 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../b/2/in_b_2\x1b[0m (esc)
68 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../b/in_b\x1b[0m (esc)
67 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../b/in_b\x1b[0m (esc)
69 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../in_root\x1b[0m (esc)
68 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../in_root\x1b[0m (esc)
70
69
71 $ hg status --cwd b
70 $ hg status --cwd b
72 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
71 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
73 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
72 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
74 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
73 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
75 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
74 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
76 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
75 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
77 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
76 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
78 $ hg status --cwd b .
77 $ hg status --cwd b .
79 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m1/in_b_1\x1b[0m (esc)
78 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m1/in_b_1\x1b[0m (esc)
80 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m2/in_b_2\x1b[0m (esc)
79 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m2/in_b_2\x1b[0m (esc)
81 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b\x1b[0m (esc)
80 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b\x1b[0m (esc)
82 $ hg status --cwd b ..
81 $ hg status --cwd b ..
83 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../a/1/in_a_1\x1b[0m (esc)
82 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../a/1/in_a_1\x1b[0m (esc)
84 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../a/in_a\x1b[0m (esc)
83 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../a/in_a\x1b[0m (esc)
85 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m1/in_b_1\x1b[0m (esc)
84 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m1/in_b_1\x1b[0m (esc)
86 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m2/in_b_2\x1b[0m (esc)
85 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m2/in_b_2\x1b[0m (esc)
87 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b\x1b[0m (esc)
86 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b\x1b[0m (esc)
88 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../in_root\x1b[0m (esc)
87 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../in_root\x1b[0m (esc)
89
88
90 $ hg status --cwd a/1
89 $ hg status --cwd a/1
91 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
90 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
92 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
91 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
93 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
92 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
94 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
93 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
95 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
94 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
96 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
95 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
97 $ hg status --cwd a/1 .
96 $ hg status --cwd a/1 .
98 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_a_1\x1b[0m (esc)
97 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_a_1\x1b[0m (esc)
99 $ hg status --cwd a/1 ..
98 $ hg status --cwd a/1 ..
100 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_a_1\x1b[0m (esc)
99 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_a_1\x1b[0m (esc)
101 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../in_a\x1b[0m (esc)
100 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../in_a\x1b[0m (esc)
102
101
103 $ hg status --cwd b/1
102 $ hg status --cwd b/1
104 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
103 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
105 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
104 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
106 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
105 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
107 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
106 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
108 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
107 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
109 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
108 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
110 $ hg status --cwd b/1 .
109 $ hg status --cwd b/1 .
111 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b_1\x1b[0m (esc)
110 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b_1\x1b[0m (esc)
112 $ hg status --cwd b/1 ..
111 $ hg status --cwd b/1 ..
113 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b_1\x1b[0m (esc)
112 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b_1\x1b[0m (esc)
114 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../2/in_b_2\x1b[0m (esc)
113 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../2/in_b_2\x1b[0m (esc)
115 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../in_b\x1b[0m (esc)
114 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../in_b\x1b[0m (esc)
116
115
117 $ hg status --cwd b/2
116 $ hg status --cwd b/2
118 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
117 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/1/in_a_1\x1b[0m (esc)
119 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
118 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4ma/in_a\x1b[0m (esc)
120 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
119 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/1/in_b_1\x1b[0m (esc)
121 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
120 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/2/in_b_2\x1b[0m (esc)
122 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
121 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4mb/in_b\x1b[0m (esc)
123 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
122 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_root\x1b[0m (esc)
124 $ hg status --cwd b/2 .
123 $ hg status --cwd b/2 .
125 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b_2\x1b[0m (esc)
124 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b_2\x1b[0m (esc)
126 $ hg status --cwd b/2 ..
125 $ hg status --cwd b/2 ..
127 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../1/in_b_1\x1b[0m (esc)
126 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../1/in_b_1\x1b[0m (esc)
128 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b_2\x1b[0m (esc)
127 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4min_b_2\x1b[0m (esc)
129 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../in_b\x1b[0m (esc)
128 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4m../in_b\x1b[0m (esc)
130
129
131 Make sure --color=never works
130 Make sure --color=never works
132 $ hg status --color=never
131 $ hg status --color=never
133 ? a/1/in_a_1
132 ? a/1/in_a_1
134 ? a/in_a
133 ? a/in_a
135 ? b/1/in_b_1
134 ? b/1/in_b_1
136 ? b/2/in_b_2
135 ? b/2/in_b_2
137 ? b/in_b
136 ? b/in_b
138 ? in_root
137 ? in_root
139
138
140 Make sure ui.formatted=False works
139 Make sure ui.formatted=False works
141 $ hg status --color=auto --config ui.formatted=False
140 $ hg status --color=auto --config ui.formatted=False
142 ? a/1/in_a_1
141 ? a/1/in_a_1
143 ? a/in_a
142 ? a/in_a
144 ? b/1/in_b_1
143 ? b/1/in_b_1
145 ? b/2/in_b_2
144 ? b/2/in_b_2
146 ? b/in_b
145 ? b/in_b
147 ? in_root
146 ? in_root
148
147
149 $ cd ..
148 $ cd ..
150
149
151 $ hg init repo2
150 $ hg init repo2
152 $ cd repo2
151 $ cd repo2
153 $ touch modified removed deleted ignored
152 $ touch modified removed deleted ignored
154 $ echo "^ignored$" > .hgignore
153 $ echo "^ignored$" > .hgignore
155 $ hg ci -A -m 'initial checkin'
154 $ hg ci -A -m 'initial checkin'
156 adding .hgignore
155 adding .hgignore
157 adding deleted
156 adding deleted
158 adding modified
157 adding modified
159 adding removed
158 adding removed
160 $ hg log --color=debug
159 $ hg log --color=debug
161 [log.changeset changeset.draft|changeset: 0:389aef86a55e]
160 [log.changeset changeset.draft|changeset: 0:389aef86a55e]
162 [log.tag|tag: tip]
161 [log.tag|tag: tip]
163 [log.user|user: test]
162 [log.user|user: test]
164 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
163 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
165 [log.summary|summary: initial checkin]
164 [log.summary|summary: initial checkin]
166
165
167 $ hg log -Tcompact --color=debug
166 $ hg log -Tcompact --color=debug
168 [log.changeset changeset.draft|0][tip] [log.node|389aef86a55e] [log.date|1970-01-01 00:00 +0000] [log.user|test]
167 [log.changeset changeset.draft|0][tip] [log.node|389aef86a55e] [log.date|1970-01-01 00:00 +0000] [log.user|test]
169 [ui.note log.description|initial checkin]
168 [ui.note log.description|initial checkin]
170
169
171 Labels on empty strings should not be displayed, labels on custom
170 Labels on empty strings should not be displayed, labels on custom
172 templates should be.
171 templates should be.
173
172
174 $ hg log --color=debug -T '{label("my.label",author)}\n{label("skipped.label","")}'
173 $ hg log --color=debug -T '{label("my.label",author)}\n{label("skipped.label","")}'
175 [my.label|test]
174 [my.label|test]
176 $ touch modified added unknown ignored
175 $ touch modified added unknown ignored
177 $ hg add added
176 $ hg add added
178 $ hg remove removed
177 $ hg remove removed
179 $ rm deleted
178 $ rm deleted
180
179
181 hg status:
180 hg status:
182
181
183 $ hg status
182 $ hg status
184 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1madded\x1b[0m (esc)
183 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1madded\x1b[0m (esc)
185 \x1b[0;31;1mR \x1b[0m\x1b[0;31;1mremoved\x1b[0m (esc)
184 \x1b[0;31;1mR \x1b[0m\x1b[0;31;1mremoved\x1b[0m (esc)
186 \x1b[0;36;1;4m! \x1b[0m\x1b[0;36;1;4mdeleted\x1b[0m (esc)
185 \x1b[0;36;1;4m! \x1b[0m\x1b[0;36;1;4mdeleted\x1b[0m (esc)
187 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4munknown\x1b[0m (esc)
186 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4munknown\x1b[0m (esc)
188
187
189 hg status modified added removed deleted unknown never-existed ignored:
188 hg status modified added removed deleted unknown never-existed ignored:
190
189
191 $ hg status modified added removed deleted unknown never-existed ignored
190 $ hg status modified added removed deleted unknown never-existed ignored
192 never-existed: * (glob)
191 never-existed: * (glob)
193 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1madded\x1b[0m (esc)
192 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1madded\x1b[0m (esc)
194 \x1b[0;31;1mR \x1b[0m\x1b[0;31;1mremoved\x1b[0m (esc)
193 \x1b[0;31;1mR \x1b[0m\x1b[0;31;1mremoved\x1b[0m (esc)
195 \x1b[0;36;1;4m! \x1b[0m\x1b[0;36;1;4mdeleted\x1b[0m (esc)
194 \x1b[0;36;1;4m! \x1b[0m\x1b[0;36;1;4mdeleted\x1b[0m (esc)
196 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4munknown\x1b[0m (esc)
195 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4munknown\x1b[0m (esc)
197
196
198 $ hg copy modified copied
197 $ hg copy modified copied
199
198
200 hg status -C:
199 hg status -C:
201
200
202 $ hg status -C
201 $ hg status -C
203 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1madded\x1b[0m (esc)
202 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1madded\x1b[0m (esc)
204 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1mcopied\x1b[0m (esc)
203 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1mcopied\x1b[0m (esc)
205 \x1b[0;0m modified\x1b[0m (esc)
204 \x1b[0;0m modified\x1b[0m (esc)
206 \x1b[0;31;1mR \x1b[0m\x1b[0;31;1mremoved\x1b[0m (esc)
205 \x1b[0;31;1mR \x1b[0m\x1b[0;31;1mremoved\x1b[0m (esc)
207 \x1b[0;36;1;4m! \x1b[0m\x1b[0;36;1;4mdeleted\x1b[0m (esc)
206 \x1b[0;36;1;4m! \x1b[0m\x1b[0;36;1;4mdeleted\x1b[0m (esc)
208 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4munknown\x1b[0m (esc)
207 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4munknown\x1b[0m (esc)
209
208
210 hg status -A:
209 hg status -A:
211
210
212 $ hg status -A
211 $ hg status -A
213 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1madded\x1b[0m (esc)
212 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1madded\x1b[0m (esc)
214 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1mcopied\x1b[0m (esc)
213 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1mcopied\x1b[0m (esc)
215 \x1b[0;0m modified\x1b[0m (esc)
214 \x1b[0;0m modified\x1b[0m (esc)
216 \x1b[0;31;1mR \x1b[0m\x1b[0;31;1mremoved\x1b[0m (esc)
215 \x1b[0;31;1mR \x1b[0m\x1b[0;31;1mremoved\x1b[0m (esc)
217 \x1b[0;36;1;4m! \x1b[0m\x1b[0;36;1;4mdeleted\x1b[0m (esc)
216 \x1b[0;36;1;4m! \x1b[0m\x1b[0;36;1;4mdeleted\x1b[0m (esc)
218 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4munknown\x1b[0m (esc)
217 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4munknown\x1b[0m (esc)
219 \x1b[0;30;1mI \x1b[0m\x1b[0;30;1mignored\x1b[0m (esc)
218 \x1b[0;30;1mI \x1b[0m\x1b[0;30;1mignored\x1b[0m (esc)
220 \x1b[0;0mC \x1b[0m\x1b[0;0m.hgignore\x1b[0m (esc)
219 \x1b[0;0mC \x1b[0m\x1b[0;0m.hgignore\x1b[0m (esc)
221 \x1b[0;0mC \x1b[0m\x1b[0;0mmodified\x1b[0m (esc)
220 \x1b[0;0mC \x1b[0m\x1b[0;0mmodified\x1b[0m (esc)
222
221
223
222
224 hg status -A (with terminfo color):
223 hg status -A (with terminfo color):
225
224
226 #if tic
225 #if tic
227
226
228 $ mkdir "$TESTTMP/terminfo"
227 $ mkdir "$TESTTMP/terminfo"
229 $ TERMINFO="$TESTTMP/terminfo" tic "$TESTDIR/hgterm.ti"
228 $ TERMINFO="$TESTTMP/terminfo" tic "$TESTDIR/hgterm.ti"
230 $ TERM=hgterm TERMINFO="$TESTTMP/terminfo" hg status --config color.mode=terminfo -A
229 $ TERM=hgterm TERMINFO="$TESTTMP/terminfo" hg status --config color.mode=terminfo -A
231 \x1b[30m\x1b[32m\x1b[1mA \x1b[30m\x1b[30m\x1b[32m\x1b[1madded\x1b[30m (esc)
230 \x1b[30m\x1b[32m\x1b[1mA \x1b[30m\x1b[30m\x1b[32m\x1b[1madded\x1b[30m (esc)
232 \x1b[30m\x1b[32m\x1b[1mA \x1b[30m\x1b[30m\x1b[32m\x1b[1mcopied\x1b[30m (esc)
231 \x1b[30m\x1b[32m\x1b[1mA \x1b[30m\x1b[30m\x1b[32m\x1b[1mcopied\x1b[30m (esc)
233 \x1b[30m\x1b[30m modified\x1b[30m (esc)
232 \x1b[30m\x1b[30m modified\x1b[30m (esc)
234 \x1b[30m\x1b[31m\x1b[1mR \x1b[30m\x1b[30m\x1b[31m\x1b[1mremoved\x1b[30m (esc)
233 \x1b[30m\x1b[31m\x1b[1mR \x1b[30m\x1b[30m\x1b[31m\x1b[1mremoved\x1b[30m (esc)
235 \x1b[30m\x1b[36m\x1b[1m\x1b[4m! \x1b[30m\x1b[30m\x1b[36m\x1b[1m\x1b[4mdeleted\x1b[30m (esc)
234 \x1b[30m\x1b[36m\x1b[1m\x1b[4m! \x1b[30m\x1b[30m\x1b[36m\x1b[1m\x1b[4mdeleted\x1b[30m (esc)
236 \x1b[30m\x1b[35m\x1b[1m\x1b[4m? \x1b[30m\x1b[30m\x1b[35m\x1b[1m\x1b[4munknown\x1b[30m (esc)
235 \x1b[30m\x1b[35m\x1b[1m\x1b[4m? \x1b[30m\x1b[30m\x1b[35m\x1b[1m\x1b[4munknown\x1b[30m (esc)
237 \x1b[30m\x1b[30m\x1b[1mI \x1b[30m\x1b[30m\x1b[30m\x1b[1mignored\x1b[30m (esc)
236 \x1b[30m\x1b[30m\x1b[1mI \x1b[30m\x1b[30m\x1b[30m\x1b[1mignored\x1b[30m (esc)
238 \x1b[30m\x1b[30mC \x1b[30m\x1b[30m\x1b[30m.hgignore\x1b[30m (esc)
237 \x1b[30m\x1b[30mC \x1b[30m\x1b[30m\x1b[30m.hgignore\x1b[30m (esc)
239 \x1b[30m\x1b[30mC \x1b[30m\x1b[30m\x1b[30mmodified\x1b[30m (esc)
238 \x1b[30m\x1b[30mC \x1b[30m\x1b[30m\x1b[30mmodified\x1b[30m (esc)
240
239
241 The user can define effects with raw terminfo codes:
240 The user can define effects with raw terminfo codes:
242
241
243 $ cat <<EOF >> $HGRCPATH
242 $ cat <<EOF >> $HGRCPATH
244 > # Completely bogus code for dim
243 > # Completely bogus code for dim
245 > terminfo.dim = \E[88m
244 > terminfo.dim = \E[88m
246 > # We can override what's in the terminfo database, too
245 > # We can override what's in the terminfo database, too
247 > terminfo.bold = \E[2m
246 > terminfo.bold = \E[2m
248 > EOF
247 > EOF
249 $ TERM=hgterm TERMINFO="$TESTTMP/terminfo" hg status --config color.mode=terminfo --config color.status.clean=dim -A
248 $ TERM=hgterm TERMINFO="$TESTTMP/terminfo" hg status --config color.mode=terminfo --config color.status.clean=dim -A
250 \x1b[30m\x1b[32m\x1b[2mA \x1b[30m\x1b[30m\x1b[32m\x1b[2madded\x1b[30m (esc)
249 \x1b[30m\x1b[32m\x1b[2mA \x1b[30m\x1b[30m\x1b[32m\x1b[2madded\x1b[30m (esc)
251 \x1b[30m\x1b[32m\x1b[2mA \x1b[30m\x1b[30m\x1b[32m\x1b[2mcopied\x1b[30m (esc)
250 \x1b[30m\x1b[32m\x1b[2mA \x1b[30m\x1b[30m\x1b[32m\x1b[2mcopied\x1b[30m (esc)
252 \x1b[30m\x1b[30m modified\x1b[30m (esc)
251 \x1b[30m\x1b[30m modified\x1b[30m (esc)
253 \x1b[30m\x1b[31m\x1b[2mR \x1b[30m\x1b[30m\x1b[31m\x1b[2mremoved\x1b[30m (esc)
252 \x1b[30m\x1b[31m\x1b[2mR \x1b[30m\x1b[30m\x1b[31m\x1b[2mremoved\x1b[30m (esc)
254 \x1b[30m\x1b[36m\x1b[2m\x1b[4m! \x1b[30m\x1b[30m\x1b[36m\x1b[2m\x1b[4mdeleted\x1b[30m (esc)
253 \x1b[30m\x1b[36m\x1b[2m\x1b[4m! \x1b[30m\x1b[30m\x1b[36m\x1b[2m\x1b[4mdeleted\x1b[30m (esc)
255 \x1b[30m\x1b[35m\x1b[2m\x1b[4m? \x1b[30m\x1b[30m\x1b[35m\x1b[2m\x1b[4munknown\x1b[30m (esc)
254 \x1b[30m\x1b[35m\x1b[2m\x1b[4m? \x1b[30m\x1b[30m\x1b[35m\x1b[2m\x1b[4munknown\x1b[30m (esc)
256 \x1b[30m\x1b[30m\x1b[2mI \x1b[30m\x1b[30m\x1b[30m\x1b[2mignored\x1b[30m (esc)
255 \x1b[30m\x1b[30m\x1b[2mI \x1b[30m\x1b[30m\x1b[30m\x1b[2mignored\x1b[30m (esc)
257 \x1b[30m\x1b[88mC \x1b[30m\x1b[30m\x1b[88m.hgignore\x1b[30m (esc)
256 \x1b[30m\x1b[88mC \x1b[30m\x1b[30m\x1b[88m.hgignore\x1b[30m (esc)
258 \x1b[30m\x1b[88mC \x1b[30m\x1b[30m\x1b[88mmodified\x1b[30m (esc)
257 \x1b[30m\x1b[88mC \x1b[30m\x1b[30m\x1b[88mmodified\x1b[30m (esc)
259
258
260 #endif
259 #endif
261
260
262
261
263 $ echo "^ignoreddir$" > .hgignore
262 $ echo "^ignoreddir$" > .hgignore
264 $ mkdir ignoreddir
263 $ mkdir ignoreddir
265 $ touch ignoreddir/file
264 $ touch ignoreddir/file
266
265
267 hg status ignoreddir/file:
266 hg status ignoreddir/file:
268
267
269 $ hg status ignoreddir/file
268 $ hg status ignoreddir/file
270
269
271 hg status -i ignoreddir/file:
270 hg status -i ignoreddir/file:
272
271
273 $ hg status -i ignoreddir/file
272 $ hg status -i ignoreddir/file
274 \x1b[0;30;1mI \x1b[0m\x1b[0;30;1mignoreddir/file\x1b[0m (esc)
273 \x1b[0;30;1mI \x1b[0m\x1b[0;30;1mignoreddir/file\x1b[0m (esc)
275 $ cd ..
274 $ cd ..
276
275
277 check 'status -q' and some combinations
276 check 'status -q' and some combinations
278
277
279 $ hg init repo3
278 $ hg init repo3
280 $ cd repo3
279 $ cd repo3
281 $ touch modified removed deleted ignored
280 $ touch modified removed deleted ignored
282 $ echo "^ignored$" > .hgignore
281 $ echo "^ignored$" > .hgignore
283 $ hg commit -A -m 'initial checkin'
282 $ hg commit -A -m 'initial checkin'
284 adding .hgignore
283 adding .hgignore
285 adding deleted
284 adding deleted
286 adding modified
285 adding modified
287 adding removed
286 adding removed
288 $ touch added unknown ignored
287 $ touch added unknown ignored
289 $ hg add added
288 $ hg add added
290 $ echo "test" >> modified
289 $ echo "test" >> modified
291 $ hg remove removed
290 $ hg remove removed
292 $ rm deleted
291 $ rm deleted
293 $ hg copy modified copied
292 $ hg copy modified copied
294
293
295 test unknown color
294 test unknown color
296
295
297 $ hg --config color.status.modified=periwinkle status
296 $ hg --config color.status.modified=periwinkle status
298 ignoring unknown color/effect 'periwinkle' (configured in color.status.modified)
297 ignoring unknown color/effect 'periwinkle' (configured in color.status.modified)
299 ignoring unknown color/effect 'periwinkle' (configured in color.status.modified)
298 ignoring unknown color/effect 'periwinkle' (configured in color.status.modified)
300 ignoring unknown color/effect 'periwinkle' (configured in color.status.modified)
299 ignoring unknown color/effect 'periwinkle' (configured in color.status.modified)
301 M modified
300 M modified
302 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1madded\x1b[0m (esc)
301 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1madded\x1b[0m (esc)
303 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1mcopied\x1b[0m (esc)
302 \x1b[0;32;1mA \x1b[0m\x1b[0;32;1mcopied\x1b[0m (esc)
304 \x1b[0;31;1mR \x1b[0m\x1b[0;31;1mremoved\x1b[0m (esc)
303 \x1b[0;31;1mR \x1b[0m\x1b[0;31;1mremoved\x1b[0m (esc)
305 \x1b[0;36;1;4m! \x1b[0m\x1b[0;36;1;4mdeleted\x1b[0m (esc)
304 \x1b[0;36;1;4m! \x1b[0m\x1b[0;36;1;4mdeleted\x1b[0m (esc)
306 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4munknown\x1b[0m (esc)
305 \x1b[0;35;1;4m? \x1b[0m\x1b[0;35;1;4munknown\x1b[0m (esc)
307
306
308 Run status with 2 different flags.
307 Run status with 2 different flags.
309 Check if result is the same or different.
308 Check if result is the same or different.
310 If result is not as expected, raise error
309 If result is not as expected, raise error
311
310
312 $ assert() {
311 $ assert() {
313 > hg status $1 > ../a
312 > hg status $1 > ../a
314 > hg status $2 > ../b
313 > hg status $2 > ../b
315 > if diff ../a ../b > /dev/null; then
314 > if diff ../a ../b > /dev/null; then
316 > out=0
315 > out=0
317 > else
316 > else
318 > out=1
317 > out=1
319 > fi
318 > fi
320 > if [ $3 -eq 0 ]; then
319 > if [ $3 -eq 0 ]; then
321 > df="same"
320 > df="same"
322 > else
321 > else
323 > df="different"
322 > df="different"
324 > fi
323 > fi
325 > if [ $out -ne $3 ]; then
324 > if [ $out -ne $3 ]; then
326 > echo "Error on $1 and $2, should be $df."
325 > echo "Error on $1 and $2, should be $df."
327 > fi
326 > fi
328 > }
327 > }
329
328
330 assert flag1 flag2 [0-same | 1-different]
329 assert flag1 flag2 [0-same | 1-different]
331
330
332 $ assert "-q" "-mard" 0
331 $ assert "-q" "-mard" 0
333 $ assert "-A" "-marduicC" 0
332 $ assert "-A" "-marduicC" 0
334 $ assert "-qA" "-mardcC" 0
333 $ assert "-qA" "-mardcC" 0
335 $ assert "-qAui" "-A" 0
334 $ assert "-qAui" "-A" 0
336 $ assert "-qAu" "-marducC" 0
335 $ assert "-qAu" "-marducC" 0
337 $ assert "-qAi" "-mardicC" 0
336 $ assert "-qAi" "-mardicC" 0
338 $ assert "-qu" "-u" 0
337 $ assert "-qu" "-u" 0
339 $ assert "-q" "-u" 1
338 $ assert "-q" "-u" 1
340 $ assert "-m" "-a" 1
339 $ assert "-m" "-a" 1
341 $ assert "-r" "-d" 1
340 $ assert "-r" "-d" 1
342 $ cd ..
341 $ cd ..
343
342
344 test 'resolve -l'
343 test 'resolve -l'
345
344
346 $ hg init repo4
345 $ hg init repo4
347 $ cd repo4
346 $ cd repo4
348 $ echo "file a" > a
347 $ echo "file a" > a
349 $ echo "file b" > b
348 $ echo "file b" > b
350 $ hg add a b
349 $ hg add a b
351 $ hg commit -m "initial"
350 $ hg commit -m "initial"
352 $ echo "file a change 1" > a
351 $ echo "file a change 1" > a
353 $ echo "file b change 1" > b
352 $ echo "file b change 1" > b
354 $ hg commit -m "head 1"
353 $ hg commit -m "head 1"
355 $ hg update 0
354 $ hg update 0
356 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
355 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
357 $ echo "file a change 2" > a
356 $ echo "file a change 2" > a
358 $ echo "file b change 2" > b
357 $ echo "file b change 2" > b
359 $ hg commit -m "head 2"
358 $ hg commit -m "head 2"
360 created new head
359 created new head
361 $ hg merge
360 $ hg merge
362 merging a
361 merging a
363 merging b
362 merging b
364 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
363 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
365 warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
364 warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
366 0 files updated, 0 files merged, 0 files removed, 2 files unresolved
365 0 files updated, 0 files merged, 0 files removed, 2 files unresolved
367 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
366 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
368 [1]
367 [1]
369 $ hg resolve -m b
368 $ hg resolve -m b
370
369
371 hg resolve with one unresolved, one resolved:
370 hg resolve with one unresolved, one resolved:
372
371
373 $ hg resolve -l
372 $ hg resolve -l
374 \x1b[0;31;1mU \x1b[0m\x1b[0;31;1ma\x1b[0m (esc)
373 \x1b[0;31;1mU \x1b[0m\x1b[0;31;1ma\x1b[0m (esc)
375 \x1b[0;32;1mR \x1b[0m\x1b[0;32;1mb\x1b[0m (esc)
374 \x1b[0;32;1mR \x1b[0m\x1b[0;32;1mb\x1b[0m (esc)
376
375
377 color coding of error message with current availability of curses
376 color coding of error message with current availability of curses
378
377
379 $ hg unknowncommand > /dev/null
378 $ hg unknowncommand > /dev/null
380 hg: unknown command 'unknowncommand'
379 hg: unknown command 'unknowncommand'
381 [255]
380 [255]
382
381
383 color coding of error message without curses
382 color coding of error message without curses
384
383
385 $ echo 'raise ImportError' > curses.py
384 $ echo 'raise ImportError' > curses.py
386 $ PYTHONPATH=`pwd`:$PYTHONPATH hg unknowncommand > /dev/null
385 $ PYTHONPATH=`pwd`:$PYTHONPATH hg unknowncommand > /dev/null
387 hg: unknown command 'unknowncommand'
386 hg: unknown command 'unknowncommand'
388 [255]
387 [255]
389
388
390 $ cd ..
389 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now