##// END OF EJS Templates
filemerge: support passing labels to external merge tools...
Kyle Lippincott -
r35981:9037c29e default
parent child Browse files
Show More
@@ -1,1295 +1,1305 b''
1 # configitems.py - centralized declaration of configuration option
1 # configitems.py - centralized declaration of configuration option
2 #
2 #
3 # Copyright 2017 Pierre-Yves David <pierre-yves.david@octobus.net>
3 # Copyright 2017 Pierre-Yves David <pierre-yves.david@octobus.net>
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 functools
10 import functools
11 import re
11 import re
12
12
13 from . import (
13 from . import (
14 encoding,
14 encoding,
15 error,
15 error,
16 )
16 )
17
17
18 def loadconfigtable(ui, extname, configtable):
18 def loadconfigtable(ui, extname, configtable):
19 """update config item known to the ui with the extension ones"""
19 """update config item known to the ui with the extension ones"""
20 for section, items in sorted(configtable.items()):
20 for section, items in sorted(configtable.items()):
21 knownitems = ui._knownconfig.setdefault(section, itemregister())
21 knownitems = ui._knownconfig.setdefault(section, itemregister())
22 knownkeys = set(knownitems)
22 knownkeys = set(knownitems)
23 newkeys = set(items)
23 newkeys = set(items)
24 for key in sorted(knownkeys & newkeys):
24 for key in sorted(knownkeys & newkeys):
25 msg = "extension '%s' overwrite config item '%s.%s'"
25 msg = "extension '%s' overwrite config item '%s.%s'"
26 msg %= (extname, section, key)
26 msg %= (extname, section, key)
27 ui.develwarn(msg, config='warn-config')
27 ui.develwarn(msg, config='warn-config')
28
28
29 knownitems.update(items)
29 knownitems.update(items)
30
30
31 class configitem(object):
31 class configitem(object):
32 """represent a known config item
32 """represent a known config item
33
33
34 :section: the official config section where to find this item,
34 :section: the official config section where to find this item,
35 :name: the official name within the section,
35 :name: the official name within the section,
36 :default: default value for this item,
36 :default: default value for this item,
37 :alias: optional list of tuples as alternatives,
37 :alias: optional list of tuples as alternatives,
38 :generic: this is a generic definition, match name using regular expression.
38 :generic: this is a generic definition, match name using regular expression.
39 """
39 """
40
40
41 def __init__(self, section, name, default=None, alias=(),
41 def __init__(self, section, name, default=None, alias=(),
42 generic=False, priority=0):
42 generic=False, priority=0):
43 self.section = section
43 self.section = section
44 self.name = name
44 self.name = name
45 self.default = default
45 self.default = default
46 self.alias = list(alias)
46 self.alias = list(alias)
47 self.generic = generic
47 self.generic = generic
48 self.priority = priority
48 self.priority = priority
49 self._re = None
49 self._re = None
50 if generic:
50 if generic:
51 self._re = re.compile(self.name)
51 self._re = re.compile(self.name)
52
52
53 class itemregister(dict):
53 class itemregister(dict):
54 """A specialized dictionary that can handle wild-card selection"""
54 """A specialized dictionary that can handle wild-card selection"""
55
55
56 def __init__(self):
56 def __init__(self):
57 super(itemregister, self).__init__()
57 super(itemregister, self).__init__()
58 self._generics = set()
58 self._generics = set()
59
59
60 def update(self, other):
60 def update(self, other):
61 super(itemregister, self).update(other)
61 super(itemregister, self).update(other)
62 self._generics.update(other._generics)
62 self._generics.update(other._generics)
63
63
64 def __setitem__(self, key, item):
64 def __setitem__(self, key, item):
65 super(itemregister, self).__setitem__(key, item)
65 super(itemregister, self).__setitem__(key, item)
66 if item.generic:
66 if item.generic:
67 self._generics.add(item)
67 self._generics.add(item)
68
68
69 def get(self, key):
69 def get(self, key):
70 baseitem = super(itemregister, self).get(key)
70 baseitem = super(itemregister, self).get(key)
71 if baseitem is not None and not baseitem.generic:
71 if baseitem is not None and not baseitem.generic:
72 return baseitem
72 return baseitem
73
73
74 # search for a matching generic item
74 # search for a matching generic item
75 generics = sorted(self._generics, key=(lambda x: (x.priority, x.name)))
75 generics = sorted(self._generics, key=(lambda x: (x.priority, x.name)))
76 for item in generics:
76 for item in generics:
77 # we use 'match' instead of 'search' to make the matching simpler
77 # we use 'match' instead of 'search' to make the matching simpler
78 # for people unfamiliar with regular expression. Having the match
78 # for people unfamiliar with regular expression. Having the match
79 # rooted to the start of the string will produce less surprising
79 # rooted to the start of the string will produce less surprising
80 # result for user writing simple regex for sub-attribute.
80 # result for user writing simple regex for sub-attribute.
81 #
81 #
82 # For example using "color\..*" match produces an unsurprising
82 # For example using "color\..*" match produces an unsurprising
83 # result, while using search could suddenly match apparently
83 # result, while using search could suddenly match apparently
84 # unrelated configuration that happens to contains "color."
84 # unrelated configuration that happens to contains "color."
85 # anywhere. This is a tradeoff where we favor requiring ".*" on
85 # anywhere. This is a tradeoff where we favor requiring ".*" on
86 # some match to avoid the need to prefix most pattern with "^".
86 # some match to avoid the need to prefix most pattern with "^".
87 # The "^" seems more error prone.
87 # The "^" seems more error prone.
88 if item._re.match(key):
88 if item._re.match(key):
89 return item
89 return item
90
90
91 return None
91 return None
92
92
93 coreitems = {}
93 coreitems = {}
94
94
95 def _register(configtable, *args, **kwargs):
95 def _register(configtable, *args, **kwargs):
96 item = configitem(*args, **kwargs)
96 item = configitem(*args, **kwargs)
97 section = configtable.setdefault(item.section, itemregister())
97 section = configtable.setdefault(item.section, itemregister())
98 if item.name in section:
98 if item.name in section:
99 msg = "duplicated config item registration for '%s.%s'"
99 msg = "duplicated config item registration for '%s.%s'"
100 raise error.ProgrammingError(msg % (item.section, item.name))
100 raise error.ProgrammingError(msg % (item.section, item.name))
101 section[item.name] = item
101 section[item.name] = item
102
102
103 # special value for case where the default is derived from other values
103 # special value for case where the default is derived from other values
104 dynamicdefault = object()
104 dynamicdefault = object()
105
105
106 # Registering actual config items
106 # Registering actual config items
107
107
108 def getitemregister(configtable):
108 def getitemregister(configtable):
109 f = functools.partial(_register, configtable)
109 f = functools.partial(_register, configtable)
110 # export pseudo enum as configitem.*
110 # export pseudo enum as configitem.*
111 f.dynamicdefault = dynamicdefault
111 f.dynamicdefault = dynamicdefault
112 return f
112 return f
113
113
114 coreconfigitem = getitemregister(coreitems)
114 coreconfigitem = getitemregister(coreitems)
115
115
116 coreconfigitem('alias', '.*',
116 coreconfigitem('alias', '.*',
117 default=None,
117 default=None,
118 generic=True,
118 generic=True,
119 )
119 )
120 coreconfigitem('annotate', 'nodates',
120 coreconfigitem('annotate', 'nodates',
121 default=False,
121 default=False,
122 )
122 )
123 coreconfigitem('annotate', 'showfunc',
123 coreconfigitem('annotate', 'showfunc',
124 default=False,
124 default=False,
125 )
125 )
126 coreconfigitem('annotate', 'unified',
126 coreconfigitem('annotate', 'unified',
127 default=None,
127 default=None,
128 )
128 )
129 coreconfigitem('annotate', 'git',
129 coreconfigitem('annotate', 'git',
130 default=False,
130 default=False,
131 )
131 )
132 coreconfigitem('annotate', 'ignorews',
132 coreconfigitem('annotate', 'ignorews',
133 default=False,
133 default=False,
134 )
134 )
135 coreconfigitem('annotate', 'ignorewsamount',
135 coreconfigitem('annotate', 'ignorewsamount',
136 default=False,
136 default=False,
137 )
137 )
138 coreconfigitem('annotate', 'ignoreblanklines',
138 coreconfigitem('annotate', 'ignoreblanklines',
139 default=False,
139 default=False,
140 )
140 )
141 coreconfigitem('annotate', 'ignorewseol',
141 coreconfigitem('annotate', 'ignorewseol',
142 default=False,
142 default=False,
143 )
143 )
144 coreconfigitem('annotate', 'nobinary',
144 coreconfigitem('annotate', 'nobinary',
145 default=False,
145 default=False,
146 )
146 )
147 coreconfigitem('annotate', 'noprefix',
147 coreconfigitem('annotate', 'noprefix',
148 default=False,
148 default=False,
149 )
149 )
150 coreconfigitem('auth', 'cookiefile',
150 coreconfigitem('auth', 'cookiefile',
151 default=None,
151 default=None,
152 )
152 )
153 # bookmarks.pushing: internal hack for discovery
153 # bookmarks.pushing: internal hack for discovery
154 coreconfigitem('bookmarks', 'pushing',
154 coreconfigitem('bookmarks', 'pushing',
155 default=list,
155 default=list,
156 )
156 )
157 # bundle.mainreporoot: internal hack for bundlerepo
157 # bundle.mainreporoot: internal hack for bundlerepo
158 coreconfigitem('bundle', 'mainreporoot',
158 coreconfigitem('bundle', 'mainreporoot',
159 default='',
159 default='',
160 )
160 )
161 # bundle.reorder: experimental config
161 # bundle.reorder: experimental config
162 coreconfigitem('bundle', 'reorder',
162 coreconfigitem('bundle', 'reorder',
163 default='auto',
163 default='auto',
164 )
164 )
165 coreconfigitem('censor', 'policy',
165 coreconfigitem('censor', 'policy',
166 default='abort',
166 default='abort',
167 )
167 )
168 coreconfigitem('chgserver', 'idletimeout',
168 coreconfigitem('chgserver', 'idletimeout',
169 default=3600,
169 default=3600,
170 )
170 )
171 coreconfigitem('chgserver', 'skiphash',
171 coreconfigitem('chgserver', 'skiphash',
172 default=False,
172 default=False,
173 )
173 )
174 coreconfigitem('cmdserver', 'log',
174 coreconfigitem('cmdserver', 'log',
175 default=None,
175 default=None,
176 )
176 )
177 coreconfigitem('color', '.*',
177 coreconfigitem('color', '.*',
178 default=None,
178 default=None,
179 generic=True,
179 generic=True,
180 )
180 )
181 coreconfigitem('color', 'mode',
181 coreconfigitem('color', 'mode',
182 default='auto',
182 default='auto',
183 )
183 )
184 coreconfigitem('color', 'pagermode',
184 coreconfigitem('color', 'pagermode',
185 default=dynamicdefault,
185 default=dynamicdefault,
186 )
186 )
187 coreconfigitem('commands', 'show.aliasprefix',
187 coreconfigitem('commands', 'show.aliasprefix',
188 default=list,
188 default=list,
189 )
189 )
190 coreconfigitem('commands', 'status.relative',
190 coreconfigitem('commands', 'status.relative',
191 default=False,
191 default=False,
192 )
192 )
193 coreconfigitem('commands', 'status.skipstates',
193 coreconfigitem('commands', 'status.skipstates',
194 default=[],
194 default=[],
195 )
195 )
196 coreconfigitem('commands', 'status.verbose',
196 coreconfigitem('commands', 'status.verbose',
197 default=False,
197 default=False,
198 )
198 )
199 coreconfigitem('commands', 'update.check',
199 coreconfigitem('commands', 'update.check',
200 default=None,
200 default=None,
201 # Deprecated, remove after 4.4 release
201 # Deprecated, remove after 4.4 release
202 alias=[('experimental', 'updatecheck')]
202 alias=[('experimental', 'updatecheck')]
203 )
203 )
204 coreconfigitem('commands', 'update.requiredest',
204 coreconfigitem('commands', 'update.requiredest',
205 default=False,
205 default=False,
206 )
206 )
207 coreconfigitem('committemplate', '.*',
207 coreconfigitem('committemplate', '.*',
208 default=None,
208 default=None,
209 generic=True,
209 generic=True,
210 )
210 )
211 coreconfigitem('convert', 'cvsps.cache',
211 coreconfigitem('convert', 'cvsps.cache',
212 default=True,
212 default=True,
213 )
213 )
214 coreconfigitem('convert', 'cvsps.fuzz',
214 coreconfigitem('convert', 'cvsps.fuzz',
215 default=60,
215 default=60,
216 )
216 )
217 coreconfigitem('convert', 'cvsps.logencoding',
217 coreconfigitem('convert', 'cvsps.logencoding',
218 default=None,
218 default=None,
219 )
219 )
220 coreconfigitem('convert', 'cvsps.mergefrom',
220 coreconfigitem('convert', 'cvsps.mergefrom',
221 default=None,
221 default=None,
222 )
222 )
223 coreconfigitem('convert', 'cvsps.mergeto',
223 coreconfigitem('convert', 'cvsps.mergeto',
224 default=None,
224 default=None,
225 )
225 )
226 coreconfigitem('convert', 'git.committeractions',
226 coreconfigitem('convert', 'git.committeractions',
227 default=lambda: ['messagedifferent'],
227 default=lambda: ['messagedifferent'],
228 )
228 )
229 coreconfigitem('convert', 'git.extrakeys',
229 coreconfigitem('convert', 'git.extrakeys',
230 default=list,
230 default=list,
231 )
231 )
232 coreconfigitem('convert', 'git.findcopiesharder',
232 coreconfigitem('convert', 'git.findcopiesharder',
233 default=False,
233 default=False,
234 )
234 )
235 coreconfigitem('convert', 'git.remoteprefix',
235 coreconfigitem('convert', 'git.remoteprefix',
236 default='remote',
236 default='remote',
237 )
237 )
238 coreconfigitem('convert', 'git.renamelimit',
238 coreconfigitem('convert', 'git.renamelimit',
239 default=400,
239 default=400,
240 )
240 )
241 coreconfigitem('convert', 'git.saverev',
241 coreconfigitem('convert', 'git.saverev',
242 default=True,
242 default=True,
243 )
243 )
244 coreconfigitem('convert', 'git.similarity',
244 coreconfigitem('convert', 'git.similarity',
245 default=50,
245 default=50,
246 )
246 )
247 coreconfigitem('convert', 'git.skipsubmodules',
247 coreconfigitem('convert', 'git.skipsubmodules',
248 default=False,
248 default=False,
249 )
249 )
250 coreconfigitem('convert', 'hg.clonebranches',
250 coreconfigitem('convert', 'hg.clonebranches',
251 default=False,
251 default=False,
252 )
252 )
253 coreconfigitem('convert', 'hg.ignoreerrors',
253 coreconfigitem('convert', 'hg.ignoreerrors',
254 default=False,
254 default=False,
255 )
255 )
256 coreconfigitem('convert', 'hg.revs',
256 coreconfigitem('convert', 'hg.revs',
257 default=None,
257 default=None,
258 )
258 )
259 coreconfigitem('convert', 'hg.saverev',
259 coreconfigitem('convert', 'hg.saverev',
260 default=False,
260 default=False,
261 )
261 )
262 coreconfigitem('convert', 'hg.sourcename',
262 coreconfigitem('convert', 'hg.sourcename',
263 default=None,
263 default=None,
264 )
264 )
265 coreconfigitem('convert', 'hg.startrev',
265 coreconfigitem('convert', 'hg.startrev',
266 default=None,
266 default=None,
267 )
267 )
268 coreconfigitem('convert', 'hg.tagsbranch',
268 coreconfigitem('convert', 'hg.tagsbranch',
269 default='default',
269 default='default',
270 )
270 )
271 coreconfigitem('convert', 'hg.usebranchnames',
271 coreconfigitem('convert', 'hg.usebranchnames',
272 default=True,
272 default=True,
273 )
273 )
274 coreconfigitem('convert', 'ignoreancestorcheck',
274 coreconfigitem('convert', 'ignoreancestorcheck',
275 default=False,
275 default=False,
276 )
276 )
277 coreconfigitem('convert', 'localtimezone',
277 coreconfigitem('convert', 'localtimezone',
278 default=False,
278 default=False,
279 )
279 )
280 coreconfigitem('convert', 'p4.encoding',
280 coreconfigitem('convert', 'p4.encoding',
281 default=dynamicdefault,
281 default=dynamicdefault,
282 )
282 )
283 coreconfigitem('convert', 'p4.startrev',
283 coreconfigitem('convert', 'p4.startrev',
284 default=0,
284 default=0,
285 )
285 )
286 coreconfigitem('convert', 'skiptags',
286 coreconfigitem('convert', 'skiptags',
287 default=False,
287 default=False,
288 )
288 )
289 coreconfigitem('convert', 'svn.debugsvnlog',
289 coreconfigitem('convert', 'svn.debugsvnlog',
290 default=True,
290 default=True,
291 )
291 )
292 coreconfigitem('convert', 'svn.trunk',
292 coreconfigitem('convert', 'svn.trunk',
293 default=None,
293 default=None,
294 )
294 )
295 coreconfigitem('convert', 'svn.tags',
295 coreconfigitem('convert', 'svn.tags',
296 default=None,
296 default=None,
297 )
297 )
298 coreconfigitem('convert', 'svn.branches',
298 coreconfigitem('convert', 'svn.branches',
299 default=None,
299 default=None,
300 )
300 )
301 coreconfigitem('convert', 'svn.startrev',
301 coreconfigitem('convert', 'svn.startrev',
302 default=0,
302 default=0,
303 )
303 )
304 coreconfigitem('debug', 'dirstate.delaywrite',
304 coreconfigitem('debug', 'dirstate.delaywrite',
305 default=0,
305 default=0,
306 )
306 )
307 coreconfigitem('defaults', '.*',
307 coreconfigitem('defaults', '.*',
308 default=None,
308 default=None,
309 generic=True,
309 generic=True,
310 )
310 )
311 coreconfigitem('devel', 'all-warnings',
311 coreconfigitem('devel', 'all-warnings',
312 default=False,
312 default=False,
313 )
313 )
314 coreconfigitem('devel', 'bundle2.debug',
314 coreconfigitem('devel', 'bundle2.debug',
315 default=False,
315 default=False,
316 )
316 )
317 coreconfigitem('devel', 'cache-vfs',
317 coreconfigitem('devel', 'cache-vfs',
318 default=None,
318 default=None,
319 )
319 )
320 coreconfigitem('devel', 'check-locks',
320 coreconfigitem('devel', 'check-locks',
321 default=False,
321 default=False,
322 )
322 )
323 coreconfigitem('devel', 'check-relroot',
323 coreconfigitem('devel', 'check-relroot',
324 default=False,
324 default=False,
325 )
325 )
326 coreconfigitem('devel', 'default-date',
326 coreconfigitem('devel', 'default-date',
327 default=None,
327 default=None,
328 )
328 )
329 coreconfigitem('devel', 'deprec-warn',
329 coreconfigitem('devel', 'deprec-warn',
330 default=False,
330 default=False,
331 )
331 )
332 coreconfigitem('devel', 'disableloaddefaultcerts',
332 coreconfigitem('devel', 'disableloaddefaultcerts',
333 default=False,
333 default=False,
334 )
334 )
335 coreconfigitem('devel', 'warn-empty-changegroup',
335 coreconfigitem('devel', 'warn-empty-changegroup',
336 default=False,
336 default=False,
337 )
337 )
338 coreconfigitem('devel', 'legacy.exchange',
338 coreconfigitem('devel', 'legacy.exchange',
339 default=list,
339 default=list,
340 )
340 )
341 coreconfigitem('devel', 'servercafile',
341 coreconfigitem('devel', 'servercafile',
342 default='',
342 default='',
343 )
343 )
344 coreconfigitem('devel', 'serverexactprotocol',
344 coreconfigitem('devel', 'serverexactprotocol',
345 default='',
345 default='',
346 )
346 )
347 coreconfigitem('devel', 'serverrequirecert',
347 coreconfigitem('devel', 'serverrequirecert',
348 default=False,
348 default=False,
349 )
349 )
350 coreconfigitem('devel', 'strip-obsmarkers',
350 coreconfigitem('devel', 'strip-obsmarkers',
351 default=True,
351 default=True,
352 )
352 )
353 coreconfigitem('devel', 'warn-config',
353 coreconfigitem('devel', 'warn-config',
354 default=None,
354 default=None,
355 )
355 )
356 coreconfigitem('devel', 'warn-config-default',
356 coreconfigitem('devel', 'warn-config-default',
357 default=None,
357 default=None,
358 )
358 )
359 coreconfigitem('devel', 'user.obsmarker',
359 coreconfigitem('devel', 'user.obsmarker',
360 default=None,
360 default=None,
361 )
361 )
362 coreconfigitem('devel', 'warn-config-unknown',
362 coreconfigitem('devel', 'warn-config-unknown',
363 default=None,
363 default=None,
364 )
364 )
365 coreconfigitem('devel', 'debug.peer-request',
365 coreconfigitem('devel', 'debug.peer-request',
366 default=False,
366 default=False,
367 )
367 )
368 coreconfigitem('diff', 'nodates',
368 coreconfigitem('diff', 'nodates',
369 default=False,
369 default=False,
370 )
370 )
371 coreconfigitem('diff', 'showfunc',
371 coreconfigitem('diff', 'showfunc',
372 default=False,
372 default=False,
373 )
373 )
374 coreconfigitem('diff', 'unified',
374 coreconfigitem('diff', 'unified',
375 default=None,
375 default=None,
376 )
376 )
377 coreconfigitem('diff', 'git',
377 coreconfigitem('diff', 'git',
378 default=False,
378 default=False,
379 )
379 )
380 coreconfigitem('diff', 'ignorews',
380 coreconfigitem('diff', 'ignorews',
381 default=False,
381 default=False,
382 )
382 )
383 coreconfigitem('diff', 'ignorewsamount',
383 coreconfigitem('diff', 'ignorewsamount',
384 default=False,
384 default=False,
385 )
385 )
386 coreconfigitem('diff', 'ignoreblanklines',
386 coreconfigitem('diff', 'ignoreblanklines',
387 default=False,
387 default=False,
388 )
388 )
389 coreconfigitem('diff', 'ignorewseol',
389 coreconfigitem('diff', 'ignorewseol',
390 default=False,
390 default=False,
391 )
391 )
392 coreconfigitem('diff', 'nobinary',
392 coreconfigitem('diff', 'nobinary',
393 default=False,
393 default=False,
394 )
394 )
395 coreconfigitem('diff', 'noprefix',
395 coreconfigitem('diff', 'noprefix',
396 default=False,
396 default=False,
397 )
397 )
398 coreconfigitem('email', 'bcc',
398 coreconfigitem('email', 'bcc',
399 default=None,
399 default=None,
400 )
400 )
401 coreconfigitem('email', 'cc',
401 coreconfigitem('email', 'cc',
402 default=None,
402 default=None,
403 )
403 )
404 coreconfigitem('email', 'charsets',
404 coreconfigitem('email', 'charsets',
405 default=list,
405 default=list,
406 )
406 )
407 coreconfigitem('email', 'from',
407 coreconfigitem('email', 'from',
408 default=None,
408 default=None,
409 )
409 )
410 coreconfigitem('email', 'method',
410 coreconfigitem('email', 'method',
411 default='smtp',
411 default='smtp',
412 )
412 )
413 coreconfigitem('email', 'reply-to',
413 coreconfigitem('email', 'reply-to',
414 default=None,
414 default=None,
415 )
415 )
416 coreconfigitem('email', 'to',
416 coreconfigitem('email', 'to',
417 default=None,
417 default=None,
418 )
418 )
419 coreconfigitem('experimental', 'archivemetatemplate',
419 coreconfigitem('experimental', 'archivemetatemplate',
420 default=dynamicdefault,
420 default=dynamicdefault,
421 )
421 )
422 coreconfigitem('experimental', 'bundle-phases',
422 coreconfigitem('experimental', 'bundle-phases',
423 default=False,
423 default=False,
424 )
424 )
425 coreconfigitem('experimental', 'bundle2-advertise',
425 coreconfigitem('experimental', 'bundle2-advertise',
426 default=True,
426 default=True,
427 )
427 )
428 coreconfigitem('experimental', 'bundle2-output-capture',
428 coreconfigitem('experimental', 'bundle2-output-capture',
429 default=False,
429 default=False,
430 )
430 )
431 coreconfigitem('experimental', 'bundle2.pushback',
431 coreconfigitem('experimental', 'bundle2.pushback',
432 default=False,
432 default=False,
433 )
433 )
434 coreconfigitem('experimental', 'bundle2.stream',
434 coreconfigitem('experimental', 'bundle2.stream',
435 default=False,
435 default=False,
436 )
436 )
437 coreconfigitem('experimental', 'bundle2lazylocking',
437 coreconfigitem('experimental', 'bundle2lazylocking',
438 default=False,
438 default=False,
439 )
439 )
440 coreconfigitem('experimental', 'bundlecomplevel',
440 coreconfigitem('experimental', 'bundlecomplevel',
441 default=None,
441 default=None,
442 )
442 )
443 coreconfigitem('experimental', 'changegroup3',
443 coreconfigitem('experimental', 'changegroup3',
444 default=False,
444 default=False,
445 )
445 )
446 coreconfigitem('experimental', 'clientcompressionengines',
446 coreconfigitem('experimental', 'clientcompressionengines',
447 default=list,
447 default=list,
448 )
448 )
449 coreconfigitem('experimental', 'copytrace',
449 coreconfigitem('experimental', 'copytrace',
450 default='on',
450 default='on',
451 )
451 )
452 coreconfigitem('experimental', 'copytrace.movecandidateslimit',
452 coreconfigitem('experimental', 'copytrace.movecandidateslimit',
453 default=100,
453 default=100,
454 )
454 )
455 coreconfigitem('experimental', 'copytrace.sourcecommitlimit',
455 coreconfigitem('experimental', 'copytrace.sourcecommitlimit',
456 default=100,
456 default=100,
457 )
457 )
458 coreconfigitem('experimental', 'crecordtest',
458 coreconfigitem('experimental', 'crecordtest',
459 default=None,
459 default=None,
460 )
460 )
461 coreconfigitem('experimental', 'directaccess',
461 coreconfigitem('experimental', 'directaccess',
462 default=False,
462 default=False,
463 )
463 )
464 coreconfigitem('experimental', 'directaccess.revnums',
464 coreconfigitem('experimental', 'directaccess.revnums',
465 default=False,
465 default=False,
466 )
466 )
467 coreconfigitem('experimental', 'editortmpinhg',
467 coreconfigitem('experimental', 'editortmpinhg',
468 default=False,
468 default=False,
469 )
469 )
470 coreconfigitem('experimental', 'evolution',
470 coreconfigitem('experimental', 'evolution',
471 default=list,
471 default=list,
472 )
472 )
473 coreconfigitem('experimental', 'evolution.allowdivergence',
473 coreconfigitem('experimental', 'evolution.allowdivergence',
474 default=False,
474 default=False,
475 alias=[('experimental', 'allowdivergence')]
475 alias=[('experimental', 'allowdivergence')]
476 )
476 )
477 coreconfigitem('experimental', 'evolution.allowunstable',
477 coreconfigitem('experimental', 'evolution.allowunstable',
478 default=None,
478 default=None,
479 )
479 )
480 coreconfigitem('experimental', 'evolution.createmarkers',
480 coreconfigitem('experimental', 'evolution.createmarkers',
481 default=None,
481 default=None,
482 )
482 )
483 coreconfigitem('experimental', 'evolution.effect-flags',
483 coreconfigitem('experimental', 'evolution.effect-flags',
484 default=True,
484 default=True,
485 alias=[('experimental', 'effect-flags')]
485 alias=[('experimental', 'effect-flags')]
486 )
486 )
487 coreconfigitem('experimental', 'evolution.exchange',
487 coreconfigitem('experimental', 'evolution.exchange',
488 default=None,
488 default=None,
489 )
489 )
490 coreconfigitem('experimental', 'evolution.bundle-obsmarker',
490 coreconfigitem('experimental', 'evolution.bundle-obsmarker',
491 default=False,
491 default=False,
492 )
492 )
493 coreconfigitem('experimental', 'evolution.report-instabilities',
493 coreconfigitem('experimental', 'evolution.report-instabilities',
494 default=True,
494 default=True,
495 )
495 )
496 coreconfigitem('experimental', 'evolution.track-operation',
496 coreconfigitem('experimental', 'evolution.track-operation',
497 default=True,
497 default=True,
498 )
498 )
499 coreconfigitem('experimental', 'worddiff',
499 coreconfigitem('experimental', 'worddiff',
500 default=False,
500 default=False,
501 )
501 )
502 coreconfigitem('experimental', 'maxdeltachainspan',
502 coreconfigitem('experimental', 'maxdeltachainspan',
503 default=-1,
503 default=-1,
504 )
504 )
505 coreconfigitem('experimental', 'mmapindexthreshold',
505 coreconfigitem('experimental', 'mmapindexthreshold',
506 default=None,
506 default=None,
507 )
507 )
508 coreconfigitem('experimental', 'nonnormalparanoidcheck',
508 coreconfigitem('experimental', 'nonnormalparanoidcheck',
509 default=False,
509 default=False,
510 )
510 )
511 coreconfigitem('experimental', 'exportableenviron',
511 coreconfigitem('experimental', 'exportableenviron',
512 default=list,
512 default=list,
513 )
513 )
514 coreconfigitem('experimental', 'extendedheader.index',
514 coreconfigitem('experimental', 'extendedheader.index',
515 default=None,
515 default=None,
516 )
516 )
517 coreconfigitem('experimental', 'extendedheader.similarity',
517 coreconfigitem('experimental', 'extendedheader.similarity',
518 default=False,
518 default=False,
519 )
519 )
520 coreconfigitem('experimental', 'format.compression',
520 coreconfigitem('experimental', 'format.compression',
521 default='zlib',
521 default='zlib',
522 )
522 )
523 coreconfigitem('experimental', 'graphshorten',
523 coreconfigitem('experimental', 'graphshorten',
524 default=False,
524 default=False,
525 )
525 )
526 coreconfigitem('experimental', 'graphstyle.parent',
526 coreconfigitem('experimental', 'graphstyle.parent',
527 default=dynamicdefault,
527 default=dynamicdefault,
528 )
528 )
529 coreconfigitem('experimental', 'graphstyle.missing',
529 coreconfigitem('experimental', 'graphstyle.missing',
530 default=dynamicdefault,
530 default=dynamicdefault,
531 )
531 )
532 coreconfigitem('experimental', 'graphstyle.grandparent',
532 coreconfigitem('experimental', 'graphstyle.grandparent',
533 default=dynamicdefault,
533 default=dynamicdefault,
534 )
534 )
535 coreconfigitem('experimental', 'hook-track-tags',
535 coreconfigitem('experimental', 'hook-track-tags',
536 default=False,
536 default=False,
537 )
537 )
538 coreconfigitem('experimental', 'httppostargs',
538 coreconfigitem('experimental', 'httppostargs',
539 default=False,
539 default=False,
540 )
540 )
541 coreconfigitem('experimental', 'manifestv2',
541 coreconfigitem('experimental', 'manifestv2',
542 default=False,
542 default=False,
543 )
543 )
544 coreconfigitem('experimental', 'mergedriver',
544 coreconfigitem('experimental', 'mergedriver',
545 default=None,
545 default=None,
546 )
546 )
547 coreconfigitem('experimental', 'obsmarkers-exchange-debug',
547 coreconfigitem('experimental', 'obsmarkers-exchange-debug',
548 default=False,
548 default=False,
549 )
549 )
550 coreconfigitem('experimental', 'remotenames',
550 coreconfigitem('experimental', 'remotenames',
551 default=False,
551 default=False,
552 )
552 )
553 coreconfigitem('experimental', 'revlogv2',
553 coreconfigitem('experimental', 'revlogv2',
554 default=None,
554 default=None,
555 )
555 )
556 coreconfigitem('experimental', 'single-head-per-branch',
556 coreconfigitem('experimental', 'single-head-per-branch',
557 default=False,
557 default=False,
558 )
558 )
559 coreconfigitem('experimental', 'spacemovesdown',
559 coreconfigitem('experimental', 'spacemovesdown',
560 default=False,
560 default=False,
561 )
561 )
562 coreconfigitem('experimental', 'sparse-read',
562 coreconfigitem('experimental', 'sparse-read',
563 default=False,
563 default=False,
564 )
564 )
565 coreconfigitem('experimental', 'sparse-read.density-threshold',
565 coreconfigitem('experimental', 'sparse-read.density-threshold',
566 default=0.25,
566 default=0.25,
567 )
567 )
568 coreconfigitem('experimental', 'sparse-read.min-gap-size',
568 coreconfigitem('experimental', 'sparse-read.min-gap-size',
569 default='256K',
569 default='256K',
570 )
570 )
571 coreconfigitem('experimental', 'treemanifest',
571 coreconfigitem('experimental', 'treemanifest',
572 default=False,
572 default=False,
573 )
573 )
574 coreconfigitem('experimental', 'update.atomic-file',
574 coreconfigitem('experimental', 'update.atomic-file',
575 default=False,
575 default=False,
576 )
576 )
577 coreconfigitem('extensions', '.*',
577 coreconfigitem('extensions', '.*',
578 default=None,
578 default=None,
579 generic=True,
579 generic=True,
580 )
580 )
581 coreconfigitem('extdata', '.*',
581 coreconfigitem('extdata', '.*',
582 default=None,
582 default=None,
583 generic=True,
583 generic=True,
584 )
584 )
585 coreconfigitem('format', 'aggressivemergedeltas',
585 coreconfigitem('format', 'aggressivemergedeltas',
586 default=False,
586 default=False,
587 )
587 )
588 coreconfigitem('format', 'chunkcachesize',
588 coreconfigitem('format', 'chunkcachesize',
589 default=None,
589 default=None,
590 )
590 )
591 coreconfigitem('format', 'dotencode',
591 coreconfigitem('format', 'dotencode',
592 default=True,
592 default=True,
593 )
593 )
594 coreconfigitem('format', 'generaldelta',
594 coreconfigitem('format', 'generaldelta',
595 default=False,
595 default=False,
596 )
596 )
597 coreconfigitem('format', 'manifestcachesize',
597 coreconfigitem('format', 'manifestcachesize',
598 default=None,
598 default=None,
599 )
599 )
600 coreconfigitem('format', 'maxchainlen',
600 coreconfigitem('format', 'maxchainlen',
601 default=None,
601 default=None,
602 )
602 )
603 coreconfigitem('format', 'obsstore-version',
603 coreconfigitem('format', 'obsstore-version',
604 default=None,
604 default=None,
605 )
605 )
606 coreconfigitem('format', 'usefncache',
606 coreconfigitem('format', 'usefncache',
607 default=True,
607 default=True,
608 )
608 )
609 coreconfigitem('format', 'usegeneraldelta',
609 coreconfigitem('format', 'usegeneraldelta',
610 default=True,
610 default=True,
611 )
611 )
612 coreconfigitem('format', 'usestore',
612 coreconfigitem('format', 'usestore',
613 default=True,
613 default=True,
614 )
614 )
615 coreconfigitem('fsmonitor', 'warn_when_unused',
615 coreconfigitem('fsmonitor', 'warn_when_unused',
616 default=True,
616 default=True,
617 )
617 )
618 coreconfigitem('fsmonitor', 'warn_update_file_count',
618 coreconfigitem('fsmonitor', 'warn_update_file_count',
619 default=50000,
619 default=50000,
620 )
620 )
621 coreconfigitem('hooks', '.*',
621 coreconfigitem('hooks', '.*',
622 default=dynamicdefault,
622 default=dynamicdefault,
623 generic=True,
623 generic=True,
624 )
624 )
625 coreconfigitem('hgweb-paths', '.*',
625 coreconfigitem('hgweb-paths', '.*',
626 default=list,
626 default=list,
627 generic=True,
627 generic=True,
628 )
628 )
629 coreconfigitem('hostfingerprints', '.*',
629 coreconfigitem('hostfingerprints', '.*',
630 default=list,
630 default=list,
631 generic=True,
631 generic=True,
632 )
632 )
633 coreconfigitem('hostsecurity', 'ciphers',
633 coreconfigitem('hostsecurity', 'ciphers',
634 default=None,
634 default=None,
635 )
635 )
636 coreconfigitem('hostsecurity', 'disabletls10warning',
636 coreconfigitem('hostsecurity', 'disabletls10warning',
637 default=False,
637 default=False,
638 )
638 )
639 coreconfigitem('hostsecurity', 'minimumprotocol',
639 coreconfigitem('hostsecurity', 'minimumprotocol',
640 default=dynamicdefault,
640 default=dynamicdefault,
641 )
641 )
642 coreconfigitem('hostsecurity', '.*:minimumprotocol$',
642 coreconfigitem('hostsecurity', '.*:minimumprotocol$',
643 default=dynamicdefault,
643 default=dynamicdefault,
644 generic=True,
644 generic=True,
645 )
645 )
646 coreconfigitem('hostsecurity', '.*:ciphers$',
646 coreconfigitem('hostsecurity', '.*:ciphers$',
647 default=dynamicdefault,
647 default=dynamicdefault,
648 generic=True,
648 generic=True,
649 )
649 )
650 coreconfigitem('hostsecurity', '.*:fingerprints$',
650 coreconfigitem('hostsecurity', '.*:fingerprints$',
651 default=list,
651 default=list,
652 generic=True,
652 generic=True,
653 )
653 )
654 coreconfigitem('hostsecurity', '.*:verifycertsfile$',
654 coreconfigitem('hostsecurity', '.*:verifycertsfile$',
655 default=None,
655 default=None,
656 generic=True,
656 generic=True,
657 )
657 )
658
658
659 coreconfigitem('http_proxy', 'always',
659 coreconfigitem('http_proxy', 'always',
660 default=False,
660 default=False,
661 )
661 )
662 coreconfigitem('http_proxy', 'host',
662 coreconfigitem('http_proxy', 'host',
663 default=None,
663 default=None,
664 )
664 )
665 coreconfigitem('http_proxy', 'no',
665 coreconfigitem('http_proxy', 'no',
666 default=list,
666 default=list,
667 )
667 )
668 coreconfigitem('http_proxy', 'passwd',
668 coreconfigitem('http_proxy', 'passwd',
669 default=None,
669 default=None,
670 )
670 )
671 coreconfigitem('http_proxy', 'user',
671 coreconfigitem('http_proxy', 'user',
672 default=None,
672 default=None,
673 )
673 )
674 coreconfigitem('logtoprocess', 'commandexception',
674 coreconfigitem('logtoprocess', 'commandexception',
675 default=None,
675 default=None,
676 )
676 )
677 coreconfigitem('logtoprocess', 'commandfinish',
677 coreconfigitem('logtoprocess', 'commandfinish',
678 default=None,
678 default=None,
679 )
679 )
680 coreconfigitem('logtoprocess', 'command',
680 coreconfigitem('logtoprocess', 'command',
681 default=None,
681 default=None,
682 )
682 )
683 coreconfigitem('logtoprocess', 'develwarn',
683 coreconfigitem('logtoprocess', 'develwarn',
684 default=None,
684 default=None,
685 )
685 )
686 coreconfigitem('logtoprocess', 'uiblocked',
686 coreconfigitem('logtoprocess', 'uiblocked',
687 default=None,
687 default=None,
688 )
688 )
689 coreconfigitem('merge', 'checkunknown',
689 coreconfigitem('merge', 'checkunknown',
690 default='abort',
690 default='abort',
691 )
691 )
692 coreconfigitem('merge', 'checkignored',
692 coreconfigitem('merge', 'checkignored',
693 default='abort',
693 default='abort',
694 )
694 )
695 coreconfigitem('experimental', 'merge.checkpathconflicts',
695 coreconfigitem('experimental', 'merge.checkpathconflicts',
696 default=False,
696 default=False,
697 )
697 )
698 coreconfigitem('merge', 'followcopies',
698 coreconfigitem('merge', 'followcopies',
699 default=True,
699 default=True,
700 )
700 )
701 coreconfigitem('merge', 'on-failure',
701 coreconfigitem('merge', 'on-failure',
702 default='continue',
702 default='continue',
703 )
703 )
704 coreconfigitem('merge', 'preferancestor',
704 coreconfigitem('merge', 'preferancestor',
705 default=lambda: ['*'],
705 default=lambda: ['*'],
706 )
706 )
707 coreconfigitem('merge-tools', '.*',
707 coreconfigitem('merge-tools', '.*',
708 default=None,
708 default=None,
709 generic=True,
709 generic=True,
710 )
710 )
711 coreconfigitem('merge-tools', br'.*\.args$',
711 coreconfigitem('merge-tools', br'.*\.args$',
712 default="$local $base $other",
712 default="$local $base $other",
713 generic=True,
713 generic=True,
714 priority=-1,
714 priority=-1,
715 )
715 )
716 coreconfigitem('merge-tools', br'.*\.binary$',
716 coreconfigitem('merge-tools', br'.*\.binary$',
717 default=False,
717 default=False,
718 generic=True,
718 generic=True,
719 priority=-1,
719 priority=-1,
720 )
720 )
721 coreconfigitem('merge-tools', br'.*\.check$',
721 coreconfigitem('merge-tools', br'.*\.check$',
722 default=list,
722 default=list,
723 generic=True,
723 generic=True,
724 priority=-1,
724 priority=-1,
725 )
725 )
726 coreconfigitem('merge-tools', br'.*\.checkchanged$',
726 coreconfigitem('merge-tools', br'.*\.checkchanged$',
727 default=False,
727 default=False,
728 generic=True,
728 generic=True,
729 priority=-1,
729 priority=-1,
730 )
730 )
731 coreconfigitem('merge-tools', br'.*\.executable$',
731 coreconfigitem('merge-tools', br'.*\.executable$',
732 default=dynamicdefault,
732 default=dynamicdefault,
733 generic=True,
733 generic=True,
734 priority=-1,
734 priority=-1,
735 )
735 )
736 coreconfigitem('merge-tools', br'.*\.fixeol$',
736 coreconfigitem('merge-tools', br'.*\.fixeol$',
737 default=False,
737 default=False,
738 generic=True,
738 generic=True,
739 priority=-1,
739 priority=-1,
740 )
740 )
741 coreconfigitem('merge-tools', br'.*\.gui$',
741 coreconfigitem('merge-tools', br'.*\.gui$',
742 default=False,
742 default=False,
743 generic=True,
743 generic=True,
744 priority=-1,
744 priority=-1,
745 )
745 )
746 coreconfigitem('merge-tools', br'.*\.mergemarkers$',
747 default='basic',
748 generic=True,
749 priority=-1,
750 )
751 coreconfigitem('merge-tools', br'.*\.mergemarkertemplate$',
752 default=dynamicdefault, # take from ui.mergemarkertemplate
753 generic=True,
754 priority=-1,
755 )
746 coreconfigitem('merge-tools', br'.*\.priority$',
756 coreconfigitem('merge-tools', br'.*\.priority$',
747 default=0,
757 default=0,
748 generic=True,
758 generic=True,
749 priority=-1,
759 priority=-1,
750 )
760 )
751 coreconfigitem('merge-tools', br'.*\.premerge$',
761 coreconfigitem('merge-tools', br'.*\.premerge$',
752 default=dynamicdefault,
762 default=dynamicdefault,
753 generic=True,
763 generic=True,
754 priority=-1,
764 priority=-1,
755 )
765 )
756 coreconfigitem('merge-tools', br'.*\.symlink$',
766 coreconfigitem('merge-tools', br'.*\.symlink$',
757 default=False,
767 default=False,
758 generic=True,
768 generic=True,
759 priority=-1,
769 priority=-1,
760 )
770 )
761 coreconfigitem('pager', 'attend-.*',
771 coreconfigitem('pager', 'attend-.*',
762 default=dynamicdefault,
772 default=dynamicdefault,
763 generic=True,
773 generic=True,
764 )
774 )
765 coreconfigitem('pager', 'ignore',
775 coreconfigitem('pager', 'ignore',
766 default=list,
776 default=list,
767 )
777 )
768 coreconfigitem('pager', 'pager',
778 coreconfigitem('pager', 'pager',
769 default=dynamicdefault,
779 default=dynamicdefault,
770 )
780 )
771 coreconfigitem('patch', 'eol',
781 coreconfigitem('patch', 'eol',
772 default='strict',
782 default='strict',
773 )
783 )
774 coreconfigitem('patch', 'fuzz',
784 coreconfigitem('patch', 'fuzz',
775 default=2,
785 default=2,
776 )
786 )
777 coreconfigitem('paths', 'default',
787 coreconfigitem('paths', 'default',
778 default=None,
788 default=None,
779 )
789 )
780 coreconfigitem('paths', 'default-push',
790 coreconfigitem('paths', 'default-push',
781 default=None,
791 default=None,
782 )
792 )
783 coreconfigitem('paths', '.*',
793 coreconfigitem('paths', '.*',
784 default=None,
794 default=None,
785 generic=True,
795 generic=True,
786 )
796 )
787 coreconfigitem('phases', 'checksubrepos',
797 coreconfigitem('phases', 'checksubrepos',
788 default='follow',
798 default='follow',
789 )
799 )
790 coreconfigitem('phases', 'new-commit',
800 coreconfigitem('phases', 'new-commit',
791 default='draft',
801 default='draft',
792 )
802 )
793 coreconfigitem('phases', 'publish',
803 coreconfigitem('phases', 'publish',
794 default=True,
804 default=True,
795 )
805 )
796 coreconfigitem('profiling', 'enabled',
806 coreconfigitem('profiling', 'enabled',
797 default=False,
807 default=False,
798 )
808 )
799 coreconfigitem('profiling', 'format',
809 coreconfigitem('profiling', 'format',
800 default='text',
810 default='text',
801 )
811 )
802 coreconfigitem('profiling', 'freq',
812 coreconfigitem('profiling', 'freq',
803 default=1000,
813 default=1000,
804 )
814 )
805 coreconfigitem('profiling', 'limit',
815 coreconfigitem('profiling', 'limit',
806 default=30,
816 default=30,
807 )
817 )
808 coreconfigitem('profiling', 'nested',
818 coreconfigitem('profiling', 'nested',
809 default=0,
819 default=0,
810 )
820 )
811 coreconfigitem('profiling', 'output',
821 coreconfigitem('profiling', 'output',
812 default=None,
822 default=None,
813 )
823 )
814 coreconfigitem('profiling', 'showmax',
824 coreconfigitem('profiling', 'showmax',
815 default=0.999,
825 default=0.999,
816 )
826 )
817 coreconfigitem('profiling', 'showmin',
827 coreconfigitem('profiling', 'showmin',
818 default=dynamicdefault,
828 default=dynamicdefault,
819 )
829 )
820 coreconfigitem('profiling', 'sort',
830 coreconfigitem('profiling', 'sort',
821 default='inlinetime',
831 default='inlinetime',
822 )
832 )
823 coreconfigitem('profiling', 'statformat',
833 coreconfigitem('profiling', 'statformat',
824 default='hotpath',
834 default='hotpath',
825 )
835 )
826 coreconfigitem('profiling', 'type',
836 coreconfigitem('profiling', 'type',
827 default='stat',
837 default='stat',
828 )
838 )
829 coreconfigitem('progress', 'assume-tty',
839 coreconfigitem('progress', 'assume-tty',
830 default=False,
840 default=False,
831 )
841 )
832 coreconfigitem('progress', 'changedelay',
842 coreconfigitem('progress', 'changedelay',
833 default=1,
843 default=1,
834 )
844 )
835 coreconfigitem('progress', 'clear-complete',
845 coreconfigitem('progress', 'clear-complete',
836 default=True,
846 default=True,
837 )
847 )
838 coreconfigitem('progress', 'debug',
848 coreconfigitem('progress', 'debug',
839 default=False,
849 default=False,
840 )
850 )
841 coreconfigitem('progress', 'delay',
851 coreconfigitem('progress', 'delay',
842 default=3,
852 default=3,
843 )
853 )
844 coreconfigitem('progress', 'disable',
854 coreconfigitem('progress', 'disable',
845 default=False,
855 default=False,
846 )
856 )
847 coreconfigitem('progress', 'estimateinterval',
857 coreconfigitem('progress', 'estimateinterval',
848 default=60.0,
858 default=60.0,
849 )
859 )
850 coreconfigitem('progress', 'format',
860 coreconfigitem('progress', 'format',
851 default=lambda: ['topic', 'bar', 'number', 'estimate'],
861 default=lambda: ['topic', 'bar', 'number', 'estimate'],
852 )
862 )
853 coreconfigitem('progress', 'refresh',
863 coreconfigitem('progress', 'refresh',
854 default=0.1,
864 default=0.1,
855 )
865 )
856 coreconfigitem('progress', 'width',
866 coreconfigitem('progress', 'width',
857 default=dynamicdefault,
867 default=dynamicdefault,
858 )
868 )
859 coreconfigitem('push', 'pushvars.server',
869 coreconfigitem('push', 'pushvars.server',
860 default=False,
870 default=False,
861 )
871 )
862 coreconfigitem('server', 'bookmarks-pushkey-compat',
872 coreconfigitem('server', 'bookmarks-pushkey-compat',
863 default=True,
873 default=True,
864 )
874 )
865 coreconfigitem('server', 'bundle1',
875 coreconfigitem('server', 'bundle1',
866 default=True,
876 default=True,
867 )
877 )
868 coreconfigitem('server', 'bundle1gd',
878 coreconfigitem('server', 'bundle1gd',
869 default=None,
879 default=None,
870 )
880 )
871 coreconfigitem('server', 'bundle1.pull',
881 coreconfigitem('server', 'bundle1.pull',
872 default=None,
882 default=None,
873 )
883 )
874 coreconfigitem('server', 'bundle1gd.pull',
884 coreconfigitem('server', 'bundle1gd.pull',
875 default=None,
885 default=None,
876 )
886 )
877 coreconfigitem('server', 'bundle1.push',
887 coreconfigitem('server', 'bundle1.push',
878 default=None,
888 default=None,
879 )
889 )
880 coreconfigitem('server', 'bundle1gd.push',
890 coreconfigitem('server', 'bundle1gd.push',
881 default=None,
891 default=None,
882 )
892 )
883 coreconfigitem('server', 'compressionengines',
893 coreconfigitem('server', 'compressionengines',
884 default=list,
894 default=list,
885 )
895 )
886 coreconfigitem('server', 'concurrent-push-mode',
896 coreconfigitem('server', 'concurrent-push-mode',
887 default='strict',
897 default='strict',
888 )
898 )
889 coreconfigitem('server', 'disablefullbundle',
899 coreconfigitem('server', 'disablefullbundle',
890 default=False,
900 default=False,
891 )
901 )
892 coreconfigitem('server', 'maxhttpheaderlen',
902 coreconfigitem('server', 'maxhttpheaderlen',
893 default=1024,
903 default=1024,
894 )
904 )
895 coreconfigitem('server', 'preferuncompressed',
905 coreconfigitem('server', 'preferuncompressed',
896 default=False,
906 default=False,
897 )
907 )
898 coreconfigitem('server', 'uncompressed',
908 coreconfigitem('server', 'uncompressed',
899 default=True,
909 default=True,
900 )
910 )
901 coreconfigitem('server', 'uncompressedallowsecret',
911 coreconfigitem('server', 'uncompressedallowsecret',
902 default=False,
912 default=False,
903 )
913 )
904 coreconfigitem('server', 'validate',
914 coreconfigitem('server', 'validate',
905 default=False,
915 default=False,
906 )
916 )
907 coreconfigitem('server', 'zliblevel',
917 coreconfigitem('server', 'zliblevel',
908 default=-1,
918 default=-1,
909 )
919 )
910 coreconfigitem('share', 'pool',
920 coreconfigitem('share', 'pool',
911 default=None,
921 default=None,
912 )
922 )
913 coreconfigitem('share', 'poolnaming',
923 coreconfigitem('share', 'poolnaming',
914 default='identity',
924 default='identity',
915 )
925 )
916 coreconfigitem('smtp', 'host',
926 coreconfigitem('smtp', 'host',
917 default=None,
927 default=None,
918 )
928 )
919 coreconfigitem('smtp', 'local_hostname',
929 coreconfigitem('smtp', 'local_hostname',
920 default=None,
930 default=None,
921 )
931 )
922 coreconfigitem('smtp', 'password',
932 coreconfigitem('smtp', 'password',
923 default=None,
933 default=None,
924 )
934 )
925 coreconfigitem('smtp', 'port',
935 coreconfigitem('smtp', 'port',
926 default=dynamicdefault,
936 default=dynamicdefault,
927 )
937 )
928 coreconfigitem('smtp', 'tls',
938 coreconfigitem('smtp', 'tls',
929 default='none',
939 default='none',
930 )
940 )
931 coreconfigitem('smtp', 'username',
941 coreconfigitem('smtp', 'username',
932 default=None,
942 default=None,
933 )
943 )
934 coreconfigitem('sparse', 'missingwarning',
944 coreconfigitem('sparse', 'missingwarning',
935 default=True,
945 default=True,
936 )
946 )
937 coreconfigitem('subrepos', 'allowed',
947 coreconfigitem('subrepos', 'allowed',
938 default=dynamicdefault, # to make backporting simpler
948 default=dynamicdefault, # to make backporting simpler
939 )
949 )
940 coreconfigitem('subrepos', 'hg:allowed',
950 coreconfigitem('subrepos', 'hg:allowed',
941 default=dynamicdefault,
951 default=dynamicdefault,
942 )
952 )
943 coreconfigitem('subrepos', 'git:allowed',
953 coreconfigitem('subrepos', 'git:allowed',
944 default=dynamicdefault,
954 default=dynamicdefault,
945 )
955 )
946 coreconfigitem('subrepos', 'svn:allowed',
956 coreconfigitem('subrepos', 'svn:allowed',
947 default=dynamicdefault,
957 default=dynamicdefault,
948 )
958 )
949 coreconfigitem('templates', '.*',
959 coreconfigitem('templates', '.*',
950 default=None,
960 default=None,
951 generic=True,
961 generic=True,
952 )
962 )
953 coreconfigitem('trusted', 'groups',
963 coreconfigitem('trusted', 'groups',
954 default=list,
964 default=list,
955 )
965 )
956 coreconfigitem('trusted', 'users',
966 coreconfigitem('trusted', 'users',
957 default=list,
967 default=list,
958 )
968 )
959 coreconfigitem('ui', '_usedassubrepo',
969 coreconfigitem('ui', '_usedassubrepo',
960 default=False,
970 default=False,
961 )
971 )
962 coreconfigitem('ui', 'allowemptycommit',
972 coreconfigitem('ui', 'allowemptycommit',
963 default=False,
973 default=False,
964 )
974 )
965 coreconfigitem('ui', 'archivemeta',
975 coreconfigitem('ui', 'archivemeta',
966 default=True,
976 default=True,
967 )
977 )
968 coreconfigitem('ui', 'askusername',
978 coreconfigitem('ui', 'askusername',
969 default=False,
979 default=False,
970 )
980 )
971 coreconfigitem('ui', 'clonebundlefallback',
981 coreconfigitem('ui', 'clonebundlefallback',
972 default=False,
982 default=False,
973 )
983 )
974 coreconfigitem('ui', 'clonebundleprefers',
984 coreconfigitem('ui', 'clonebundleprefers',
975 default=list,
985 default=list,
976 )
986 )
977 coreconfigitem('ui', 'clonebundles',
987 coreconfigitem('ui', 'clonebundles',
978 default=True,
988 default=True,
979 )
989 )
980 coreconfigitem('ui', 'color',
990 coreconfigitem('ui', 'color',
981 default='auto',
991 default='auto',
982 )
992 )
983 coreconfigitem('ui', 'commitsubrepos',
993 coreconfigitem('ui', 'commitsubrepos',
984 default=False,
994 default=False,
985 )
995 )
986 coreconfigitem('ui', 'debug',
996 coreconfigitem('ui', 'debug',
987 default=False,
997 default=False,
988 )
998 )
989 coreconfigitem('ui', 'debugger',
999 coreconfigitem('ui', 'debugger',
990 default=None,
1000 default=None,
991 )
1001 )
992 coreconfigitem('ui', 'editor',
1002 coreconfigitem('ui', 'editor',
993 default=dynamicdefault,
1003 default=dynamicdefault,
994 )
1004 )
995 coreconfigitem('ui', 'fallbackencoding',
1005 coreconfigitem('ui', 'fallbackencoding',
996 default=None,
1006 default=None,
997 )
1007 )
998 coreconfigitem('ui', 'forcecwd',
1008 coreconfigitem('ui', 'forcecwd',
999 default=None,
1009 default=None,
1000 )
1010 )
1001 coreconfigitem('ui', 'forcemerge',
1011 coreconfigitem('ui', 'forcemerge',
1002 default=None,
1012 default=None,
1003 )
1013 )
1004 coreconfigitem('ui', 'formatdebug',
1014 coreconfigitem('ui', 'formatdebug',
1005 default=False,
1015 default=False,
1006 )
1016 )
1007 coreconfigitem('ui', 'formatjson',
1017 coreconfigitem('ui', 'formatjson',
1008 default=False,
1018 default=False,
1009 )
1019 )
1010 coreconfigitem('ui', 'formatted',
1020 coreconfigitem('ui', 'formatted',
1011 default=None,
1021 default=None,
1012 )
1022 )
1013 coreconfigitem('ui', 'graphnodetemplate',
1023 coreconfigitem('ui', 'graphnodetemplate',
1014 default=None,
1024 default=None,
1015 )
1025 )
1016 coreconfigitem('ui', 'http2debuglevel',
1026 coreconfigitem('ui', 'http2debuglevel',
1017 default=None,
1027 default=None,
1018 )
1028 )
1019 coreconfigitem('ui', 'interactive',
1029 coreconfigitem('ui', 'interactive',
1020 default=None,
1030 default=None,
1021 )
1031 )
1022 coreconfigitem('ui', 'interface',
1032 coreconfigitem('ui', 'interface',
1023 default=None,
1033 default=None,
1024 )
1034 )
1025 coreconfigitem('ui', 'interface.chunkselector',
1035 coreconfigitem('ui', 'interface.chunkselector',
1026 default=None,
1036 default=None,
1027 )
1037 )
1028 coreconfigitem('ui', 'logblockedtimes',
1038 coreconfigitem('ui', 'logblockedtimes',
1029 default=False,
1039 default=False,
1030 )
1040 )
1031 coreconfigitem('ui', 'logtemplate',
1041 coreconfigitem('ui', 'logtemplate',
1032 default=None,
1042 default=None,
1033 )
1043 )
1034 coreconfigitem('ui', 'merge',
1044 coreconfigitem('ui', 'merge',
1035 default=None,
1045 default=None,
1036 )
1046 )
1037 coreconfigitem('ui', 'mergemarkers',
1047 coreconfigitem('ui', 'mergemarkers',
1038 default='basic',
1048 default='basic',
1039 )
1049 )
1040 coreconfigitem('ui', 'mergemarkertemplate',
1050 coreconfigitem('ui', 'mergemarkertemplate',
1041 default=('{node|short} '
1051 default=('{node|short} '
1042 '{ifeq(tags, "tip", "", '
1052 '{ifeq(tags, "tip", "", '
1043 'ifeq(tags, "", "", "{tags} "))}'
1053 'ifeq(tags, "", "", "{tags} "))}'
1044 '{if(bookmarks, "{bookmarks} ")}'
1054 '{if(bookmarks, "{bookmarks} ")}'
1045 '{ifeq(branch, "default", "", "{branch} ")}'
1055 '{ifeq(branch, "default", "", "{branch} ")}'
1046 '- {author|user}: {desc|firstline}')
1056 '- {author|user}: {desc|firstline}')
1047 )
1057 )
1048 coreconfigitem('ui', 'nontty',
1058 coreconfigitem('ui', 'nontty',
1049 default=False,
1059 default=False,
1050 )
1060 )
1051 coreconfigitem('ui', 'origbackuppath',
1061 coreconfigitem('ui', 'origbackuppath',
1052 default=None,
1062 default=None,
1053 )
1063 )
1054 coreconfigitem('ui', 'paginate',
1064 coreconfigitem('ui', 'paginate',
1055 default=True,
1065 default=True,
1056 )
1066 )
1057 coreconfigitem('ui', 'patch',
1067 coreconfigitem('ui', 'patch',
1058 default=None,
1068 default=None,
1059 )
1069 )
1060 coreconfigitem('ui', 'portablefilenames',
1070 coreconfigitem('ui', 'portablefilenames',
1061 default='warn',
1071 default='warn',
1062 )
1072 )
1063 coreconfigitem('ui', 'promptecho',
1073 coreconfigitem('ui', 'promptecho',
1064 default=False,
1074 default=False,
1065 )
1075 )
1066 coreconfigitem('ui', 'quiet',
1076 coreconfigitem('ui', 'quiet',
1067 default=False,
1077 default=False,
1068 )
1078 )
1069 coreconfigitem('ui', 'quietbookmarkmove',
1079 coreconfigitem('ui', 'quietbookmarkmove',
1070 default=False,
1080 default=False,
1071 )
1081 )
1072 coreconfigitem('ui', 'remotecmd',
1082 coreconfigitem('ui', 'remotecmd',
1073 default='hg',
1083 default='hg',
1074 )
1084 )
1075 coreconfigitem('ui', 'report_untrusted',
1085 coreconfigitem('ui', 'report_untrusted',
1076 default=True,
1086 default=True,
1077 )
1087 )
1078 coreconfigitem('ui', 'rollback',
1088 coreconfigitem('ui', 'rollback',
1079 default=True,
1089 default=True,
1080 )
1090 )
1081 coreconfigitem('ui', 'slash',
1091 coreconfigitem('ui', 'slash',
1082 default=False,
1092 default=False,
1083 )
1093 )
1084 coreconfigitem('ui', 'ssh',
1094 coreconfigitem('ui', 'ssh',
1085 default='ssh',
1095 default='ssh',
1086 )
1096 )
1087 coreconfigitem('ui', 'ssherrorhint',
1097 coreconfigitem('ui', 'ssherrorhint',
1088 default=None,
1098 default=None,
1089 )
1099 )
1090 coreconfigitem('ui', 'statuscopies',
1100 coreconfigitem('ui', 'statuscopies',
1091 default=False,
1101 default=False,
1092 )
1102 )
1093 coreconfigitem('ui', 'strict',
1103 coreconfigitem('ui', 'strict',
1094 default=False,
1104 default=False,
1095 )
1105 )
1096 coreconfigitem('ui', 'style',
1106 coreconfigitem('ui', 'style',
1097 default='',
1107 default='',
1098 )
1108 )
1099 coreconfigitem('ui', 'supportcontact',
1109 coreconfigitem('ui', 'supportcontact',
1100 default=None,
1110 default=None,
1101 )
1111 )
1102 coreconfigitem('ui', 'textwidth',
1112 coreconfigitem('ui', 'textwidth',
1103 default=78,
1113 default=78,
1104 )
1114 )
1105 coreconfigitem('ui', 'timeout',
1115 coreconfigitem('ui', 'timeout',
1106 default='600',
1116 default='600',
1107 )
1117 )
1108 coreconfigitem('ui', 'timeout.warn',
1118 coreconfigitem('ui', 'timeout.warn',
1109 default=0,
1119 default=0,
1110 )
1120 )
1111 coreconfigitem('ui', 'traceback',
1121 coreconfigitem('ui', 'traceback',
1112 default=False,
1122 default=False,
1113 )
1123 )
1114 coreconfigitem('ui', 'tweakdefaults',
1124 coreconfigitem('ui', 'tweakdefaults',
1115 default=False,
1125 default=False,
1116 )
1126 )
1117 coreconfigitem('ui', 'usehttp2',
1127 coreconfigitem('ui', 'usehttp2',
1118 default=False,
1128 default=False,
1119 )
1129 )
1120 coreconfigitem('ui', 'username',
1130 coreconfigitem('ui', 'username',
1121 alias=[('ui', 'user')]
1131 alias=[('ui', 'user')]
1122 )
1132 )
1123 coreconfigitem('ui', 'verbose',
1133 coreconfigitem('ui', 'verbose',
1124 default=False,
1134 default=False,
1125 )
1135 )
1126 coreconfigitem('verify', 'skipflags',
1136 coreconfigitem('verify', 'skipflags',
1127 default=None,
1137 default=None,
1128 )
1138 )
1129 coreconfigitem('web', 'allowbz2',
1139 coreconfigitem('web', 'allowbz2',
1130 default=False,
1140 default=False,
1131 )
1141 )
1132 coreconfigitem('web', 'allowgz',
1142 coreconfigitem('web', 'allowgz',
1133 default=False,
1143 default=False,
1134 )
1144 )
1135 coreconfigitem('web', 'allow-pull',
1145 coreconfigitem('web', 'allow-pull',
1136 alias=[('web', 'allowpull')],
1146 alias=[('web', 'allowpull')],
1137 default=True,
1147 default=True,
1138 )
1148 )
1139 coreconfigitem('web', 'allow-push',
1149 coreconfigitem('web', 'allow-push',
1140 alias=[('web', 'allow_push')],
1150 alias=[('web', 'allow_push')],
1141 default=list,
1151 default=list,
1142 )
1152 )
1143 coreconfigitem('web', 'allowzip',
1153 coreconfigitem('web', 'allowzip',
1144 default=False,
1154 default=False,
1145 )
1155 )
1146 coreconfigitem('web', 'archivesubrepos',
1156 coreconfigitem('web', 'archivesubrepos',
1147 default=False,
1157 default=False,
1148 )
1158 )
1149 coreconfigitem('web', 'cache',
1159 coreconfigitem('web', 'cache',
1150 default=True,
1160 default=True,
1151 )
1161 )
1152 coreconfigitem('web', 'contact',
1162 coreconfigitem('web', 'contact',
1153 default=None,
1163 default=None,
1154 )
1164 )
1155 coreconfigitem('web', 'deny_push',
1165 coreconfigitem('web', 'deny_push',
1156 default=list,
1166 default=list,
1157 )
1167 )
1158 coreconfigitem('web', 'guessmime',
1168 coreconfigitem('web', 'guessmime',
1159 default=False,
1169 default=False,
1160 )
1170 )
1161 coreconfigitem('web', 'hidden',
1171 coreconfigitem('web', 'hidden',
1162 default=False,
1172 default=False,
1163 )
1173 )
1164 coreconfigitem('web', 'labels',
1174 coreconfigitem('web', 'labels',
1165 default=list,
1175 default=list,
1166 )
1176 )
1167 coreconfigitem('web', 'logoimg',
1177 coreconfigitem('web', 'logoimg',
1168 default='hglogo.png',
1178 default='hglogo.png',
1169 )
1179 )
1170 coreconfigitem('web', 'logourl',
1180 coreconfigitem('web', 'logourl',
1171 default='https://mercurial-scm.org/',
1181 default='https://mercurial-scm.org/',
1172 )
1182 )
1173 coreconfigitem('web', 'accesslog',
1183 coreconfigitem('web', 'accesslog',
1174 default='-',
1184 default='-',
1175 )
1185 )
1176 coreconfigitem('web', 'address',
1186 coreconfigitem('web', 'address',
1177 default='',
1187 default='',
1178 )
1188 )
1179 coreconfigitem('web', 'allow_archive',
1189 coreconfigitem('web', 'allow_archive',
1180 default=list,
1190 default=list,
1181 )
1191 )
1182 coreconfigitem('web', 'allow_read',
1192 coreconfigitem('web', 'allow_read',
1183 default=list,
1193 default=list,
1184 )
1194 )
1185 coreconfigitem('web', 'baseurl',
1195 coreconfigitem('web', 'baseurl',
1186 default=None,
1196 default=None,
1187 )
1197 )
1188 coreconfigitem('web', 'cacerts',
1198 coreconfigitem('web', 'cacerts',
1189 default=None,
1199 default=None,
1190 )
1200 )
1191 coreconfigitem('web', 'certificate',
1201 coreconfigitem('web', 'certificate',
1192 default=None,
1202 default=None,
1193 )
1203 )
1194 coreconfigitem('web', 'collapse',
1204 coreconfigitem('web', 'collapse',
1195 default=False,
1205 default=False,
1196 )
1206 )
1197 coreconfigitem('web', 'csp',
1207 coreconfigitem('web', 'csp',
1198 default=None,
1208 default=None,
1199 )
1209 )
1200 coreconfigitem('web', 'deny_read',
1210 coreconfigitem('web', 'deny_read',
1201 default=list,
1211 default=list,
1202 )
1212 )
1203 coreconfigitem('web', 'descend',
1213 coreconfigitem('web', 'descend',
1204 default=True,
1214 default=True,
1205 )
1215 )
1206 coreconfigitem('web', 'description',
1216 coreconfigitem('web', 'description',
1207 default="",
1217 default="",
1208 )
1218 )
1209 coreconfigitem('web', 'encoding',
1219 coreconfigitem('web', 'encoding',
1210 default=lambda: encoding.encoding,
1220 default=lambda: encoding.encoding,
1211 )
1221 )
1212 coreconfigitem('web', 'errorlog',
1222 coreconfigitem('web', 'errorlog',
1213 default='-',
1223 default='-',
1214 )
1224 )
1215 coreconfigitem('web', 'ipv6',
1225 coreconfigitem('web', 'ipv6',
1216 default=False,
1226 default=False,
1217 )
1227 )
1218 coreconfigitem('web', 'maxchanges',
1228 coreconfigitem('web', 'maxchanges',
1219 default=10,
1229 default=10,
1220 )
1230 )
1221 coreconfigitem('web', 'maxfiles',
1231 coreconfigitem('web', 'maxfiles',
1222 default=10,
1232 default=10,
1223 )
1233 )
1224 coreconfigitem('web', 'maxshortchanges',
1234 coreconfigitem('web', 'maxshortchanges',
1225 default=60,
1235 default=60,
1226 )
1236 )
1227 coreconfigitem('web', 'motd',
1237 coreconfigitem('web', 'motd',
1228 default='',
1238 default='',
1229 )
1239 )
1230 coreconfigitem('web', 'name',
1240 coreconfigitem('web', 'name',
1231 default=dynamicdefault,
1241 default=dynamicdefault,
1232 )
1242 )
1233 coreconfigitem('web', 'port',
1243 coreconfigitem('web', 'port',
1234 default=8000,
1244 default=8000,
1235 )
1245 )
1236 coreconfigitem('web', 'prefix',
1246 coreconfigitem('web', 'prefix',
1237 default='',
1247 default='',
1238 )
1248 )
1239 coreconfigitem('web', 'push_ssl',
1249 coreconfigitem('web', 'push_ssl',
1240 default=True,
1250 default=True,
1241 )
1251 )
1242 coreconfigitem('web', 'refreshinterval',
1252 coreconfigitem('web', 'refreshinterval',
1243 default=20,
1253 default=20,
1244 )
1254 )
1245 coreconfigitem('web', 'staticurl',
1255 coreconfigitem('web', 'staticurl',
1246 default=None,
1256 default=None,
1247 )
1257 )
1248 coreconfigitem('web', 'stripes',
1258 coreconfigitem('web', 'stripes',
1249 default=1,
1259 default=1,
1250 )
1260 )
1251 coreconfigitem('web', 'style',
1261 coreconfigitem('web', 'style',
1252 default='paper',
1262 default='paper',
1253 )
1263 )
1254 coreconfigitem('web', 'templates',
1264 coreconfigitem('web', 'templates',
1255 default=None,
1265 default=None,
1256 )
1266 )
1257 coreconfigitem('web', 'view',
1267 coreconfigitem('web', 'view',
1258 default='served',
1268 default='served',
1259 )
1269 )
1260 coreconfigitem('worker', 'backgroundclose',
1270 coreconfigitem('worker', 'backgroundclose',
1261 default=dynamicdefault,
1271 default=dynamicdefault,
1262 )
1272 )
1263 # Windows defaults to a limit of 512 open files. A buffer of 128
1273 # Windows defaults to a limit of 512 open files. A buffer of 128
1264 # should give us enough headway.
1274 # should give us enough headway.
1265 coreconfigitem('worker', 'backgroundclosemaxqueue',
1275 coreconfigitem('worker', 'backgroundclosemaxqueue',
1266 default=384,
1276 default=384,
1267 )
1277 )
1268 coreconfigitem('worker', 'backgroundcloseminfilecount',
1278 coreconfigitem('worker', 'backgroundcloseminfilecount',
1269 default=2048,
1279 default=2048,
1270 )
1280 )
1271 coreconfigitem('worker', 'backgroundclosethreadcount',
1281 coreconfigitem('worker', 'backgroundclosethreadcount',
1272 default=4,
1282 default=4,
1273 )
1283 )
1274 coreconfigitem('worker', 'enabled',
1284 coreconfigitem('worker', 'enabled',
1275 default=True,
1285 default=True,
1276 )
1286 )
1277 coreconfigitem('worker', 'numcpus',
1287 coreconfigitem('worker', 'numcpus',
1278 default=None,
1288 default=None,
1279 )
1289 )
1280
1290
1281 # Rebase related configuration moved to core because other extension are doing
1291 # Rebase related configuration moved to core because other extension are doing
1282 # strange things. For example, shelve import the extensions to reuse some bit
1292 # strange things. For example, shelve import the extensions to reuse some bit
1283 # without formally loading it.
1293 # without formally loading it.
1284 coreconfigitem('commands', 'rebase.requiredest',
1294 coreconfigitem('commands', 'rebase.requiredest',
1285 default=False,
1295 default=False,
1286 )
1296 )
1287 coreconfigitem('experimental', 'rebaseskipobsolete',
1297 coreconfigitem('experimental', 'rebaseskipobsolete',
1288 default=True,
1298 default=True,
1289 )
1299 )
1290 coreconfigitem('rebase', 'singletransaction',
1300 coreconfigitem('rebase', 'singletransaction',
1291 default=False,
1301 default=False,
1292 )
1302 )
1293 coreconfigitem('rebase', 'experimental.inmemory',
1303 coreconfigitem('rebase', 'experimental.inmemory',
1294 default=False,
1304 default=False,
1295 )
1305 )
@@ -1,846 +1,883 b''
1 # filemerge.py - file-level merge handling for Mercurial
1 # filemerge.py - file-level merge handling for Mercurial
2 #
2 #
3 # Copyright 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
3 # Copyright 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import os
10 import os
11 import re
11 import re
12 import tempfile
12 import tempfile
13
13
14 from .i18n import _
14 from .i18n import _
15 from .node import nullid, short
15 from .node import nullid, short
16
16
17 from . import (
17 from . import (
18 encoding,
18 encoding,
19 error,
19 error,
20 formatter,
20 formatter,
21 match,
21 match,
22 pycompat,
22 pycompat,
23 registrar,
23 registrar,
24 scmutil,
24 scmutil,
25 simplemerge,
25 simplemerge,
26 tagmerge,
26 tagmerge,
27 templatekw,
27 templatekw,
28 templater,
28 templater,
29 util,
29 util,
30 )
30 )
31
31
32 def _toolstr(ui, tool, part, *args):
32 def _toolstr(ui, tool, part, *args):
33 return ui.config("merge-tools", tool + "." + part, *args)
33 return ui.config("merge-tools", tool + "." + part, *args)
34
34
35 def _toolbool(ui, tool, part,*args):
35 def _toolbool(ui, tool, part,*args):
36 return ui.configbool("merge-tools", tool + "." + part, *args)
36 return ui.configbool("merge-tools", tool + "." + part, *args)
37
37
38 def _toollist(ui, tool, part):
38 def _toollist(ui, tool, part):
39 return ui.configlist("merge-tools", tool + "." + part)
39 return ui.configlist("merge-tools", tool + "." + part)
40
40
41 internals = {}
41 internals = {}
42 # Merge tools to document.
42 # Merge tools to document.
43 internalsdoc = {}
43 internalsdoc = {}
44
44
45 internaltool = registrar.internalmerge()
45 internaltool = registrar.internalmerge()
46
46
47 # internal tool merge types
47 # internal tool merge types
48 nomerge = internaltool.nomerge
48 nomerge = internaltool.nomerge
49 mergeonly = internaltool.mergeonly # just the full merge, no premerge
49 mergeonly = internaltool.mergeonly # just the full merge, no premerge
50 fullmerge = internaltool.fullmerge # both premerge and merge
50 fullmerge = internaltool.fullmerge # both premerge and merge
51
51
52 _localchangedotherdeletedmsg = _(
52 _localchangedotherdeletedmsg = _(
53 "local%(l)s changed %(fd)s which other%(o)s deleted\n"
53 "local%(l)s changed %(fd)s which other%(o)s deleted\n"
54 "use (c)hanged version, (d)elete, or leave (u)nresolved?"
54 "use (c)hanged version, (d)elete, or leave (u)nresolved?"
55 "$$ &Changed $$ &Delete $$ &Unresolved")
55 "$$ &Changed $$ &Delete $$ &Unresolved")
56
56
57 _otherchangedlocaldeletedmsg = _(
57 _otherchangedlocaldeletedmsg = _(
58 "other%(o)s changed %(fd)s which local%(l)s deleted\n"
58 "other%(o)s changed %(fd)s which local%(l)s deleted\n"
59 "use (c)hanged version, leave (d)eleted, or "
59 "use (c)hanged version, leave (d)eleted, or "
60 "leave (u)nresolved?"
60 "leave (u)nresolved?"
61 "$$ &Changed $$ &Deleted $$ &Unresolved")
61 "$$ &Changed $$ &Deleted $$ &Unresolved")
62
62
63 class absentfilectx(object):
63 class absentfilectx(object):
64 """Represents a file that's ostensibly in a context but is actually not
64 """Represents a file that's ostensibly in a context but is actually not
65 present in it.
65 present in it.
66
66
67 This is here because it's very specific to the filemerge code for now --
67 This is here because it's very specific to the filemerge code for now --
68 other code is likely going to break with the values this returns."""
68 other code is likely going to break with the values this returns."""
69 def __init__(self, ctx, f):
69 def __init__(self, ctx, f):
70 self._ctx = ctx
70 self._ctx = ctx
71 self._f = f
71 self._f = f
72
72
73 def path(self):
73 def path(self):
74 return self._f
74 return self._f
75
75
76 def size(self):
76 def size(self):
77 return None
77 return None
78
78
79 def data(self):
79 def data(self):
80 return None
80 return None
81
81
82 def filenode(self):
82 def filenode(self):
83 return nullid
83 return nullid
84
84
85 _customcmp = True
85 _customcmp = True
86 def cmp(self, fctx):
86 def cmp(self, fctx):
87 """compare with other file context
87 """compare with other file context
88
88
89 returns True if different from fctx.
89 returns True if different from fctx.
90 """
90 """
91 return not (fctx.isabsent() and
91 return not (fctx.isabsent() and
92 fctx.ctx() == self.ctx() and
92 fctx.ctx() == self.ctx() and
93 fctx.path() == self.path())
93 fctx.path() == self.path())
94
94
95 def flags(self):
95 def flags(self):
96 return ''
96 return ''
97
97
98 def changectx(self):
98 def changectx(self):
99 return self._ctx
99 return self._ctx
100
100
101 def isbinary(self):
101 def isbinary(self):
102 return False
102 return False
103
103
104 def isabsent(self):
104 def isabsent(self):
105 return True
105 return True
106
106
107 def _findtool(ui, tool):
107 def _findtool(ui, tool):
108 if tool in internals:
108 if tool in internals:
109 return tool
109 return tool
110 return findexternaltool(ui, tool)
110 return findexternaltool(ui, tool)
111
111
112 def findexternaltool(ui, tool):
112 def findexternaltool(ui, tool):
113 for kn in ("regkey", "regkeyalt"):
113 for kn in ("regkey", "regkeyalt"):
114 k = _toolstr(ui, tool, kn)
114 k = _toolstr(ui, tool, kn)
115 if not k:
115 if not k:
116 continue
116 continue
117 p = util.lookupreg(k, _toolstr(ui, tool, "regname"))
117 p = util.lookupreg(k, _toolstr(ui, tool, "regname"))
118 if p:
118 if p:
119 p = util.findexe(p + _toolstr(ui, tool, "regappend", ""))
119 p = util.findexe(p + _toolstr(ui, tool, "regappend", ""))
120 if p:
120 if p:
121 return p
121 return p
122 exe = _toolstr(ui, tool, "executable", tool)
122 exe = _toolstr(ui, tool, "executable", tool)
123 return util.findexe(util.expandpath(exe))
123 return util.findexe(util.expandpath(exe))
124
124
125 def _picktool(repo, ui, path, binary, symlink, changedelete):
125 def _picktool(repo, ui, path, binary, symlink, changedelete):
126 def supportscd(tool):
126 def supportscd(tool):
127 return tool in internals and internals[tool].mergetype == nomerge
127 return tool in internals and internals[tool].mergetype == nomerge
128
128
129 def check(tool, pat, symlink, binary, changedelete):
129 def check(tool, pat, symlink, binary, changedelete):
130 tmsg = tool
130 tmsg = tool
131 if pat:
131 if pat:
132 tmsg = _("%s (for pattern %s)") % (tool, pat)
132 tmsg = _("%s (for pattern %s)") % (tool, pat)
133 if not _findtool(ui, tool):
133 if not _findtool(ui, tool):
134 if pat: # explicitly requested tool deserves a warning
134 if pat: # explicitly requested tool deserves a warning
135 ui.warn(_("couldn't find merge tool %s\n") % tmsg)
135 ui.warn(_("couldn't find merge tool %s\n") % tmsg)
136 else: # configured but non-existing tools are more silent
136 else: # configured but non-existing tools are more silent
137 ui.note(_("couldn't find merge tool %s\n") % tmsg)
137 ui.note(_("couldn't find merge tool %s\n") % tmsg)
138 elif symlink and not _toolbool(ui, tool, "symlink"):
138 elif symlink and not _toolbool(ui, tool, "symlink"):
139 ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
139 ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
140 elif binary and not _toolbool(ui, tool, "binary"):
140 elif binary and not _toolbool(ui, tool, "binary"):
141 ui.warn(_("tool %s can't handle binary\n") % tmsg)
141 ui.warn(_("tool %s can't handle binary\n") % tmsg)
142 elif changedelete and not supportscd(tool):
142 elif changedelete and not supportscd(tool):
143 # the nomerge tools are the only tools that support change/delete
143 # the nomerge tools are the only tools that support change/delete
144 # conflicts
144 # conflicts
145 pass
145 pass
146 elif not util.gui() and _toolbool(ui, tool, "gui"):
146 elif not util.gui() and _toolbool(ui, tool, "gui"):
147 ui.warn(_("tool %s requires a GUI\n") % tmsg)
147 ui.warn(_("tool %s requires a GUI\n") % tmsg)
148 else:
148 else:
149 return True
149 return True
150 return False
150 return False
151
151
152 # internal config: ui.forcemerge
152 # internal config: ui.forcemerge
153 # forcemerge comes from command line arguments, highest priority
153 # forcemerge comes from command line arguments, highest priority
154 force = ui.config('ui', 'forcemerge')
154 force = ui.config('ui', 'forcemerge')
155 if force:
155 if force:
156 toolpath = _findtool(ui, force)
156 toolpath = _findtool(ui, force)
157 if changedelete and not supportscd(toolpath):
157 if changedelete and not supportscd(toolpath):
158 return ":prompt", None
158 return ":prompt", None
159 else:
159 else:
160 if toolpath:
160 if toolpath:
161 return (force, util.shellquote(toolpath))
161 return (force, util.shellquote(toolpath))
162 else:
162 else:
163 # mimic HGMERGE if given tool not found
163 # mimic HGMERGE if given tool not found
164 return (force, force)
164 return (force, force)
165
165
166 # HGMERGE takes next precedence
166 # HGMERGE takes next precedence
167 hgmerge = encoding.environ.get("HGMERGE")
167 hgmerge = encoding.environ.get("HGMERGE")
168 if hgmerge:
168 if hgmerge:
169 if changedelete and not supportscd(hgmerge):
169 if changedelete and not supportscd(hgmerge):
170 return ":prompt", None
170 return ":prompt", None
171 else:
171 else:
172 return (hgmerge, hgmerge)
172 return (hgmerge, hgmerge)
173
173
174 # then patterns
174 # then patterns
175 for pat, tool in ui.configitems("merge-patterns"):
175 for pat, tool in ui.configitems("merge-patterns"):
176 mf = match.match(repo.root, '', [pat])
176 mf = match.match(repo.root, '', [pat])
177 if mf(path) and check(tool, pat, symlink, False, changedelete):
177 if mf(path) and check(tool, pat, symlink, False, changedelete):
178 toolpath = _findtool(ui, tool)
178 toolpath = _findtool(ui, tool)
179 return (tool, util.shellquote(toolpath))
179 return (tool, util.shellquote(toolpath))
180
180
181 # then merge tools
181 # then merge tools
182 tools = {}
182 tools = {}
183 disabled = set()
183 disabled = set()
184 for k, v in ui.configitems("merge-tools"):
184 for k, v in ui.configitems("merge-tools"):
185 t = k.split('.')[0]
185 t = k.split('.')[0]
186 if t not in tools:
186 if t not in tools:
187 tools[t] = int(_toolstr(ui, t, "priority"))
187 tools[t] = int(_toolstr(ui, t, "priority"))
188 if _toolbool(ui, t, "disabled"):
188 if _toolbool(ui, t, "disabled"):
189 disabled.add(t)
189 disabled.add(t)
190 names = tools.keys()
190 names = tools.keys()
191 tools = sorted([(-p, tool) for tool, p in tools.items()
191 tools = sorted([(-p, tool) for tool, p in tools.items()
192 if tool not in disabled])
192 if tool not in disabled])
193 uimerge = ui.config("ui", "merge")
193 uimerge = ui.config("ui", "merge")
194 if uimerge:
194 if uimerge:
195 # external tools defined in uimerge won't be able to handle
195 # external tools defined in uimerge won't be able to handle
196 # change/delete conflicts
196 # change/delete conflicts
197 if uimerge not in names and not changedelete:
197 if uimerge not in names and not changedelete:
198 return (uimerge, uimerge)
198 return (uimerge, uimerge)
199 tools.insert(0, (None, uimerge)) # highest priority
199 tools.insert(0, (None, uimerge)) # highest priority
200 tools.append((None, "hgmerge")) # the old default, if found
200 tools.append((None, "hgmerge")) # the old default, if found
201 for p, t in tools:
201 for p, t in tools:
202 if check(t, None, symlink, binary, changedelete):
202 if check(t, None, symlink, binary, changedelete):
203 toolpath = _findtool(ui, t)
203 toolpath = _findtool(ui, t)
204 return (t, util.shellquote(toolpath))
204 return (t, util.shellquote(toolpath))
205
205
206 # internal merge or prompt as last resort
206 # internal merge or prompt as last resort
207 if symlink or binary or changedelete:
207 if symlink or binary or changedelete:
208 if not changedelete and len(tools):
208 if not changedelete and len(tools):
209 # any tool is rejected by capability for symlink or binary
209 # any tool is rejected by capability for symlink or binary
210 ui.warn(_("no tool found to merge %s\n") % path)
210 ui.warn(_("no tool found to merge %s\n") % path)
211 return ":prompt", None
211 return ":prompt", None
212 return ":merge", None
212 return ":merge", None
213
213
214 def _eoltype(data):
214 def _eoltype(data):
215 "Guess the EOL type of a file"
215 "Guess the EOL type of a file"
216 if '\0' in data: # binary
216 if '\0' in data: # binary
217 return None
217 return None
218 if '\r\n' in data: # Windows
218 if '\r\n' in data: # Windows
219 return '\r\n'
219 return '\r\n'
220 if '\r' in data: # Old Mac
220 if '\r' in data: # Old Mac
221 return '\r'
221 return '\r'
222 if '\n' in data: # UNIX
222 if '\n' in data: # UNIX
223 return '\n'
223 return '\n'
224 return None # unknown
224 return None # unknown
225
225
226 def _matcheol(file, back):
226 def _matcheol(file, back):
227 "Convert EOL markers in a file to match origfile"
227 "Convert EOL markers in a file to match origfile"
228 tostyle = _eoltype(back.data()) # No repo.wread filters?
228 tostyle = _eoltype(back.data()) # No repo.wread filters?
229 if tostyle:
229 if tostyle:
230 data = util.readfile(file)
230 data = util.readfile(file)
231 style = _eoltype(data)
231 style = _eoltype(data)
232 if style:
232 if style:
233 newdata = data.replace(style, tostyle)
233 newdata = data.replace(style, tostyle)
234 if newdata != data:
234 if newdata != data:
235 util.writefile(file, newdata)
235 util.writefile(file, newdata)
236
236
237 @internaltool('prompt', nomerge)
237 @internaltool('prompt', nomerge)
238 def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
238 def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
239 """Asks the user which of the local `p1()` or the other `p2()` version to
239 """Asks the user which of the local `p1()` or the other `p2()` version to
240 keep as the merged version."""
240 keep as the merged version."""
241 ui = repo.ui
241 ui = repo.ui
242 fd = fcd.path()
242 fd = fcd.path()
243
243
244 # Avoid prompting during an in-memory merge since it doesn't support merge
244 # Avoid prompting during an in-memory merge since it doesn't support merge
245 # conflicts.
245 # conflicts.
246 if fcd.changectx().isinmemory():
246 if fcd.changectx().isinmemory():
247 raise error.InMemoryMergeConflictsError('in-memory merge does not '
247 raise error.InMemoryMergeConflictsError('in-memory merge does not '
248 'support file conflicts')
248 'support file conflicts')
249
249
250 prompts = partextras(labels)
250 prompts = partextras(labels)
251 prompts['fd'] = fd
251 prompts['fd'] = fd
252 try:
252 try:
253 if fco.isabsent():
253 if fco.isabsent():
254 index = ui.promptchoice(
254 index = ui.promptchoice(
255 _localchangedotherdeletedmsg % prompts, 2)
255 _localchangedotherdeletedmsg % prompts, 2)
256 choice = ['local', 'other', 'unresolved'][index]
256 choice = ['local', 'other', 'unresolved'][index]
257 elif fcd.isabsent():
257 elif fcd.isabsent():
258 index = ui.promptchoice(
258 index = ui.promptchoice(
259 _otherchangedlocaldeletedmsg % prompts, 2)
259 _otherchangedlocaldeletedmsg % prompts, 2)
260 choice = ['other', 'local', 'unresolved'][index]
260 choice = ['other', 'local', 'unresolved'][index]
261 else:
261 else:
262 index = ui.promptchoice(
262 index = ui.promptchoice(
263 _("keep (l)ocal%(l)s, take (o)ther%(o)s, or leave (u)nresolved"
263 _("keep (l)ocal%(l)s, take (o)ther%(o)s, or leave (u)nresolved"
264 " for %(fd)s?"
264 " for %(fd)s?"
265 "$$ &Local $$ &Other $$ &Unresolved") % prompts, 2)
265 "$$ &Local $$ &Other $$ &Unresolved") % prompts, 2)
266 choice = ['local', 'other', 'unresolved'][index]
266 choice = ['local', 'other', 'unresolved'][index]
267
267
268 if choice == 'other':
268 if choice == 'other':
269 return _iother(repo, mynode, orig, fcd, fco, fca, toolconf,
269 return _iother(repo, mynode, orig, fcd, fco, fca, toolconf,
270 labels)
270 labels)
271 elif choice == 'local':
271 elif choice == 'local':
272 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf,
272 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf,
273 labels)
273 labels)
274 elif choice == 'unresolved':
274 elif choice == 'unresolved':
275 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
275 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
276 labels)
276 labels)
277 except error.ResponseExpected:
277 except error.ResponseExpected:
278 ui.write("\n")
278 ui.write("\n")
279 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
279 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
280 labels)
280 labels)
281
281
282 @internaltool('local', nomerge)
282 @internaltool('local', nomerge)
283 def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
283 def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
284 """Uses the local `p1()` version of files as the merged version."""
284 """Uses the local `p1()` version of files as the merged version."""
285 return 0, fcd.isabsent()
285 return 0, fcd.isabsent()
286
286
287 @internaltool('other', nomerge)
287 @internaltool('other', nomerge)
288 def _iother(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
288 def _iother(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
289 """Uses the other `p2()` version of files as the merged version."""
289 """Uses the other `p2()` version of files as the merged version."""
290 if fco.isabsent():
290 if fco.isabsent():
291 # local changed, remote deleted -- 'deleted' picked
291 # local changed, remote deleted -- 'deleted' picked
292 _underlyingfctxifabsent(fcd).remove()
292 _underlyingfctxifabsent(fcd).remove()
293 deleted = True
293 deleted = True
294 else:
294 else:
295 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags())
295 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags())
296 deleted = False
296 deleted = False
297 return 0, deleted
297 return 0, deleted
298
298
299 @internaltool('fail', nomerge)
299 @internaltool('fail', nomerge)
300 def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
300 def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
301 """
301 """
302 Rather than attempting to merge files that were modified on both
302 Rather than attempting to merge files that were modified on both
303 branches, it marks them as unresolved. The resolve command must be
303 branches, it marks them as unresolved. The resolve command must be
304 used to resolve these conflicts."""
304 used to resolve these conflicts."""
305 # for change/delete conflicts write out the changed version, then fail
305 # for change/delete conflicts write out the changed version, then fail
306 if fcd.isabsent():
306 if fcd.isabsent():
307 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags())
307 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags())
308 return 1, False
308 return 1, False
309
309
310 def _underlyingfctxifabsent(filectx):
310 def _underlyingfctxifabsent(filectx):
311 """Sometimes when resolving, our fcd is actually an absentfilectx, but
311 """Sometimes when resolving, our fcd is actually an absentfilectx, but
312 we want to write to it (to do the resolve). This helper returns the
312 we want to write to it (to do the resolve). This helper returns the
313 underyling workingfilectx in that case.
313 underyling workingfilectx in that case.
314 """
314 """
315 if filectx.isabsent():
315 if filectx.isabsent():
316 return filectx.changectx()[filectx.path()]
316 return filectx.changectx()[filectx.path()]
317 else:
317 else:
318 return filectx
318 return filectx
319
319
320 def _premerge(repo, fcd, fco, fca, toolconf, files, labels=None):
320 def _premerge(repo, fcd, fco, fca, toolconf, files, labels=None):
321 tool, toolpath, binary, symlink = toolconf
321 tool, toolpath, binary, symlink = toolconf
322 if symlink or fcd.isabsent() or fco.isabsent():
322 if symlink or fcd.isabsent() or fco.isabsent():
323 return 1
323 return 1
324 unused, unused, unused, back = files
324 unused, unused, unused, back = files
325
325
326 ui = repo.ui
326 ui = repo.ui
327
327
328 validkeep = ['keep', 'keep-merge3']
328 validkeep = ['keep', 'keep-merge3']
329
329
330 # do we attempt to simplemerge first?
330 # do we attempt to simplemerge first?
331 try:
331 try:
332 premerge = _toolbool(ui, tool, "premerge", not binary)
332 premerge = _toolbool(ui, tool, "premerge", not binary)
333 except error.ConfigError:
333 except error.ConfigError:
334 premerge = _toolstr(ui, tool, "premerge", "").lower()
334 premerge = _toolstr(ui, tool, "premerge", "").lower()
335 if premerge not in validkeep:
335 if premerge not in validkeep:
336 _valid = ', '.join(["'" + v + "'" for v in validkeep])
336 _valid = ', '.join(["'" + v + "'" for v in validkeep])
337 raise error.ConfigError(_("%s.premerge not valid "
337 raise error.ConfigError(_("%s.premerge not valid "
338 "('%s' is neither boolean nor %s)") %
338 "('%s' is neither boolean nor %s)") %
339 (tool, premerge, _valid))
339 (tool, premerge, _valid))
340
340
341 if premerge:
341 if premerge:
342 if premerge == 'keep-merge3':
342 if premerge == 'keep-merge3':
343 if not labels:
343 if not labels:
344 labels = _defaultconflictlabels
344 labels = _defaultconflictlabels
345 if len(labels) < 3:
345 if len(labels) < 3:
346 labels.append('base')
346 labels.append('base')
347 r = simplemerge.simplemerge(ui, fcd, fca, fco, quiet=True, label=labels)
347 r = simplemerge.simplemerge(ui, fcd, fca, fco, quiet=True, label=labels)
348 if not r:
348 if not r:
349 ui.debug(" premerge successful\n")
349 ui.debug(" premerge successful\n")
350 return 0
350 return 0
351 if premerge not in validkeep:
351 if premerge not in validkeep:
352 # restore from backup and try again
352 # restore from backup and try again
353 _restorebackup(fcd, back)
353 _restorebackup(fcd, back)
354 return 1 # continue merging
354 return 1 # continue merging
355
355
356 def _mergecheck(repo, mynode, orig, fcd, fco, fca, toolconf):
356 def _mergecheck(repo, mynode, orig, fcd, fco, fca, toolconf):
357 tool, toolpath, binary, symlink = toolconf
357 tool, toolpath, binary, symlink = toolconf
358 if symlink:
358 if symlink:
359 repo.ui.warn(_('warning: internal %s cannot merge symlinks '
359 repo.ui.warn(_('warning: internal %s cannot merge symlinks '
360 'for %s\n') % (tool, fcd.path()))
360 'for %s\n') % (tool, fcd.path()))
361 return False
361 return False
362 if fcd.isabsent() or fco.isabsent():
362 if fcd.isabsent() or fco.isabsent():
363 repo.ui.warn(_('warning: internal %s cannot merge change/delete '
363 repo.ui.warn(_('warning: internal %s cannot merge change/delete '
364 'conflict for %s\n') % (tool, fcd.path()))
364 'conflict for %s\n') % (tool, fcd.path()))
365 return False
365 return False
366 return True
366 return True
367
367
368 def _merge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels, mode):
368 def _merge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels, mode):
369 """
369 """
370 Uses the internal non-interactive simple merge algorithm for merging
370 Uses the internal non-interactive simple merge algorithm for merging
371 files. It will fail if there are any conflicts and leave markers in
371 files. It will fail if there are any conflicts and leave markers in
372 the partially merged file. Markers will have two sections, one for each side
372 the partially merged file. Markers will have two sections, one for each side
373 of merge, unless mode equals 'union' which suppresses the markers."""
373 of merge, unless mode equals 'union' which suppresses the markers."""
374 ui = repo.ui
374 ui = repo.ui
375
375
376 r = simplemerge.simplemerge(ui, fcd, fca, fco, label=labels, mode=mode)
376 r = simplemerge.simplemerge(ui, fcd, fca, fco, label=labels, mode=mode)
377 return True, r, False
377 return True, r, False
378
378
379 @internaltool('union', fullmerge,
379 @internaltool('union', fullmerge,
380 _("warning: conflicts while merging %s! "
380 _("warning: conflicts while merging %s! "
381 "(edit, then use 'hg resolve --mark')\n"),
381 "(edit, then use 'hg resolve --mark')\n"),
382 precheck=_mergecheck)
382 precheck=_mergecheck)
383 def _iunion(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
383 def _iunion(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
384 """
384 """
385 Uses the internal non-interactive simple merge algorithm for merging
385 Uses the internal non-interactive simple merge algorithm for merging
386 files. It will use both left and right sides for conflict regions.
386 files. It will use both left and right sides for conflict regions.
387 No markers are inserted."""
387 No markers are inserted."""
388 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
388 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
389 files, labels, 'union')
389 files, labels, 'union')
390
390
391 @internaltool('merge', fullmerge,
391 @internaltool('merge', fullmerge,
392 _("warning: conflicts while merging %s! "
392 _("warning: conflicts while merging %s! "
393 "(edit, then use 'hg resolve --mark')\n"),
393 "(edit, then use 'hg resolve --mark')\n"),
394 precheck=_mergecheck)
394 precheck=_mergecheck)
395 def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
395 def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
396 """
396 """
397 Uses the internal non-interactive simple merge algorithm for merging
397 Uses the internal non-interactive simple merge algorithm for merging
398 files. It will fail if there are any conflicts and leave markers in
398 files. It will fail if there are any conflicts and leave markers in
399 the partially merged file. Markers will have two sections, one for each side
399 the partially merged file. Markers will have two sections, one for each side
400 of merge."""
400 of merge."""
401 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
401 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
402 files, labels, 'merge')
402 files, labels, 'merge')
403
403
404 @internaltool('merge3', fullmerge,
404 @internaltool('merge3', fullmerge,
405 _("warning: conflicts while merging %s! "
405 _("warning: conflicts while merging %s! "
406 "(edit, then use 'hg resolve --mark')\n"),
406 "(edit, then use 'hg resolve --mark')\n"),
407 precheck=_mergecheck)
407 precheck=_mergecheck)
408 def _imerge3(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
408 def _imerge3(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
409 """
409 """
410 Uses the internal non-interactive simple merge algorithm for merging
410 Uses the internal non-interactive simple merge algorithm for merging
411 files. It will fail if there are any conflicts and leave markers in
411 files. It will fail if there are any conflicts and leave markers in
412 the partially merged file. Marker will have three sections, one from each
412 the partially merged file. Marker will have three sections, one from each
413 side of the merge and one for the base content."""
413 side of the merge and one for the base content."""
414 if not labels:
414 if not labels:
415 labels = _defaultconflictlabels
415 labels = _defaultconflictlabels
416 if len(labels) < 3:
416 if len(labels) < 3:
417 labels.append('base')
417 labels.append('base')
418 return _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels)
418 return _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels)
419
419
420 def _imergeauto(repo, mynode, orig, fcd, fco, fca, toolconf, files,
420 def _imergeauto(repo, mynode, orig, fcd, fco, fca, toolconf, files,
421 labels=None, localorother=None):
421 labels=None, localorother=None):
422 """
422 """
423 Generic driver for _imergelocal and _imergeother
423 Generic driver for _imergelocal and _imergeother
424 """
424 """
425 assert localorother is not None
425 assert localorother is not None
426 tool, toolpath, binary, symlink = toolconf
426 tool, toolpath, binary, symlink = toolconf
427 r = simplemerge.simplemerge(repo.ui, fcd, fca, fco, label=labels,
427 r = simplemerge.simplemerge(repo.ui, fcd, fca, fco, label=labels,
428 localorother=localorother)
428 localorother=localorother)
429 return True, r
429 return True, r
430
430
431 @internaltool('merge-local', mergeonly, precheck=_mergecheck)
431 @internaltool('merge-local', mergeonly, precheck=_mergecheck)
432 def _imergelocal(*args, **kwargs):
432 def _imergelocal(*args, **kwargs):
433 """
433 """
434 Like :merge, but resolve all conflicts non-interactively in favor
434 Like :merge, but resolve all conflicts non-interactively in favor
435 of the local `p1()` changes."""
435 of the local `p1()` changes."""
436 success, status = _imergeauto(localorother='local', *args, **kwargs)
436 success, status = _imergeauto(localorother='local', *args, **kwargs)
437 return success, status, False
437 return success, status, False
438
438
439 @internaltool('merge-other', mergeonly, precheck=_mergecheck)
439 @internaltool('merge-other', mergeonly, precheck=_mergecheck)
440 def _imergeother(*args, **kwargs):
440 def _imergeother(*args, **kwargs):
441 """
441 """
442 Like :merge, but resolve all conflicts non-interactively in favor
442 Like :merge, but resolve all conflicts non-interactively in favor
443 of the other `p2()` changes."""
443 of the other `p2()` changes."""
444 success, status = _imergeauto(localorother='other', *args, **kwargs)
444 success, status = _imergeauto(localorother='other', *args, **kwargs)
445 return success, status, False
445 return success, status, False
446
446
447 @internaltool('tagmerge', mergeonly,
447 @internaltool('tagmerge', mergeonly,
448 _("automatic tag merging of %s failed! "
448 _("automatic tag merging of %s failed! "
449 "(use 'hg resolve --tool :merge' or another merge "
449 "(use 'hg resolve --tool :merge' or another merge "
450 "tool of your choice)\n"))
450 "tool of your choice)\n"))
451 def _itagmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
451 def _itagmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
452 """
452 """
453 Uses the internal tag merge algorithm (experimental).
453 Uses the internal tag merge algorithm (experimental).
454 """
454 """
455 success, status = tagmerge.merge(repo, fcd, fco, fca)
455 success, status = tagmerge.merge(repo, fcd, fco, fca)
456 return success, status, False
456 return success, status, False
457
457
458 @internaltool('dump', fullmerge)
458 @internaltool('dump', fullmerge)
459 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
459 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
460 """
460 """
461 Creates three versions of the files to merge, containing the
461 Creates three versions of the files to merge, containing the
462 contents of local, other and base. These files can then be used to
462 contents of local, other and base. These files can then be used to
463 perform a merge manually. If the file to be merged is named
463 perform a merge manually. If the file to be merged is named
464 ``a.txt``, these files will accordingly be named ``a.txt.local``,
464 ``a.txt``, these files will accordingly be named ``a.txt.local``,
465 ``a.txt.other`` and ``a.txt.base`` and they will be placed in the
465 ``a.txt.other`` and ``a.txt.base`` and they will be placed in the
466 same directory as ``a.txt``.
466 same directory as ``a.txt``.
467
467
468 This implies premerge. Therefore, files aren't dumped, if premerge
468 This implies premerge. Therefore, files aren't dumped, if premerge
469 runs successfully. Use :forcedump to forcibly write files out.
469 runs successfully. Use :forcedump to forcibly write files out.
470 """
470 """
471 a = _workingpath(repo, fcd)
471 a = _workingpath(repo, fcd)
472 fd = fcd.path()
472 fd = fcd.path()
473
473
474 from . import context
474 from . import context
475 if isinstance(fcd, context.overlayworkingfilectx):
475 if isinstance(fcd, context.overlayworkingfilectx):
476 raise error.InMemoryMergeConflictsError('in-memory merge does not '
476 raise error.InMemoryMergeConflictsError('in-memory merge does not '
477 'support the :dump tool.')
477 'support the :dump tool.')
478
478
479 util.writefile(a + ".local", fcd.decodeddata())
479 util.writefile(a + ".local", fcd.decodeddata())
480 repo.wwrite(fd + ".other", fco.data(), fco.flags())
480 repo.wwrite(fd + ".other", fco.data(), fco.flags())
481 repo.wwrite(fd + ".base", fca.data(), fca.flags())
481 repo.wwrite(fd + ".base", fca.data(), fca.flags())
482 return False, 1, False
482 return False, 1, False
483
483
484 @internaltool('forcedump', mergeonly)
484 @internaltool('forcedump', mergeonly)
485 def _forcedump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
485 def _forcedump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
486 labels=None):
486 labels=None):
487 """
487 """
488 Creates three versions of the files as same as :dump, but omits premerge.
488 Creates three versions of the files as same as :dump, but omits premerge.
489 """
489 """
490 return _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
490 return _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
491 labels=labels)
491 labels=labels)
492
492
493 def _xmergeimm(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
493 def _xmergeimm(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
494 # In-memory merge simply raises an exception on all external merge tools,
494 # In-memory merge simply raises an exception on all external merge tools,
495 # for now.
495 # for now.
496 #
496 #
497 # It would be possible to run most tools with temporary files, but this
497 # It would be possible to run most tools with temporary files, but this
498 # raises the question of what to do if the user only partially resolves the
498 # raises the question of what to do if the user only partially resolves the
499 # file -- we can't leave a merge state. (Copy to somewhere in the .hg/
499 # file -- we can't leave a merge state. (Copy to somewhere in the .hg/
500 # directory and tell the user how to get it is my best idea, but it's
500 # directory and tell the user how to get it is my best idea, but it's
501 # clunky.)
501 # clunky.)
502 raise error.InMemoryMergeConflictsError('in-memory merge does not support '
502 raise error.InMemoryMergeConflictsError('in-memory merge does not support '
503 'external merge tools')
503 'external merge tools')
504
504
505 def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
505 def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
506 tool, toolpath, binary, symlink = toolconf
506 tool, toolpath, binary, symlink = toolconf
507 if fcd.isabsent() or fco.isabsent():
507 if fcd.isabsent() or fco.isabsent():
508 repo.ui.warn(_('warning: %s cannot merge change/delete conflict '
508 repo.ui.warn(_('warning: %s cannot merge change/delete conflict '
509 'for %s\n') % (tool, fcd.path()))
509 'for %s\n') % (tool, fcd.path()))
510 return False, 1, None
510 return False, 1, None
511 unused, unused, unused, back = files
511 unused, unused, unused, back = files
512 a = _workingpath(repo, fcd)
512 a = _workingpath(repo, fcd)
513 b, c = _maketempfiles(repo, fco, fca)
513 b, c = _maketempfiles(repo, fco, fca)
514 try:
514 try:
515 out = ""
515 out = ""
516 mylabel, otherlabel = labels[:2]
517 if len(labels) >= 3:
518 baselabel = labels[2]
519 else:
520 baselabel = 'base'
516 env = {'HG_FILE': fcd.path(),
521 env = {'HG_FILE': fcd.path(),
517 'HG_MY_NODE': short(mynode),
522 'HG_MY_NODE': short(mynode),
518 'HG_OTHER_NODE': str(fco.changectx()),
523 'HG_OTHER_NODE': str(fco.changectx()),
519 'HG_BASE_NODE': str(fca.changectx()),
524 'HG_BASE_NODE': str(fca.changectx()),
520 'HG_MY_ISLINK': 'l' in fcd.flags(),
525 'HG_MY_ISLINK': 'l' in fcd.flags(),
521 'HG_OTHER_ISLINK': 'l' in fco.flags(),
526 'HG_OTHER_ISLINK': 'l' in fco.flags(),
522 'HG_BASE_ISLINK': 'l' in fca.flags(),
527 'HG_BASE_ISLINK': 'l' in fca.flags(),
528 'HG_MY_LABEL': mylabel,
529 'HG_OTHER_LABEL': otherlabel,
530 'HG_BASE_LABEL': baselabel,
523 }
531 }
524 ui = repo.ui
532 ui = repo.ui
525
533
526 args = _toolstr(ui, tool, "args")
534 args = _toolstr(ui, tool, "args")
527 if "$output" in args:
535 if "$output" in args:
528 # read input from backup, write to original
536 # read input from backup, write to original
529 out = a
537 out = a
530 a = repo.wvfs.join(back.path())
538 a = repo.wvfs.join(back.path())
531 replace = {'local': a, 'base': b, 'other': c, 'output': out}
539 replace = {'local': a, 'base': b, 'other': c, 'output': out,
540 'labellocal': mylabel, 'labelother': otherlabel,
541 'labelbase': baselabel}
532 args = util.interpolate(br'\$', replace, args,
542 args = util.interpolate(br'\$', replace, args,
533 lambda s: util.shellquote(util.localpath(s)))
543 lambda s: util.shellquote(util.localpath(s)))
534 cmd = toolpath + ' ' + args
544 cmd = toolpath + ' ' + args
535 if _toolbool(ui, tool, "gui"):
545 if _toolbool(ui, tool, "gui"):
536 repo.ui.status(_('running merge tool %s for file %s\n') %
546 repo.ui.status(_('running merge tool %s for file %s\n') %
537 (tool, fcd.path()))
547 (tool, fcd.path()))
538 repo.ui.debug('launching merge tool: %s\n' % cmd)
548 repo.ui.debug('launching merge tool: %s\n' % cmd)
539 r = ui.system(cmd, cwd=repo.root, environ=env, blockedtag='mergetool')
549 r = ui.system(cmd, cwd=repo.root, environ=env, blockedtag='mergetool')
540 repo.ui.debug('merge tool returned: %d\n' % r)
550 repo.ui.debug('merge tool returned: %d\n' % r)
541 return True, r, False
551 return True, r, False
542 finally:
552 finally:
543 util.unlink(b)
553 util.unlink(b)
544 util.unlink(c)
554 util.unlink(c)
545
555
546 def _formatconflictmarker(ctx, template, label, pad):
556 def _formatconflictmarker(ctx, template, label, pad):
547 """Applies the given template to the ctx, prefixed by the label.
557 """Applies the given template to the ctx, prefixed by the label.
548
558
549 Pad is the minimum width of the label prefix, so that multiple markers
559 Pad is the minimum width of the label prefix, so that multiple markers
550 can have aligned templated parts.
560 can have aligned templated parts.
551 """
561 """
552 if ctx.node() is None:
562 if ctx.node() is None:
553 ctx = ctx.p1()
563 ctx = ctx.p1()
554
564
555 props = {'ctx': ctx}
565 props = {'ctx': ctx}
556 templateresult = template.render(props)
566 templateresult = template.render(props)
557
567
558 label = ('%s:' % label).ljust(pad + 1)
568 label = ('%s:' % label).ljust(pad + 1)
559 mark = '%s %s' % (label, templateresult)
569 mark = '%s %s' % (label, templateresult)
560
570
561 if mark:
571 if mark:
562 mark = mark.splitlines()[0] # split for safety
572 mark = mark.splitlines()[0] # split for safety
563
573
564 # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ')
574 # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ')
565 return util.ellipsis(mark, 80 - 8)
575 return util.ellipsis(mark, 80 - 8)
566
576
567 _defaultconflictlabels = ['local', 'other']
577 _defaultconflictlabels = ['local', 'other']
568
578
569 def _formatlabels(repo, fcd, fco, fca, labels):
579 def _formatlabels(repo, fcd, fco, fca, labels, tool=None):
570 """Formats the given labels using the conflict marker template.
580 """Formats the given labels using the conflict marker template.
571
581
572 Returns a list of formatted labels.
582 Returns a list of formatted labels.
573 """
583 """
574 cd = fcd.changectx()
584 cd = fcd.changectx()
575 co = fco.changectx()
585 co = fco.changectx()
576 ca = fca.changectx()
586 ca = fca.changectx()
577
587
578 ui = repo.ui
588 ui = repo.ui
579 template = ui.config('ui', 'mergemarkertemplate')
589 template = ui.config('ui', 'mergemarkertemplate')
590 if tool is not None:
591 template = _toolstr(ui, tool, 'mergemarkertemplate', template)
580 template = templater.unquotestring(template)
592 template = templater.unquotestring(template)
581 tres = formatter.templateresources(ui, repo)
593 tres = formatter.templateresources(ui, repo)
582 tmpl = formatter.maketemplater(ui, template, defaults=templatekw.keywords,
594 tmpl = formatter.maketemplater(ui, template, defaults=templatekw.keywords,
583 resources=tres)
595 resources=tres)
584
596
585 pad = max(len(l) for l in labels)
597 pad = max(len(l) for l in labels)
586
598
587 newlabels = [_formatconflictmarker(cd, tmpl, labels[0], pad),
599 newlabels = [_formatconflictmarker(cd, tmpl, labels[0], pad),
588 _formatconflictmarker(co, tmpl, labels[1], pad)]
600 _formatconflictmarker(co, tmpl, labels[1], pad)]
589 if len(labels) > 2:
601 if len(labels) > 2:
590 newlabels.append(_formatconflictmarker(ca, tmpl, labels[2], pad))
602 newlabels.append(_formatconflictmarker(ca, tmpl, labels[2], pad))
591 return newlabels
603 return newlabels
592
604
593 def partextras(labels):
605 def partextras(labels):
594 """Return a dictionary of extra labels for use in prompts to the user
606 """Return a dictionary of extra labels for use in prompts to the user
595
607
596 Intended use is in strings of the form "(l)ocal%(l)s".
608 Intended use is in strings of the form "(l)ocal%(l)s".
597 """
609 """
598 if labels is None:
610 if labels is None:
599 return {
611 return {
600 "l": "",
612 "l": "",
601 "o": "",
613 "o": "",
602 }
614 }
603
615
604 return {
616 return {
605 "l": " [%s]" % labels[0],
617 "l": " [%s]" % labels[0],
606 "o": " [%s]" % labels[1],
618 "o": " [%s]" % labels[1],
607 }
619 }
608
620
609 def _restorebackup(fcd, back):
621 def _restorebackup(fcd, back):
610 # TODO: Add a workingfilectx.write(otherfilectx) path so we can use
622 # TODO: Add a workingfilectx.write(otherfilectx) path so we can use
611 # util.copy here instead.
623 # util.copy here instead.
612 fcd.write(back.data(), fcd.flags())
624 fcd.write(back.data(), fcd.flags())
613
625
614 def _makebackup(repo, ui, wctx, fcd, premerge):
626 def _makebackup(repo, ui, wctx, fcd, premerge):
615 """Makes and returns a filectx-like object for ``fcd``'s backup file.
627 """Makes and returns a filectx-like object for ``fcd``'s backup file.
616
628
617 In addition to preserving the user's pre-existing modifications to `fcd`
629 In addition to preserving the user's pre-existing modifications to `fcd`
618 (if any), the backup is used to undo certain premerges, confirm whether a
630 (if any), the backup is used to undo certain premerges, confirm whether a
619 merge changed anything, and determine what line endings the new file should
631 merge changed anything, and determine what line endings the new file should
620 have.
632 have.
621
633
622 Backups only need to be written once (right before the premerge) since their
634 Backups only need to be written once (right before the premerge) since their
623 content doesn't change afterwards.
635 content doesn't change afterwards.
624 """
636 """
625 if fcd.isabsent():
637 if fcd.isabsent():
626 return None
638 return None
627 # TODO: Break this import cycle somehow. (filectx -> ctx -> fileset ->
639 # TODO: Break this import cycle somehow. (filectx -> ctx -> fileset ->
628 # merge -> filemerge). (I suspect the fileset import is the weakest link)
640 # merge -> filemerge). (I suspect the fileset import is the weakest link)
629 from . import context
641 from . import context
630 a = _workingpath(repo, fcd)
642 a = _workingpath(repo, fcd)
631 back = scmutil.origpath(ui, repo, a)
643 back = scmutil.origpath(ui, repo, a)
632 inworkingdir = (back.startswith(repo.wvfs.base) and not
644 inworkingdir = (back.startswith(repo.wvfs.base) and not
633 back.startswith(repo.vfs.base))
645 back.startswith(repo.vfs.base))
634 if isinstance(fcd, context.overlayworkingfilectx) and inworkingdir:
646 if isinstance(fcd, context.overlayworkingfilectx) and inworkingdir:
635 # If the backup file is to be in the working directory, and we're
647 # If the backup file is to be in the working directory, and we're
636 # merging in-memory, we must redirect the backup to the memory context
648 # merging in-memory, we must redirect the backup to the memory context
637 # so we don't disturb the working directory.
649 # so we don't disturb the working directory.
638 relpath = back[len(repo.wvfs.base) + 1:]
650 relpath = back[len(repo.wvfs.base) + 1:]
639 if premerge:
651 if premerge:
640 wctx[relpath].write(fcd.data(), fcd.flags())
652 wctx[relpath].write(fcd.data(), fcd.flags())
641 return wctx[relpath]
653 return wctx[relpath]
642 else:
654 else:
643 if premerge:
655 if premerge:
644 # Otherwise, write to wherever path the user specified the backups
656 # Otherwise, write to wherever path the user specified the backups
645 # should go. We still need to switch based on whether the source is
657 # should go. We still need to switch based on whether the source is
646 # in-memory so we can use the fast path of ``util.copy`` if both are
658 # in-memory so we can use the fast path of ``util.copy`` if both are
647 # on disk.
659 # on disk.
648 if isinstance(fcd, context.overlayworkingfilectx):
660 if isinstance(fcd, context.overlayworkingfilectx):
649 util.writefile(back, fcd.data())
661 util.writefile(back, fcd.data())
650 else:
662 else:
651 util.copyfile(a, back)
663 util.copyfile(a, back)
652 # A arbitraryfilectx is returned, so we can run the same functions on
664 # A arbitraryfilectx is returned, so we can run the same functions on
653 # the backup context regardless of where it lives.
665 # the backup context regardless of where it lives.
654 return context.arbitraryfilectx(back, repo=repo)
666 return context.arbitraryfilectx(back, repo=repo)
655
667
656 def _maketempfiles(repo, fco, fca):
668 def _maketempfiles(repo, fco, fca):
657 """Writes out `fco` and `fca` as temporary files, so an external merge
669 """Writes out `fco` and `fca` as temporary files, so an external merge
658 tool may use them.
670 tool may use them.
659 """
671 """
660 def temp(prefix, ctx):
672 def temp(prefix, ctx):
661 fullbase, ext = os.path.splitext(ctx.path())
673 fullbase, ext = os.path.splitext(ctx.path())
662 pre = "%s~%s." % (os.path.basename(fullbase), prefix)
674 pre = "%s~%s." % (os.path.basename(fullbase), prefix)
663 (fd, name) = tempfile.mkstemp(prefix=pre, suffix=ext)
675 (fd, name) = tempfile.mkstemp(prefix=pre, suffix=ext)
664 data = repo.wwritedata(ctx.path(), ctx.data())
676 data = repo.wwritedata(ctx.path(), ctx.data())
665 f = os.fdopen(fd, pycompat.sysstr("wb"))
677 f = os.fdopen(fd, pycompat.sysstr("wb"))
666 f.write(data)
678 f.write(data)
667 f.close()
679 f.close()
668 return name
680 return name
669
681
670 b = temp("base", fca)
682 b = temp("base", fca)
671 c = temp("other", fco)
683 c = temp("other", fco)
672
684
673 return b, c
685 return b, c
674
686
675 def _filemerge(premerge, repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
687 def _filemerge(premerge, repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
676 """perform a 3-way merge in the working directory
688 """perform a 3-way merge in the working directory
677
689
678 premerge = whether this is a premerge
690 premerge = whether this is a premerge
679 mynode = parent node before merge
691 mynode = parent node before merge
680 orig = original local filename before merge
692 orig = original local filename before merge
681 fco = other file context
693 fco = other file context
682 fca = ancestor file context
694 fca = ancestor file context
683 fcd = local file context for current/destination file
695 fcd = local file context for current/destination file
684
696
685 Returns whether the merge is complete, the return value of the merge, and
697 Returns whether the merge is complete, the return value of the merge, and
686 a boolean indicating whether the file was deleted from disk."""
698 a boolean indicating whether the file was deleted from disk."""
687
699
688 if not fco.cmp(fcd): # files identical?
700 if not fco.cmp(fcd): # files identical?
689 return True, None, False
701 return True, None, False
690
702
691 ui = repo.ui
703 ui = repo.ui
692 fd = fcd.path()
704 fd = fcd.path()
693 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary()
705 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary()
694 symlink = 'l' in fcd.flags() + fco.flags()
706 symlink = 'l' in fcd.flags() + fco.flags()
695 changedelete = fcd.isabsent() or fco.isabsent()
707 changedelete = fcd.isabsent() or fco.isabsent()
696 tool, toolpath = _picktool(repo, ui, fd, binary, symlink, changedelete)
708 tool, toolpath = _picktool(repo, ui, fd, binary, symlink, changedelete)
697 if tool in internals and tool.startswith('internal:'):
709 if tool in internals and tool.startswith('internal:'):
698 # normalize to new-style names (':merge' etc)
710 # normalize to new-style names (':merge' etc)
699 tool = tool[len('internal'):]
711 tool = tool[len('internal'):]
700 ui.debug("picked tool '%s' for %s (binary %s symlink %s changedelete %s)\n"
712 ui.debug("picked tool '%s' for %s (binary %s symlink %s changedelete %s)\n"
701 % (tool, fd, pycompat.bytestr(binary), pycompat.bytestr(symlink),
713 % (tool, fd, pycompat.bytestr(binary), pycompat.bytestr(symlink),
702 pycompat.bytestr(changedelete)))
714 pycompat.bytestr(changedelete)))
703
715
704 if tool in internals:
716 if tool in internals:
705 func = internals[tool]
717 func = internals[tool]
706 mergetype = func.mergetype
718 mergetype = func.mergetype
707 onfailure = func.onfailure
719 onfailure = func.onfailure
708 precheck = func.precheck
720 precheck = func.precheck
721 isexternal = False
709 else:
722 else:
710 if wctx.isinmemory():
723 if wctx.isinmemory():
711 func = _xmergeimm
724 func = _xmergeimm
712 else:
725 else:
713 func = _xmerge
726 func = _xmerge
714 mergetype = fullmerge
727 mergetype = fullmerge
715 onfailure = _("merging %s failed!\n")
728 onfailure = _("merging %s failed!\n")
716 precheck = None
729 precheck = None
730 isexternal = True
717
731
718 toolconf = tool, toolpath, binary, symlink
732 toolconf = tool, toolpath, binary, symlink
719
733
720 if mergetype == nomerge:
734 if mergetype == nomerge:
721 r, deleted = func(repo, mynode, orig, fcd, fco, fca, toolconf, labels)
735 r, deleted = func(repo, mynode, orig, fcd, fco, fca, toolconf, labels)
722 return True, r, deleted
736 return True, r, deleted
723
737
724 if premerge:
738 if premerge:
725 if orig != fco.path():
739 if orig != fco.path():
726 ui.status(_("merging %s and %s to %s\n") % (orig, fco.path(), fd))
740 ui.status(_("merging %s and %s to %s\n") % (orig, fco.path(), fd))
727 else:
741 else:
728 ui.status(_("merging %s\n") % fd)
742 ui.status(_("merging %s\n") % fd)
729
743
730 ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))
744 ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))
731
745
732 if precheck and not precheck(repo, mynode, orig, fcd, fco, fca,
746 if precheck and not precheck(repo, mynode, orig, fcd, fco, fca,
733 toolconf):
747 toolconf):
734 if onfailure:
748 if onfailure:
735 if wctx.isinmemory():
749 if wctx.isinmemory():
736 raise error.InMemoryMergeConflictsError('in-memory merge does '
750 raise error.InMemoryMergeConflictsError('in-memory merge does '
737 'not support merge '
751 'not support merge '
738 'conflicts')
752 'conflicts')
739 ui.warn(onfailure % fd)
753 ui.warn(onfailure % fd)
740 return True, 1, False
754 return True, 1, False
741
755
742 back = _makebackup(repo, ui, wctx, fcd, premerge)
756 back = _makebackup(repo, ui, wctx, fcd, premerge)
743 files = (None, None, None, back)
757 files = (None, None, None, back)
744 r = 1
758 r = 1
745 try:
759 try:
746 markerstyle = ui.config('ui', 'mergemarkers')
760 internalmarkerstyle = ui.config('ui', 'mergemarkers')
761 if isexternal:
762 markerstyle = _toolstr(ui, tool, 'mergemarkers')
763 else:
764 markerstyle = internalmarkerstyle
765
747 if not labels:
766 if not labels:
748 labels = _defaultconflictlabels
767 labels = _defaultconflictlabels
768 formattedlabels = labels
749 if markerstyle != 'basic':
769 if markerstyle != 'basic':
750 labels = _formatlabels(repo, fcd, fco, fca, labels)
770 formattedlabels = _formatlabels(repo, fcd, fco, fca, labels,
771 tool=tool)
751
772
752 if premerge and mergetype == fullmerge:
773 if premerge and mergetype == fullmerge:
753 r = _premerge(repo, fcd, fco, fca, toolconf, files, labels=labels)
774 # conflict markers generated by premerge will use 'detailed'
775 # settings if either ui.mergemarkers or the tool's mergemarkers
776 # setting is 'detailed'. This way tools can have basic labels in
777 # space-constrained areas of the UI, but still get full information
778 # in conflict markers if premerge is 'keep' or 'keep-merge3'.
779 premergelabels = labels
780 labeltool = None
781 if markerstyle != 'basic':
782 # respect 'tool's mergemarkertemplate (which defaults to
783 # ui.mergemarkertemplate)
784 labeltool = tool
785 if internalmarkerstyle != 'basic' or markerstyle != 'basic':
786 premergelabels = _formatlabels(repo, fcd, fco, fca,
787 premergelabels, tool=labeltool)
788
789 r = _premerge(repo, fcd, fco, fca, toolconf, files,
790 labels=premergelabels)
754 # complete if premerge successful (r is 0)
791 # complete if premerge successful (r is 0)
755 return not r, r, False
792 return not r, r, False
756
793
757 needcheck, r, deleted = func(repo, mynode, orig, fcd, fco, fca,
794 needcheck, r, deleted = func(repo, mynode, orig, fcd, fco, fca,
758 toolconf, files, labels=labels)
795 toolconf, files, labels=formattedlabels)
759
796
760 if needcheck:
797 if needcheck:
761 r = _check(repo, r, ui, tool, fcd, files)
798 r = _check(repo, r, ui, tool, fcd, files)
762
799
763 if r:
800 if r:
764 if onfailure:
801 if onfailure:
765 if wctx.isinmemory():
802 if wctx.isinmemory():
766 raise error.InMemoryMergeConflictsError('in-memory merge '
803 raise error.InMemoryMergeConflictsError('in-memory merge '
767 'does not support '
804 'does not support '
768 'merge conflicts')
805 'merge conflicts')
769 ui.warn(onfailure % fd)
806 ui.warn(onfailure % fd)
770 _onfilemergefailure(ui)
807 _onfilemergefailure(ui)
771
808
772 return True, r, deleted
809 return True, r, deleted
773 finally:
810 finally:
774 if not r and back is not None:
811 if not r and back is not None:
775 back.remove()
812 back.remove()
776
813
777 def _haltmerge():
814 def _haltmerge():
778 msg = _('merge halted after failed merge (see hg resolve)')
815 msg = _('merge halted after failed merge (see hg resolve)')
779 raise error.InterventionRequired(msg)
816 raise error.InterventionRequired(msg)
780
817
781 def _onfilemergefailure(ui):
818 def _onfilemergefailure(ui):
782 action = ui.config('merge', 'on-failure')
819 action = ui.config('merge', 'on-failure')
783 if action == 'prompt':
820 if action == 'prompt':
784 msg = _('continue merge operation (yn)?' '$$ &Yes $$ &No')
821 msg = _('continue merge operation (yn)?' '$$ &Yes $$ &No')
785 if ui.promptchoice(msg, 0) == 1:
822 if ui.promptchoice(msg, 0) == 1:
786 _haltmerge()
823 _haltmerge()
787 if action == 'halt':
824 if action == 'halt':
788 _haltmerge()
825 _haltmerge()
789 # default action is 'continue', in which case we neither prompt nor halt
826 # default action is 'continue', in which case we neither prompt nor halt
790
827
791 def _check(repo, r, ui, tool, fcd, files):
828 def _check(repo, r, ui, tool, fcd, files):
792 fd = fcd.path()
829 fd = fcd.path()
793 unused, unused, unused, back = files
830 unused, unused, unused, back = files
794
831
795 if not r and (_toolbool(ui, tool, "checkconflicts") or
832 if not r and (_toolbool(ui, tool, "checkconflicts") or
796 'conflicts' in _toollist(ui, tool, "check")):
833 'conflicts' in _toollist(ui, tool, "check")):
797 if re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcd.data(),
834 if re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcd.data(),
798 re.MULTILINE):
835 re.MULTILINE):
799 r = 1
836 r = 1
800
837
801 checked = False
838 checked = False
802 if 'prompt' in _toollist(ui, tool, "check"):
839 if 'prompt' in _toollist(ui, tool, "check"):
803 checked = True
840 checked = True
804 if ui.promptchoice(_("was merge of '%s' successful (yn)?"
841 if ui.promptchoice(_("was merge of '%s' successful (yn)?"
805 "$$ &Yes $$ &No") % fd, 1):
842 "$$ &Yes $$ &No") % fd, 1):
806 r = 1
843 r = 1
807
844
808 if not r and not checked and (_toolbool(ui, tool, "checkchanged") or
845 if not r and not checked and (_toolbool(ui, tool, "checkchanged") or
809 'changed' in
846 'changed' in
810 _toollist(ui, tool, "check")):
847 _toollist(ui, tool, "check")):
811 if back is not None and not fcd.cmp(back):
848 if back is not None and not fcd.cmp(back):
812 if ui.promptchoice(_(" output file %s appears unchanged\n"
849 if ui.promptchoice(_(" output file %s appears unchanged\n"
813 "was merge successful (yn)?"
850 "was merge successful (yn)?"
814 "$$ &Yes $$ &No") % fd, 1):
851 "$$ &Yes $$ &No") % fd, 1):
815 r = 1
852 r = 1
816
853
817 if back is not None and _toolbool(ui, tool, "fixeol"):
854 if back is not None and _toolbool(ui, tool, "fixeol"):
818 _matcheol(_workingpath(repo, fcd), back)
855 _matcheol(_workingpath(repo, fcd), back)
819
856
820 return r
857 return r
821
858
822 def _workingpath(repo, ctx):
859 def _workingpath(repo, ctx):
823 return repo.wjoin(ctx.path())
860 return repo.wjoin(ctx.path())
824
861
825 def premerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
862 def premerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
826 return _filemerge(True, repo, wctx, mynode, orig, fcd, fco, fca,
863 return _filemerge(True, repo, wctx, mynode, orig, fcd, fco, fca,
827 labels=labels)
864 labels=labels)
828
865
829 def filemerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
866 def filemerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
830 return _filemerge(False, repo, wctx, mynode, orig, fcd, fco, fca,
867 return _filemerge(False, repo, wctx, mynode, orig, fcd, fco, fca,
831 labels=labels)
868 labels=labels)
832
869
833 def loadinternalmerge(ui, extname, registrarobj):
870 def loadinternalmerge(ui, extname, registrarobj):
834 """Load internal merge tool from specified registrarobj
871 """Load internal merge tool from specified registrarobj
835 """
872 """
836 for name, func in registrarobj._table.iteritems():
873 for name, func in registrarobj._table.iteritems():
837 fullname = ':' + name
874 fullname = ':' + name
838 internals[fullname] = func
875 internals[fullname] = func
839 internals['internal:' + name] = func
876 internals['internal:' + name] = func
840 internalsdoc[fullname] = func
877 internalsdoc[fullname] = func
841
878
842 # load built-in merge tools explicitly to setup internalsdoc
879 # load built-in merge tools explicitly to setup internalsdoc
843 loadinternalmerge(None, None, internaltool)
880 loadinternalmerge(None, None, internaltool)
844
881
845 # tell hggettext to extract docstrings from these functions:
882 # tell hggettext to extract docstrings from these functions:
846 i18nfunctions = internals.values()
883 i18nfunctions = internals.values()
@@ -1,2599 +1,2621 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 ``ignorewseol``
316 ``ignorewseol``
317 Ignore white space at the end of a line when comparing lines.
317 Ignore white space at the end of a line when comparing lines.
318
318
319 ``ignorewsamount``
319 ``ignorewsamount``
320 Ignore changes in the amount of white space.
320 Ignore changes in the amount of white space.
321
321
322 ``ignoreblanklines``
322 ``ignoreblanklines``
323 Ignore changes whose lines are all blank.
323 Ignore changes whose lines are all blank.
324
324
325
325
326 ``auth``
326 ``auth``
327 --------
327 --------
328
328
329 Authentication credentials and other authentication-like configuration
329 Authentication credentials and other authentication-like configuration
330 for HTTP connections. This section allows you to store usernames and
330 for HTTP connections. This section allows you to store usernames and
331 passwords for use when logging *into* HTTP servers. See
331 passwords for use when logging *into* HTTP servers. See
332 :hg:`help config.web` if you want to configure *who* can login to
332 :hg:`help config.web` if you want to configure *who* can login to
333 your HTTP server.
333 your HTTP server.
334
334
335 The following options apply to all hosts.
335 The following options apply to all hosts.
336
336
337 ``cookiefile``
337 ``cookiefile``
338 Path to a file containing HTTP cookie lines. Cookies matching a
338 Path to a file containing HTTP cookie lines. Cookies matching a
339 host will be sent automatically.
339 host will be sent automatically.
340
340
341 The file format uses the Mozilla cookies.txt format, which defines cookies
341 The file format uses the Mozilla cookies.txt format, which defines cookies
342 on their own lines. Each line contains 7 fields delimited by the tab
342 on their own lines. Each line contains 7 fields delimited by the tab
343 character (domain, is_domain_cookie, path, is_secure, expires, name,
343 character (domain, is_domain_cookie, path, is_secure, expires, name,
344 value). For more info, do an Internet search for "Netscape cookies.txt
344 value). For more info, do an Internet search for "Netscape cookies.txt
345 format."
345 format."
346
346
347 Note: the cookies parser does not handle port numbers on domains. You
347 Note: the cookies parser does not handle port numbers on domains. You
348 will need to remove ports from the domain for the cookie to be recognized.
348 will need to remove ports from the domain for the cookie to be recognized.
349 This could result in a cookie being disclosed to an unwanted server.
349 This could result in a cookie being disclosed to an unwanted server.
350
350
351 The cookies file is read-only.
351 The cookies file is read-only.
352
352
353 Other options in this section are grouped by name and have the following
353 Other options in this section are grouped by name and have the following
354 format::
354 format::
355
355
356 <name>.<argument> = <value>
356 <name>.<argument> = <value>
357
357
358 where ``<name>`` is used to group arguments into authentication
358 where ``<name>`` is used to group arguments into authentication
359 entries. Example::
359 entries. Example::
360
360
361 foo.prefix = hg.intevation.de/mercurial
361 foo.prefix = hg.intevation.de/mercurial
362 foo.username = foo
362 foo.username = foo
363 foo.password = bar
363 foo.password = bar
364 foo.schemes = http https
364 foo.schemes = http https
365
365
366 bar.prefix = secure.example.org
366 bar.prefix = secure.example.org
367 bar.key = path/to/file.key
367 bar.key = path/to/file.key
368 bar.cert = path/to/file.cert
368 bar.cert = path/to/file.cert
369 bar.schemes = https
369 bar.schemes = https
370
370
371 Supported arguments:
371 Supported arguments:
372
372
373 ``prefix``
373 ``prefix``
374 Either ``*`` or a URI prefix with or without the scheme part.
374 Either ``*`` or a URI prefix with or without the scheme part.
375 The authentication entry with the longest matching prefix is used
375 The authentication entry with the longest matching prefix is used
376 (where ``*`` matches everything and counts as a match of length
376 (where ``*`` matches everything and counts as a match of length
377 1). If the prefix doesn't include a scheme, the match is performed
377 1). If the prefix doesn't include a scheme, the match is performed
378 against the URI with its scheme stripped as well, and the schemes
378 against the URI with its scheme stripped as well, and the schemes
379 argument, q.v., is then subsequently consulted.
379 argument, q.v., is then subsequently consulted.
380
380
381 ``username``
381 ``username``
382 Optional. Username to authenticate with. If not given, and the
382 Optional. Username to authenticate with. If not given, and the
383 remote site requires basic or digest authentication, the user will
383 remote site requires basic or digest authentication, the user will
384 be prompted for it. Environment variables are expanded in the
384 be prompted for it. Environment variables are expanded in the
385 username letting you do ``foo.username = $USER``. If the URI
385 username letting you do ``foo.username = $USER``. If the URI
386 includes a username, only ``[auth]`` entries with a matching
386 includes a username, only ``[auth]`` entries with a matching
387 username or without a username will be considered.
387 username or without a username will be considered.
388
388
389 ``password``
389 ``password``
390 Optional. Password to authenticate with. If not given, and the
390 Optional. Password to authenticate with. If not given, and the
391 remote site requires basic or digest authentication, the user
391 remote site requires basic or digest authentication, the user
392 will be prompted for it.
392 will be prompted for it.
393
393
394 ``key``
394 ``key``
395 Optional. PEM encoded client certificate key file. Environment
395 Optional. PEM encoded client certificate key file. Environment
396 variables are expanded in the filename.
396 variables are expanded in the filename.
397
397
398 ``cert``
398 ``cert``
399 Optional. PEM encoded client certificate chain file. Environment
399 Optional. PEM encoded client certificate chain file. Environment
400 variables are expanded in the filename.
400 variables are expanded in the filename.
401
401
402 ``schemes``
402 ``schemes``
403 Optional. Space separated list of URI schemes to use this
403 Optional. Space separated list of URI schemes to use this
404 authentication entry with. Only used if the prefix doesn't include
404 authentication entry with. Only used if the prefix doesn't include
405 a scheme. Supported schemes are http and https. They will match
405 a scheme. Supported schemes are http and https. They will match
406 static-http and static-https respectively, as well.
406 static-http and static-https respectively, as well.
407 (default: https)
407 (default: https)
408
408
409 If no suitable authentication entry is found, the user is prompted
409 If no suitable authentication entry is found, the user is prompted
410 for credentials as usual if required by the remote.
410 for credentials as usual if required by the remote.
411
411
412 ``color``
412 ``color``
413 ---------
413 ---------
414
414
415 Configure the Mercurial color mode. For details about how to define your custom
415 Configure the Mercurial color mode. For details about how to define your custom
416 effect and style see :hg:`help color`.
416 effect and style see :hg:`help color`.
417
417
418 ``mode``
418 ``mode``
419 String: control the method used to output color. One of ``auto``, ``ansi``,
419 String: control the method used to output color. One of ``auto``, ``ansi``,
420 ``win32``, ``terminfo`` or ``debug``. In auto mode, Mercurial will
420 ``win32``, ``terminfo`` or ``debug``. In auto mode, Mercurial will
421 use ANSI mode by default (or win32 mode prior to Windows 10) if it detects a
421 use ANSI mode by default (or win32 mode prior to Windows 10) if it detects a
422 terminal. Any invalid value will disable color.
422 terminal. Any invalid value will disable color.
423
423
424 ``pagermode``
424 ``pagermode``
425 String: optional override of ``color.mode`` used with pager.
425 String: optional override of ``color.mode`` used with pager.
426
426
427 On some systems, terminfo mode may cause problems when using
427 On some systems, terminfo mode may cause problems when using
428 color with ``less -R`` as a pager program. less with the -R option
428 color with ``less -R`` as a pager program. less with the -R option
429 will only display ECMA-48 color codes, and terminfo mode may sometimes
429 will only display ECMA-48 color codes, and terminfo mode may sometimes
430 emit codes that less doesn't understand. You can work around this by
430 emit codes that less doesn't understand. You can work around this by
431 either using ansi mode (or auto mode), or by using less -r (which will
431 either using ansi mode (or auto mode), or by using less -r (which will
432 pass through all terminal control codes, not just color control
432 pass through all terminal control codes, not just color control
433 codes).
433 codes).
434
434
435 On some systems (such as MSYS in Windows), the terminal may support
435 On some systems (such as MSYS in Windows), the terminal may support
436 a different color mode than the pager program.
436 a different color mode than the pager program.
437
437
438 ``commands``
438 ``commands``
439 ------------
439 ------------
440
440
441 ``status.relative``
441 ``status.relative``
442 Make paths in :hg:`status` output relative to the current directory.
442 Make paths in :hg:`status` output relative to the current directory.
443 (default: False)
443 (default: False)
444
444
445 ``update.check``
445 ``update.check``
446 Determines what level of checking :hg:`update` will perform before moving
446 Determines what level of checking :hg:`update` will perform before moving
447 to a destination revision. Valid values are ``abort``, ``none``,
447 to a destination revision. Valid values are ``abort``, ``none``,
448 ``linear``, and ``noconflict``. ``abort`` always fails if the working
448 ``linear``, and ``noconflict``. ``abort`` always fails if the working
449 directory has uncommitted changes. ``none`` performs no checking, and may
449 directory has uncommitted changes. ``none`` performs no checking, and may
450 result in a merge with uncommitted changes. ``linear`` allows any update
450 result in a merge with uncommitted changes. ``linear`` allows any update
451 as long as it follows a straight line in the revision history, and may
451 as long as it follows a straight line in the revision history, and may
452 trigger a merge with uncommitted changes. ``noconflict`` will allow any
452 trigger a merge with uncommitted changes. ``noconflict`` will allow any
453 update which would not trigger a merge with uncommitted changes, if any
453 update which would not trigger a merge with uncommitted changes, if any
454 are present.
454 are present.
455 (default: ``linear``)
455 (default: ``linear``)
456
456
457 ``update.requiredest``
457 ``update.requiredest``
458 Require that the user pass a destination when running :hg:`update`.
458 Require that the user pass a destination when running :hg:`update`.
459 For example, :hg:`update .::` will be allowed, but a plain :hg:`update`
459 For example, :hg:`update .::` will be allowed, but a plain :hg:`update`
460 will be disallowed.
460 will be disallowed.
461 (default: False)
461 (default: False)
462
462
463 ``committemplate``
463 ``committemplate``
464 ------------------
464 ------------------
465
465
466 ``changeset``
466 ``changeset``
467 String: configuration in this section is used as the template to
467 String: configuration in this section is used as the template to
468 customize the text shown in the editor when committing.
468 customize the text shown in the editor when committing.
469
469
470 In addition to pre-defined template keywords, commit log specific one
470 In addition to pre-defined template keywords, commit log specific one
471 below can be used for customization:
471 below can be used for customization:
472
472
473 ``extramsg``
473 ``extramsg``
474 String: Extra message (typically 'Leave message empty to abort
474 String: Extra message (typically 'Leave message empty to abort
475 commit.'). This may be changed by some commands or extensions.
475 commit.'). This may be changed by some commands or extensions.
476
476
477 For example, the template configuration below shows as same text as
477 For example, the template configuration below shows as same text as
478 one shown by default::
478 one shown by default::
479
479
480 [committemplate]
480 [committemplate]
481 changeset = {desc}\n\n
481 changeset = {desc}\n\n
482 HG: Enter commit message. Lines beginning with 'HG:' are removed.
482 HG: Enter commit message. Lines beginning with 'HG:' are removed.
483 HG: {extramsg}
483 HG: {extramsg}
484 HG: --
484 HG: --
485 HG: user: {author}\n{ifeq(p2rev, "-1", "",
485 HG: user: {author}\n{ifeq(p2rev, "-1", "",
486 "HG: branch merge\n")
486 "HG: branch merge\n")
487 }HG: branch '{branch}'\n{if(activebookmark,
487 }HG: branch '{branch}'\n{if(activebookmark,
488 "HG: bookmark '{activebookmark}'\n") }{subrepos %
488 "HG: bookmark '{activebookmark}'\n") }{subrepos %
489 "HG: subrepo {subrepo}\n" }{file_adds %
489 "HG: subrepo {subrepo}\n" }{file_adds %
490 "HG: added {file}\n" }{file_mods %
490 "HG: added {file}\n" }{file_mods %
491 "HG: changed {file}\n" }{file_dels %
491 "HG: changed {file}\n" }{file_dels %
492 "HG: removed {file}\n" }{if(files, "",
492 "HG: removed {file}\n" }{if(files, "",
493 "HG: no files changed\n")}
493 "HG: no files changed\n")}
494
494
495 ``diff()``
495 ``diff()``
496 String: show the diff (see :hg:`help templates` for detail)
496 String: show the diff (see :hg:`help templates` for detail)
497
497
498 Sometimes it is helpful to show the diff of the changeset in the editor without
498 Sometimes it is helpful to show the diff of the changeset in the editor without
499 having to prefix 'HG: ' to each line so that highlighting works correctly. For
499 having to prefix 'HG: ' to each line so that highlighting works correctly. For
500 this, Mercurial provides a special string which will ignore everything below
500 this, Mercurial provides a special string which will ignore everything below
501 it::
501 it::
502
502
503 HG: ------------------------ >8 ------------------------
503 HG: ------------------------ >8 ------------------------
504
504
505 For example, the template configuration below will show the diff below the
505 For example, the template configuration below will show the diff below the
506 extra message::
506 extra message::
507
507
508 [committemplate]
508 [committemplate]
509 changeset = {desc}\n\n
509 changeset = {desc}\n\n
510 HG: Enter commit message. Lines beginning with 'HG:' are removed.
510 HG: Enter commit message. Lines beginning with 'HG:' are removed.
511 HG: {extramsg}
511 HG: {extramsg}
512 HG: ------------------------ >8 ------------------------
512 HG: ------------------------ >8 ------------------------
513 HG: Do not touch the line above.
513 HG: Do not touch the line above.
514 HG: Everything below will be removed.
514 HG: Everything below will be removed.
515 {diff()}
515 {diff()}
516
516
517 .. note::
517 .. note::
518
518
519 For some problematic encodings (see :hg:`help win32mbcs` for
519 For some problematic encodings (see :hg:`help win32mbcs` for
520 detail), this customization should be configured carefully, to
520 detail), this customization should be configured carefully, to
521 avoid showing broken characters.
521 avoid showing broken characters.
522
522
523 For example, if a multibyte character ending with backslash (0x5c) is
523 For example, if a multibyte character ending with backslash (0x5c) is
524 followed by the ASCII character 'n' in the customized template,
524 followed by the ASCII character 'n' in the customized template,
525 the sequence of backslash and 'n' is treated as line-feed unexpectedly
525 the sequence of backslash and 'n' is treated as line-feed unexpectedly
526 (and the multibyte character is broken, too).
526 (and the multibyte character is broken, too).
527
527
528 Customized template is used for commands below (``--edit`` may be
528 Customized template is used for commands below (``--edit`` may be
529 required):
529 required):
530
530
531 - :hg:`backout`
531 - :hg:`backout`
532 - :hg:`commit`
532 - :hg:`commit`
533 - :hg:`fetch` (for merge commit only)
533 - :hg:`fetch` (for merge commit only)
534 - :hg:`graft`
534 - :hg:`graft`
535 - :hg:`histedit`
535 - :hg:`histedit`
536 - :hg:`import`
536 - :hg:`import`
537 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
537 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
538 - :hg:`rebase`
538 - :hg:`rebase`
539 - :hg:`shelve`
539 - :hg:`shelve`
540 - :hg:`sign`
540 - :hg:`sign`
541 - :hg:`tag`
541 - :hg:`tag`
542 - :hg:`transplant`
542 - :hg:`transplant`
543
543
544 Configuring items below instead of ``changeset`` allows showing
544 Configuring items below instead of ``changeset`` allows showing
545 customized message only for specific actions, or showing different
545 customized message only for specific actions, or showing different
546 messages for each action.
546 messages for each action.
547
547
548 - ``changeset.backout`` for :hg:`backout`
548 - ``changeset.backout`` for :hg:`backout`
549 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
549 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
550 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
550 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
551 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
551 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
552 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
552 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
553 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
553 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
554 - ``changeset.gpg.sign`` for :hg:`sign`
554 - ``changeset.gpg.sign`` for :hg:`sign`
555 - ``changeset.graft`` for :hg:`graft`
555 - ``changeset.graft`` for :hg:`graft`
556 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
556 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
557 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
557 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
558 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
558 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
559 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
559 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
560 - ``changeset.import.bypass`` for :hg:`import --bypass`
560 - ``changeset.import.bypass`` for :hg:`import --bypass`
561 - ``changeset.import.normal.merge`` for :hg:`import` on merges
561 - ``changeset.import.normal.merge`` for :hg:`import` on merges
562 - ``changeset.import.normal.normal`` for :hg:`import` on other
562 - ``changeset.import.normal.normal`` for :hg:`import` on other
563 - ``changeset.mq.qnew`` for :hg:`qnew`
563 - ``changeset.mq.qnew`` for :hg:`qnew`
564 - ``changeset.mq.qfold`` for :hg:`qfold`
564 - ``changeset.mq.qfold`` for :hg:`qfold`
565 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
565 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
566 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
566 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
567 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
567 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
568 - ``changeset.rebase.normal`` for :hg:`rebase` on other
568 - ``changeset.rebase.normal`` for :hg:`rebase` on other
569 - ``changeset.shelve.shelve`` for :hg:`shelve`
569 - ``changeset.shelve.shelve`` for :hg:`shelve`
570 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
570 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
571 - ``changeset.tag.remove`` for :hg:`tag --remove`
571 - ``changeset.tag.remove`` for :hg:`tag --remove`
572 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
572 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
573 - ``changeset.transplant.normal`` for :hg:`transplant` on other
573 - ``changeset.transplant.normal`` for :hg:`transplant` on other
574
574
575 These dot-separated lists of names are treated as hierarchical ones.
575 These dot-separated lists of names are treated as hierarchical ones.
576 For example, ``changeset.tag.remove`` customizes the commit message
576 For example, ``changeset.tag.remove`` customizes the commit message
577 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
577 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
578 commit message for :hg:`tag` regardless of ``--remove`` option.
578 commit message for :hg:`tag` regardless of ``--remove`` option.
579
579
580 When the external editor is invoked for a commit, the corresponding
580 When the external editor is invoked for a commit, the corresponding
581 dot-separated list of names without the ``changeset.`` prefix
581 dot-separated list of names without the ``changeset.`` prefix
582 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
582 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
583 variable.
583 variable.
584
584
585 In this section, items other than ``changeset`` can be referred from
585 In this section, items other than ``changeset`` can be referred from
586 others. For example, the configuration to list committed files up
586 others. For example, the configuration to list committed files up
587 below can be referred as ``{listupfiles}``::
587 below can be referred as ``{listupfiles}``::
588
588
589 [committemplate]
589 [committemplate]
590 listupfiles = {file_adds %
590 listupfiles = {file_adds %
591 "HG: added {file}\n" }{file_mods %
591 "HG: added {file}\n" }{file_mods %
592 "HG: changed {file}\n" }{file_dels %
592 "HG: changed {file}\n" }{file_dels %
593 "HG: removed {file}\n" }{if(files, "",
593 "HG: removed {file}\n" }{if(files, "",
594 "HG: no files changed\n")}
594 "HG: no files changed\n")}
595
595
596 ``decode/encode``
596 ``decode/encode``
597 -----------------
597 -----------------
598
598
599 Filters for transforming files on checkout/checkin. This would
599 Filters for transforming files on checkout/checkin. This would
600 typically be used for newline processing or other
600 typically be used for newline processing or other
601 localization/canonicalization of files.
601 localization/canonicalization of files.
602
602
603 Filters consist of a filter pattern followed by a filter command.
603 Filters consist of a filter pattern followed by a filter command.
604 Filter patterns are globs by default, rooted at the repository root.
604 Filter patterns are globs by default, rooted at the repository root.
605 For example, to match any file ending in ``.txt`` in the root
605 For example, to match any file ending in ``.txt`` in the root
606 directory only, use the pattern ``*.txt``. To match any file ending
606 directory only, use the pattern ``*.txt``. To match any file ending
607 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
607 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
608 For each file only the first matching filter applies.
608 For each file only the first matching filter applies.
609
609
610 The filter command can start with a specifier, either ``pipe:`` or
610 The filter command can start with a specifier, either ``pipe:`` or
611 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
611 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
612
612
613 A ``pipe:`` command must accept data on stdin and return the transformed
613 A ``pipe:`` command must accept data on stdin and return the transformed
614 data on stdout.
614 data on stdout.
615
615
616 Pipe example::
616 Pipe example::
617
617
618 [encode]
618 [encode]
619 # uncompress gzip files on checkin to improve delta compression
619 # uncompress gzip files on checkin to improve delta compression
620 # note: not necessarily a good idea, just an example
620 # note: not necessarily a good idea, just an example
621 *.gz = pipe: gunzip
621 *.gz = pipe: gunzip
622
622
623 [decode]
623 [decode]
624 # recompress gzip files when writing them to the working dir (we
624 # recompress gzip files when writing them to the working dir (we
625 # can safely omit "pipe:", because it's the default)
625 # can safely omit "pipe:", because it's the default)
626 *.gz = gzip
626 *.gz = gzip
627
627
628 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
628 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
629 with the name of a temporary file that contains the data to be
629 with the name of a temporary file that contains the data to be
630 filtered by the command. The string ``OUTFILE`` is replaced with the name
630 filtered by the command. The string ``OUTFILE`` is replaced with the name
631 of an empty temporary file, where the filtered data must be written by
631 of an empty temporary file, where the filtered data must be written by
632 the command.
632 the command.
633
633
634 .. container:: windows
634 .. container:: windows
635
635
636 .. note::
636 .. note::
637
637
638 The tempfile mechanism is recommended for Windows systems,
638 The tempfile mechanism is recommended for Windows systems,
639 where the standard shell I/O redirection operators often have
639 where the standard shell I/O redirection operators often have
640 strange effects and may corrupt the contents of your files.
640 strange effects and may corrupt the contents of your files.
641
641
642 This filter mechanism is used internally by the ``eol`` extension to
642 This filter mechanism is used internally by the ``eol`` extension to
643 translate line ending characters between Windows (CRLF) and Unix (LF)
643 translate line ending characters between Windows (CRLF) and Unix (LF)
644 format. We suggest you use the ``eol`` extension for convenience.
644 format. We suggest you use the ``eol`` extension for convenience.
645
645
646
646
647 ``defaults``
647 ``defaults``
648 ------------
648 ------------
649
649
650 (defaults are deprecated. Don't use them. Use aliases instead.)
650 (defaults are deprecated. Don't use them. Use aliases instead.)
651
651
652 Use the ``[defaults]`` section to define command defaults, i.e. the
652 Use the ``[defaults]`` section to define command defaults, i.e. the
653 default options/arguments to pass to the specified commands.
653 default options/arguments to pass to the specified commands.
654
654
655 The following example makes :hg:`log` run in verbose mode, and
655 The following example makes :hg:`log` run in verbose mode, and
656 :hg:`status` show only the modified files, by default::
656 :hg:`status` show only the modified files, by default::
657
657
658 [defaults]
658 [defaults]
659 log = -v
659 log = -v
660 status = -m
660 status = -m
661
661
662 The actual commands, instead of their aliases, must be used when
662 The actual commands, instead of their aliases, must be used when
663 defining command defaults. The command defaults will also be applied
663 defining command defaults. The command defaults will also be applied
664 to the aliases of the commands defined.
664 to the aliases of the commands defined.
665
665
666
666
667 ``diff``
667 ``diff``
668 --------
668 --------
669
669
670 Settings used when displaying diffs. Everything except for ``unified``
670 Settings used when displaying diffs. Everything except for ``unified``
671 is a Boolean and defaults to False. See :hg:`help config.annotate`
671 is a Boolean and defaults to False. See :hg:`help config.annotate`
672 for related options for the annotate command.
672 for related options for the annotate command.
673
673
674 ``git``
674 ``git``
675 Use git extended diff format.
675 Use git extended diff format.
676
676
677 ``nobinary``
677 ``nobinary``
678 Omit git binary patches.
678 Omit git binary patches.
679
679
680 ``nodates``
680 ``nodates``
681 Don't include dates in diff headers.
681 Don't include dates in diff headers.
682
682
683 ``noprefix``
683 ``noprefix``
684 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
684 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
685
685
686 ``showfunc``
686 ``showfunc``
687 Show which function each change is in.
687 Show which function each change is in.
688
688
689 ``ignorews``
689 ``ignorews``
690 Ignore white space when comparing lines.
690 Ignore white space when comparing lines.
691
691
692 ``ignorewsamount``
692 ``ignorewsamount``
693 Ignore changes in the amount of white space.
693 Ignore changes in the amount of white space.
694
694
695 ``ignoreblanklines``
695 ``ignoreblanklines``
696 Ignore changes whose lines are all blank.
696 Ignore changes whose lines are all blank.
697
697
698 ``unified``
698 ``unified``
699 Number of lines of context to show.
699 Number of lines of context to show.
700
700
701 ``email``
701 ``email``
702 ---------
702 ---------
703
703
704 Settings for extensions that send email messages.
704 Settings for extensions that send email messages.
705
705
706 ``from``
706 ``from``
707 Optional. Email address to use in "From" header and SMTP envelope
707 Optional. Email address to use in "From" header and SMTP envelope
708 of outgoing messages.
708 of outgoing messages.
709
709
710 ``to``
710 ``to``
711 Optional. Comma-separated list of recipients' email addresses.
711 Optional. Comma-separated list of recipients' email addresses.
712
712
713 ``cc``
713 ``cc``
714 Optional. Comma-separated list of carbon copy recipients'
714 Optional. Comma-separated list of carbon copy recipients'
715 email addresses.
715 email addresses.
716
716
717 ``bcc``
717 ``bcc``
718 Optional. Comma-separated list of blind carbon copy recipients'
718 Optional. Comma-separated list of blind carbon copy recipients'
719 email addresses.
719 email addresses.
720
720
721 ``method``
721 ``method``
722 Optional. Method to use to send email messages. If value is ``smtp``
722 Optional. Method to use to send email messages. If value is ``smtp``
723 (default), use SMTP (see the ``[smtp]`` section for configuration).
723 (default), use SMTP (see the ``[smtp]`` section for configuration).
724 Otherwise, use as name of program to run that acts like sendmail
724 Otherwise, use as name of program to run that acts like sendmail
725 (takes ``-f`` option for sender, list of recipients on command line,
725 (takes ``-f`` option for sender, list of recipients on command line,
726 message on stdin). Normally, setting this to ``sendmail`` or
726 message on stdin). Normally, setting this to ``sendmail`` or
727 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
727 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
728
728
729 ``charsets``
729 ``charsets``
730 Optional. Comma-separated list of character sets considered
730 Optional. Comma-separated list of character sets considered
731 convenient for recipients. Addresses, headers, and parts not
731 convenient for recipients. Addresses, headers, and parts not
732 containing patches of outgoing messages will be encoded in the
732 containing patches of outgoing messages will be encoded in the
733 first character set to which conversion from local encoding
733 first character set to which conversion from local encoding
734 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
734 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
735 conversion fails, the text in question is sent as is.
735 conversion fails, the text in question is sent as is.
736 (default: '')
736 (default: '')
737
737
738 Order of outgoing email character sets:
738 Order of outgoing email character sets:
739
739
740 1. ``us-ascii``: always first, regardless of settings
740 1. ``us-ascii``: always first, regardless of settings
741 2. ``email.charsets``: in order given by user
741 2. ``email.charsets``: in order given by user
742 3. ``ui.fallbackencoding``: if not in email.charsets
742 3. ``ui.fallbackencoding``: if not in email.charsets
743 4. ``$HGENCODING``: if not in email.charsets
743 4. ``$HGENCODING``: if not in email.charsets
744 5. ``utf-8``: always last, regardless of settings
744 5. ``utf-8``: always last, regardless of settings
745
745
746 Email example::
746 Email example::
747
747
748 [email]
748 [email]
749 from = Joseph User <joe.user@example.com>
749 from = Joseph User <joe.user@example.com>
750 method = /usr/sbin/sendmail
750 method = /usr/sbin/sendmail
751 # charsets for western Europeans
751 # charsets for western Europeans
752 # us-ascii, utf-8 omitted, as they are tried first and last
752 # us-ascii, utf-8 omitted, as they are tried first and last
753 charsets = iso-8859-1, iso-8859-15, windows-1252
753 charsets = iso-8859-1, iso-8859-15, windows-1252
754
754
755
755
756 ``extensions``
756 ``extensions``
757 --------------
757 --------------
758
758
759 Mercurial has an extension mechanism for adding new features. To
759 Mercurial has an extension mechanism for adding new features. To
760 enable an extension, create an entry for it in this section.
760 enable an extension, create an entry for it in this section.
761
761
762 If you know that the extension is already in Python's search path,
762 If you know that the extension is already in Python's search path,
763 you can give the name of the module, followed by ``=``, with nothing
763 you can give the name of the module, followed by ``=``, with nothing
764 after the ``=``.
764 after the ``=``.
765
765
766 Otherwise, give a name that you choose, followed by ``=``, followed by
766 Otherwise, give a name that you choose, followed by ``=``, followed by
767 the path to the ``.py`` file (including the file name extension) that
767 the path to the ``.py`` file (including the file name extension) that
768 defines the extension.
768 defines the extension.
769
769
770 To explicitly disable an extension that is enabled in an hgrc of
770 To explicitly disable an extension that is enabled in an hgrc of
771 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
771 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
772 or ``foo = !`` when path is not supplied.
772 or ``foo = !`` when path is not supplied.
773
773
774 Example for ``~/.hgrc``::
774 Example for ``~/.hgrc``::
775
775
776 [extensions]
776 [extensions]
777 # (the churn extension will get loaded from Mercurial's path)
777 # (the churn extension will get loaded from Mercurial's path)
778 churn =
778 churn =
779 # (this extension will get loaded from the file specified)
779 # (this extension will get loaded from the file specified)
780 myfeature = ~/.hgext/myfeature.py
780 myfeature = ~/.hgext/myfeature.py
781
781
782
782
783 ``format``
783 ``format``
784 ----------
784 ----------
785
785
786 ``usegeneraldelta``
786 ``usegeneraldelta``
787 Enable or disable the "generaldelta" repository format which improves
787 Enable or disable the "generaldelta" repository format which improves
788 repository compression by allowing "revlog" to store delta against arbitrary
788 repository compression by allowing "revlog" to store delta against arbitrary
789 revision instead of the previous stored one. This provides significant
789 revision instead of the previous stored one. This provides significant
790 improvement for repositories with branches.
790 improvement for repositories with branches.
791
791
792 Repositories with this on-disk format require Mercurial version 1.9.
792 Repositories with this on-disk format require Mercurial version 1.9.
793
793
794 Enabled by default.
794 Enabled by default.
795
795
796 ``dotencode``
796 ``dotencode``
797 Enable or disable the "dotencode" repository format which enhances
797 Enable or disable the "dotencode" repository format which enhances
798 the "fncache" repository format (which has to be enabled to use
798 the "fncache" repository format (which has to be enabled to use
799 dotencode) to avoid issues with filenames starting with ._ on
799 dotencode) to avoid issues with filenames starting with ._ on
800 Mac OS X and spaces on Windows.
800 Mac OS X and spaces on Windows.
801
801
802 Repositories with this on-disk format require Mercurial version 1.7.
802 Repositories with this on-disk format require Mercurial version 1.7.
803
803
804 Enabled by default.
804 Enabled by default.
805
805
806 ``usefncache``
806 ``usefncache``
807 Enable or disable the "fncache" repository format which enhances
807 Enable or disable the "fncache" repository format which enhances
808 the "store" repository format (which has to be enabled to use
808 the "store" repository format (which has to be enabled to use
809 fncache) to allow longer filenames and avoids using Windows
809 fncache) to allow longer filenames and avoids using Windows
810 reserved names, e.g. "nul".
810 reserved names, e.g. "nul".
811
811
812 Repositories with this on-disk format require Mercurial version 1.1.
812 Repositories with this on-disk format require Mercurial version 1.1.
813
813
814 Enabled by default.
814 Enabled by default.
815
815
816 ``usestore``
816 ``usestore``
817 Enable or disable the "store" repository format which improves
817 Enable or disable the "store" repository format which improves
818 compatibility with systems that fold case or otherwise mangle
818 compatibility with systems that fold case or otherwise mangle
819 filenames. Disabling this option will allow you to store longer filenames
819 filenames. Disabling this option will allow you to store longer filenames
820 in some situations at the expense of compatibility.
820 in some situations at the expense of compatibility.
821
821
822 Repositories with this on-disk format require Mercurial version 0.9.4.
822 Repositories with this on-disk format require Mercurial version 0.9.4.
823
823
824 Enabled by default.
824 Enabled by default.
825
825
826 ``graph``
826 ``graph``
827 ---------
827 ---------
828
828
829 Web graph view configuration. This section let you change graph
829 Web graph view configuration. This section let you change graph
830 elements display properties by branches, for instance to make the
830 elements display properties by branches, for instance to make the
831 ``default`` branch stand out.
831 ``default`` branch stand out.
832
832
833 Each line has the following format::
833 Each line has the following format::
834
834
835 <branch>.<argument> = <value>
835 <branch>.<argument> = <value>
836
836
837 where ``<branch>`` is the name of the branch being
837 where ``<branch>`` is the name of the branch being
838 customized. Example::
838 customized. Example::
839
839
840 [graph]
840 [graph]
841 # 2px width
841 # 2px width
842 default.width = 2
842 default.width = 2
843 # red color
843 # red color
844 default.color = FF0000
844 default.color = FF0000
845
845
846 Supported arguments:
846 Supported arguments:
847
847
848 ``width``
848 ``width``
849 Set branch edges width in pixels.
849 Set branch edges width in pixels.
850
850
851 ``color``
851 ``color``
852 Set branch edges color in hexadecimal RGB notation.
852 Set branch edges color in hexadecimal RGB notation.
853
853
854 ``hooks``
854 ``hooks``
855 ---------
855 ---------
856
856
857 Commands or Python functions that get automatically executed by
857 Commands or Python functions that get automatically executed by
858 various actions such as starting or finishing a commit. Multiple
858 various actions such as starting or finishing a commit. Multiple
859 hooks can be run for the same action by appending a suffix to the
859 hooks can be run for the same action by appending a suffix to the
860 action. Overriding a site-wide hook can be done by changing its
860 action. Overriding a site-wide hook can be done by changing its
861 value or setting it to an empty string. Hooks can be prioritized
861 value or setting it to an empty string. Hooks can be prioritized
862 by adding a prefix of ``priority.`` to the hook name on a new line
862 by adding a prefix of ``priority.`` to the hook name on a new line
863 and setting the priority. The default priority is 0.
863 and setting the priority. The default priority is 0.
864
864
865 Example ``.hg/hgrc``::
865 Example ``.hg/hgrc``::
866
866
867 [hooks]
867 [hooks]
868 # update working directory after adding changesets
868 # update working directory after adding changesets
869 changegroup.update = hg update
869 changegroup.update = hg update
870 # do not use the site-wide hook
870 # do not use the site-wide hook
871 incoming =
871 incoming =
872 incoming.email = /my/email/hook
872 incoming.email = /my/email/hook
873 incoming.autobuild = /my/build/hook
873 incoming.autobuild = /my/build/hook
874 # force autobuild hook to run before other incoming hooks
874 # force autobuild hook to run before other incoming hooks
875 priority.incoming.autobuild = 1
875 priority.incoming.autobuild = 1
876
876
877 Most hooks are run with environment variables set that give useful
877 Most hooks are run with environment variables set that give useful
878 additional information. For each hook below, the environment variables
878 additional information. For each hook below, the environment variables
879 it is passed are listed with names in the form ``$HG_foo``. The
879 it is passed are listed with names in the form ``$HG_foo``. The
880 ``$HG_HOOKTYPE`` and ``$HG_HOOKNAME`` variables are set for all hooks.
880 ``$HG_HOOKTYPE`` and ``$HG_HOOKNAME`` variables are set for all hooks.
881 They contain the type of hook which triggered the run and the full name
881 They contain the type of hook which triggered the run and the full name
882 of the hook in the config, respectively. In the example above, this will
882 of the hook in the config, respectively. In the example above, this will
883 be ``$HG_HOOKTYPE=incoming`` and ``$HG_HOOKNAME=incoming.email``.
883 be ``$HG_HOOKTYPE=incoming`` and ``$HG_HOOKNAME=incoming.email``.
884
884
885 ``changegroup``
885 ``changegroup``
886 Run after a changegroup has been added via push, pull or unbundle. The ID of
886 Run after a changegroup has been added via push, pull or unbundle. The ID of
887 the first new changeset is in ``$HG_NODE`` and last is in ``$HG_NODE_LAST``.
887 the first new changeset is in ``$HG_NODE`` and last is in ``$HG_NODE_LAST``.
888 The URL from which changes came is in ``$HG_URL``.
888 The URL from which changes came is in ``$HG_URL``.
889
889
890 ``commit``
890 ``commit``
891 Run after a changeset has been created in the local repository. The ID
891 Run after a changeset has been created in the local repository. The ID
892 of the newly created changeset is in ``$HG_NODE``. Parent changeset
892 of the newly created changeset is in ``$HG_NODE``. Parent changeset
893 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
893 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
894
894
895 ``incoming``
895 ``incoming``
896 Run after a changeset has been pulled, pushed, or unbundled into
896 Run after a changeset has been pulled, pushed, or unbundled into
897 the local repository. The ID of the newly arrived changeset is in
897 the local repository. The ID of the newly arrived changeset is in
898 ``$HG_NODE``. The URL that was source of the changes is in ``$HG_URL``.
898 ``$HG_NODE``. The URL that was source of the changes is in ``$HG_URL``.
899
899
900 ``outgoing``
900 ``outgoing``
901 Run after sending changes from the local repository to another. The ID of
901 Run after sending changes from the local repository to another. The ID of
902 first changeset sent is in ``$HG_NODE``. The source of operation is in
902 first changeset sent is in ``$HG_NODE``. The source of operation is in
903 ``$HG_SOURCE``. Also see :hg:`help config.hooks.preoutgoing`.
903 ``$HG_SOURCE``. Also see :hg:`help config.hooks.preoutgoing`.
904
904
905 ``post-<command>``
905 ``post-<command>``
906 Run after successful invocations of the associated command. The
906 Run after successful invocations of the associated command. The
907 contents of the command line are passed as ``$HG_ARGS`` and the result
907 contents of the command line are passed as ``$HG_ARGS`` and the result
908 code in ``$HG_RESULT``. Parsed command line arguments are passed as
908 code in ``$HG_RESULT``. Parsed command line arguments are passed as
909 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
909 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
910 the python data internally passed to <command>. ``$HG_OPTS`` is a
910 the python data internally passed to <command>. ``$HG_OPTS`` is a
911 dictionary of options (with unspecified options set to their defaults).
911 dictionary of options (with unspecified options set to their defaults).
912 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
912 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
913
913
914 ``fail-<command>``
914 ``fail-<command>``
915 Run after a failed invocation of an associated command. The contents
915 Run after a failed invocation of an associated command. The contents
916 of the command line are passed as ``$HG_ARGS``. Parsed command line
916 of the command line are passed as ``$HG_ARGS``. Parsed command line
917 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
917 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
918 string representations of the python data internally passed to
918 string representations of the python data internally passed to
919 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
919 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
920 options set to their defaults). ``$HG_PATS`` is a list of arguments.
920 options set to their defaults). ``$HG_PATS`` is a list of arguments.
921 Hook failure is ignored.
921 Hook failure is ignored.
922
922
923 ``pre-<command>``
923 ``pre-<command>``
924 Run before executing the associated command. The contents of the
924 Run before executing the associated command. The contents of the
925 command line are passed as ``$HG_ARGS``. Parsed command line arguments
925 command line are passed as ``$HG_ARGS``. Parsed command line arguments
926 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
926 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
927 representations of the data internally passed to <command>. ``$HG_OPTS``
927 representations of the data internally passed to <command>. ``$HG_OPTS``
928 is a dictionary of options (with unspecified options set to their
928 is a dictionary of options (with unspecified options set to their
929 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
929 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
930 failure, the command doesn't execute and Mercurial returns the failure
930 failure, the command doesn't execute and Mercurial returns the failure
931 code.
931 code.
932
932
933 ``prechangegroup``
933 ``prechangegroup``
934 Run before a changegroup is added via push, pull or unbundle. Exit
934 Run before a changegroup is added via push, pull or unbundle. Exit
935 status 0 allows the changegroup to proceed. A non-zero status will
935 status 0 allows the changegroup to proceed. A non-zero status will
936 cause the push, pull or unbundle to fail. The URL from which changes
936 cause the push, pull or unbundle to fail. The URL from which changes
937 will come is in ``$HG_URL``.
937 will come is in ``$HG_URL``.
938
938
939 ``precommit``
939 ``precommit``
940 Run before starting a local commit. Exit status 0 allows the
940 Run before starting a local commit. Exit status 0 allows the
941 commit to proceed. A non-zero status will cause the commit to fail.
941 commit to proceed. A non-zero status will cause the commit to fail.
942 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
942 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
943
943
944 ``prelistkeys``
944 ``prelistkeys``
945 Run before listing pushkeys (like bookmarks) in the
945 Run before listing pushkeys (like bookmarks) in the
946 repository. A non-zero status will cause failure. The key namespace is
946 repository. A non-zero status will cause failure. The key namespace is
947 in ``$HG_NAMESPACE``.
947 in ``$HG_NAMESPACE``.
948
948
949 ``preoutgoing``
949 ``preoutgoing``
950 Run before collecting changes to send from the local repository to
950 Run before collecting changes to send from the local repository to
951 another. A non-zero status will cause failure. This lets you prevent
951 another. A non-zero status will cause failure. This lets you prevent
952 pull over HTTP or SSH. It can also prevent propagating commits (via
952 pull over HTTP or SSH. It can also prevent propagating commits (via
953 local pull, push (outbound) or bundle commands), but not completely,
953 local pull, push (outbound) or bundle commands), but not completely,
954 since you can just copy files instead. The source of operation is in
954 since you can just copy files instead. The source of operation is in
955 ``$HG_SOURCE``. If "serve", the operation is happening on behalf of a remote
955 ``$HG_SOURCE``. If "serve", the operation is happening on behalf of a remote
956 SSH or HTTP repository. If "push", "pull" or "bundle", the operation
956 SSH or HTTP repository. If "push", "pull" or "bundle", the operation
957 is happening on behalf of a repository on same system.
957 is happening on behalf of a repository on same system.
958
958
959 ``prepushkey``
959 ``prepushkey``
960 Run before a pushkey (like a bookmark) is added to the
960 Run before a pushkey (like a bookmark) is added to the
961 repository. A non-zero status will cause the key to be rejected. The
961 repository. A non-zero status will cause the key to be rejected. The
962 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
962 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
963 the old value (if any) is in ``$HG_OLD``, and the new value is in
963 the old value (if any) is in ``$HG_OLD``, and the new value is in
964 ``$HG_NEW``.
964 ``$HG_NEW``.
965
965
966 ``pretag``
966 ``pretag``
967 Run before creating a tag. Exit status 0 allows the tag to be
967 Run before creating a tag. Exit status 0 allows the tag to be
968 created. A non-zero status will cause the tag to fail. The ID of the
968 created. A non-zero status will cause the tag to fail. The ID of the
969 changeset to tag is in ``$HG_NODE``. The name of tag is in ``$HG_TAG``. The
969 changeset to tag is in ``$HG_NODE``. The name of tag is in ``$HG_TAG``. The
970 tag is local if ``$HG_LOCAL=1``, or in the repository if ``$HG_LOCAL=0``.
970 tag is local if ``$HG_LOCAL=1``, or in the repository if ``$HG_LOCAL=0``.
971
971
972 ``pretxnopen``
972 ``pretxnopen``
973 Run before any new repository transaction is open. The reason for the
973 Run before any new repository transaction is open. The reason for the
974 transaction will be in ``$HG_TXNNAME``, and a unique identifier for the
974 transaction will be in ``$HG_TXNNAME``, and a unique identifier for the
975 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
975 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
976 transaction from being opened.
976 transaction from being opened.
977
977
978 ``pretxnclose``
978 ``pretxnclose``
979 Run right before the transaction is actually finalized. Any repository change
979 Run right before the transaction is actually finalized. Any repository change
980 will be visible to the hook program. This lets you validate the transaction
980 will be visible to the hook program. This lets you validate the transaction
981 content or change it. Exit status 0 allows the commit to proceed. A non-zero
981 content or change it. Exit status 0 allows the commit to proceed. A non-zero
982 status will cause the transaction to be rolled back. The reason for the
982 status will cause the transaction to be rolled back. The reason for the
983 transaction opening will be in ``$HG_TXNNAME``, and a unique identifier for
983 transaction opening will be in ``$HG_TXNNAME``, and a unique identifier for
984 the transaction will be in ``HG_TXNID``. The rest of the available data will
984 the transaction will be in ``HG_TXNID``. The rest of the available data will
985 vary according the transaction type. New changesets will add ``$HG_NODE``
985 vary according the transaction type. New changesets will add ``$HG_NODE``
986 (the ID of the first added changeset), ``$HG_NODE_LAST`` (the ID of the last
986 (the ID of the first added changeset), ``$HG_NODE_LAST`` (the ID of the last
987 added changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables. Bookmark and
987 added changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables. Bookmark and
988 phase changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``
988 phase changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``
989 respectively, etc.
989 respectively, etc.
990
990
991 ``pretxnclose-bookmark``
991 ``pretxnclose-bookmark``
992 Run right before a bookmark change is actually finalized. Any repository
992 Run right before a bookmark change is actually finalized. Any repository
993 change will be visible to the hook program. This lets you validate the
993 change will be visible to the hook program. This lets you validate the
994 transaction content or change it. Exit status 0 allows the commit to
994 transaction content or change it. Exit status 0 allows the commit to
995 proceed. A non-zero status will cause the transaction to be rolled back.
995 proceed. A non-zero status will cause the transaction to be rolled back.
996 The name of the bookmark will be available in ``$HG_BOOKMARK``, the new
996 The name of the bookmark will be available in ``$HG_BOOKMARK``, the new
997 bookmark location will be available in ``$HG_NODE`` while the previous
997 bookmark location will be available in ``$HG_NODE`` while the previous
998 location will be available in ``$HG_OLDNODE``. In case of a bookmark
998 location will be available in ``$HG_OLDNODE``. In case of a bookmark
999 creation ``$HG_OLDNODE`` will be empty. In case of deletion ``$HG_NODE``
999 creation ``$HG_OLDNODE`` will be empty. In case of deletion ``$HG_NODE``
1000 will be empty.
1000 will be empty.
1001 In addition, the reason for the transaction opening will be in
1001 In addition, the reason for the transaction opening will be in
1002 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1002 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1003 ``HG_TXNID``.
1003 ``HG_TXNID``.
1004
1004
1005 ``pretxnclose-phase``
1005 ``pretxnclose-phase``
1006 Run right before a phase change is actually finalized. Any repository change
1006 Run right before a phase change is actually finalized. Any repository change
1007 will be visible to the hook program. This lets you validate the transaction
1007 will be visible to the hook program. This lets you validate the transaction
1008 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1008 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1009 status will cause the transaction to be rolled back. The hook is called
1009 status will cause the transaction to be rolled back. The hook is called
1010 multiple times, once for each revision affected by a phase change.
1010 multiple times, once for each revision affected by a phase change.
1011 The affected node is available in ``$HG_NODE``, the phase in ``$HG_PHASE``
1011 The affected node is available in ``$HG_NODE``, the phase in ``$HG_PHASE``
1012 while the previous ``$HG_OLDPHASE``. In case of new node, ``$HG_OLDPHASE``
1012 while the previous ``$HG_OLDPHASE``. In case of new node, ``$HG_OLDPHASE``
1013 will be empty. In addition, the reason for the transaction opening will be in
1013 will be empty. In addition, the reason for the transaction opening will be in
1014 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1014 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1015 ``HG_TXNID``. The hook is also run for newly added revisions. In this case
1015 ``HG_TXNID``. The hook is also run for newly added revisions. In this case
1016 the ``$HG_OLDPHASE`` entry will be empty.
1016 the ``$HG_OLDPHASE`` entry will be empty.
1017
1017
1018 ``txnclose``
1018 ``txnclose``
1019 Run after any repository transaction has been committed. At this
1019 Run after any repository transaction has been committed. At this
1020 point, the transaction can no longer be rolled back. The hook will run
1020 point, the transaction can no longer be rolled back. The hook will run
1021 after the lock is released. See :hg:`help config.hooks.pretxnclose` for
1021 after the lock is released. See :hg:`help config.hooks.pretxnclose` for
1022 details about available variables.
1022 details about available variables.
1023
1023
1024 ``txnclose-bookmark``
1024 ``txnclose-bookmark``
1025 Run after any bookmark change has been committed. At this point, the
1025 Run after any bookmark change has been committed. At this point, the
1026 transaction can no longer be rolled back. The hook will run after the lock
1026 transaction can no longer be rolled back. The hook will run after the lock
1027 is released. See :hg:`help config.hooks.pretxnclose-bookmark` for details
1027 is released. See :hg:`help config.hooks.pretxnclose-bookmark` for details
1028 about available variables.
1028 about available variables.
1029
1029
1030 ``txnclose-phase``
1030 ``txnclose-phase``
1031 Run after any phase change has been committed. At this point, the
1031 Run after any phase change has been committed. At this point, the
1032 transaction can no longer be rolled back. The hook will run after the lock
1032 transaction can no longer be rolled back. The hook will run after the lock
1033 is released. See :hg:`help config.hooks.pretxnclose-phase` for details about
1033 is released. See :hg:`help config.hooks.pretxnclose-phase` for details about
1034 available variables.
1034 available variables.
1035
1035
1036 ``txnabort``
1036 ``txnabort``
1037 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
1037 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
1038 for details about available variables.
1038 for details about available variables.
1039
1039
1040 ``pretxnchangegroup``
1040 ``pretxnchangegroup``
1041 Run after a changegroup has been added via push, pull or unbundle, but before
1041 Run after a changegroup has been added via push, pull or unbundle, but before
1042 the transaction has been committed. The changegroup is visible to the hook
1042 the transaction has been committed. The changegroup is visible to the hook
1043 program. This allows validation of incoming changes before accepting them.
1043 program. This allows validation of incoming changes before accepting them.
1044 The ID of the first new changeset is in ``$HG_NODE`` and last is in
1044 The ID of the first new changeset is in ``$HG_NODE`` and last is in
1045 ``$HG_NODE_LAST``. Exit status 0 allows the transaction to commit. A non-zero
1045 ``$HG_NODE_LAST``. Exit status 0 allows the transaction to commit. A non-zero
1046 status will cause the transaction to be rolled back, and the push, pull or
1046 status will cause the transaction to be rolled back, and the push, pull or
1047 unbundle will fail. The URL that was the source of changes is in ``$HG_URL``.
1047 unbundle will fail. The URL that was the source of changes is in ``$HG_URL``.
1048
1048
1049 ``pretxncommit``
1049 ``pretxncommit``
1050 Run after a changeset has been created, but before the transaction is
1050 Run after a changeset has been created, but before the transaction is
1051 committed. The changeset is visible to the hook program. This allows
1051 committed. The changeset is visible to the hook program. This allows
1052 validation of the commit message and changes. Exit status 0 allows the
1052 validation of the commit message and changes. Exit status 0 allows the
1053 commit to proceed. A non-zero status will cause the transaction to
1053 commit to proceed. A non-zero status will cause the transaction to
1054 be rolled back. The ID of the new changeset is in ``$HG_NODE``. The parent
1054 be rolled back. The ID of the new changeset is in ``$HG_NODE``. The parent
1055 changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1055 changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1056
1056
1057 ``preupdate``
1057 ``preupdate``
1058 Run before updating the working directory. Exit status 0 allows
1058 Run before updating the working directory. Exit status 0 allows
1059 the update to proceed. A non-zero status will prevent the update.
1059 the update to proceed. A non-zero status will prevent the update.
1060 The changeset ID of first new parent is in ``$HG_PARENT1``. If updating to a
1060 The changeset ID of first new parent is in ``$HG_PARENT1``. If updating to a
1061 merge, the ID of second new parent is in ``$HG_PARENT2``.
1061 merge, the ID of second new parent is in ``$HG_PARENT2``.
1062
1062
1063 ``listkeys``
1063 ``listkeys``
1064 Run after listing pushkeys (like bookmarks) in the repository. The
1064 Run after listing pushkeys (like bookmarks) in the repository. The
1065 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
1065 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
1066 dictionary containing the keys and values.
1066 dictionary containing the keys and values.
1067
1067
1068 ``pushkey``
1068 ``pushkey``
1069 Run after a pushkey (like a bookmark) is added to the
1069 Run after a pushkey (like a bookmark) is added to the
1070 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
1070 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
1071 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
1071 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
1072 value is in ``$HG_NEW``.
1072 value is in ``$HG_NEW``.
1073
1073
1074 ``tag``
1074 ``tag``
1075 Run after a tag is created. The ID of the tagged changeset is in ``$HG_NODE``.
1075 Run after a tag is created. The ID of the tagged changeset is in ``$HG_NODE``.
1076 The name of tag is in ``$HG_TAG``. The tag is local if ``$HG_LOCAL=1``, or in
1076 The name of tag is in ``$HG_TAG``. The tag is local if ``$HG_LOCAL=1``, or in
1077 the repository if ``$HG_LOCAL=0``.
1077 the repository if ``$HG_LOCAL=0``.
1078
1078
1079 ``update``
1079 ``update``
1080 Run after updating the working directory. The changeset ID of first
1080 Run after updating the working directory. The changeset ID of first
1081 new parent is in ``$HG_PARENT1``. If updating to a merge, the ID of second new
1081 new parent is in ``$HG_PARENT1``. If updating to a merge, the ID of second new
1082 parent is in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
1082 parent is in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
1083 update failed (e.g. because conflicts were not resolved), ``$HG_ERROR=1``.
1083 update failed (e.g. because conflicts were not resolved), ``$HG_ERROR=1``.
1084
1084
1085 .. note::
1085 .. note::
1086
1086
1087 It is generally better to use standard hooks rather than the
1087 It is generally better to use standard hooks rather than the
1088 generic pre- and post- command hooks, as they are guaranteed to be
1088 generic pre- and post- command hooks, as they are guaranteed to be
1089 called in the appropriate contexts for influencing transactions.
1089 called in the appropriate contexts for influencing transactions.
1090 Also, hooks like "commit" will be called in all contexts that
1090 Also, hooks like "commit" will be called in all contexts that
1091 generate a commit (e.g. tag) and not just the commit command.
1091 generate a commit (e.g. tag) and not just the commit command.
1092
1092
1093 .. note::
1093 .. note::
1094
1094
1095 Environment variables with empty values may not be passed to
1095 Environment variables with empty values may not be passed to
1096 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
1096 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
1097 will have an empty value under Unix-like platforms for non-merge
1097 will have an empty value under Unix-like platforms for non-merge
1098 changesets, while it will not be available at all under Windows.
1098 changesets, while it will not be available at all under Windows.
1099
1099
1100 The syntax for Python hooks is as follows::
1100 The syntax for Python hooks is as follows::
1101
1101
1102 hookname = python:modulename.submodule.callable
1102 hookname = python:modulename.submodule.callable
1103 hookname = python:/path/to/python/module.py:callable
1103 hookname = python:/path/to/python/module.py:callable
1104
1104
1105 Python hooks are run within the Mercurial process. Each hook is
1105 Python hooks are run within the Mercurial process. Each hook is
1106 called with at least three keyword arguments: a ui object (keyword
1106 called with at least three keyword arguments: a ui object (keyword
1107 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
1107 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
1108 keyword that tells what kind of hook is used. Arguments listed as
1108 keyword that tells what kind of hook is used. Arguments listed as
1109 environment variables above are passed as keyword arguments, with no
1109 environment variables above are passed as keyword arguments, with no
1110 ``HG_`` prefix, and names in lower case.
1110 ``HG_`` prefix, and names in lower case.
1111
1111
1112 If a Python hook returns a "true" value or raises an exception, this
1112 If a Python hook returns a "true" value or raises an exception, this
1113 is treated as a failure.
1113 is treated as a failure.
1114
1114
1115
1115
1116 ``hostfingerprints``
1116 ``hostfingerprints``
1117 --------------------
1117 --------------------
1118
1118
1119 (Deprecated. Use ``[hostsecurity]``'s ``fingerprints`` options instead.)
1119 (Deprecated. Use ``[hostsecurity]``'s ``fingerprints`` options instead.)
1120
1120
1121 Fingerprints of the certificates of known HTTPS servers.
1121 Fingerprints of the certificates of known HTTPS servers.
1122
1122
1123 A HTTPS connection to a server with a fingerprint configured here will
1123 A HTTPS connection to a server with a fingerprint configured here will
1124 only succeed if the servers certificate matches the fingerprint.
1124 only succeed if the servers certificate matches the fingerprint.
1125 This is very similar to how ssh known hosts works.
1125 This is very similar to how ssh known hosts works.
1126
1126
1127 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
1127 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
1128 Multiple values can be specified (separated by spaces or commas). This can
1128 Multiple values can be specified (separated by spaces or commas). This can
1129 be used to define both old and new fingerprints while a host transitions
1129 be used to define both old and new fingerprints while a host transitions
1130 to a new certificate.
1130 to a new certificate.
1131
1131
1132 The CA chain and web.cacerts is not used for servers with a fingerprint.
1132 The CA chain and web.cacerts is not used for servers with a fingerprint.
1133
1133
1134 For example::
1134 For example::
1135
1135
1136 [hostfingerprints]
1136 [hostfingerprints]
1137 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1137 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1138 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1138 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1139
1139
1140 ``hostsecurity``
1140 ``hostsecurity``
1141 ----------------
1141 ----------------
1142
1142
1143 Used to specify global and per-host security settings for connecting to
1143 Used to specify global and per-host security settings for connecting to
1144 other machines.
1144 other machines.
1145
1145
1146 The following options control default behavior for all hosts.
1146 The following options control default behavior for all hosts.
1147
1147
1148 ``ciphers``
1148 ``ciphers``
1149 Defines the cryptographic ciphers to use for connections.
1149 Defines the cryptographic ciphers to use for connections.
1150
1150
1151 Value must be a valid OpenSSL Cipher List Format as documented at
1151 Value must be a valid OpenSSL Cipher List Format as documented at
1152 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-LIST-FORMAT.
1152 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-LIST-FORMAT.
1153
1153
1154 This setting is for advanced users only. Setting to incorrect values
1154 This setting is for advanced users only. Setting to incorrect values
1155 can significantly lower connection security or decrease performance.
1155 can significantly lower connection security or decrease performance.
1156 You have been warned.
1156 You have been warned.
1157
1157
1158 This option requires Python 2.7.
1158 This option requires Python 2.7.
1159
1159
1160 ``minimumprotocol``
1160 ``minimumprotocol``
1161 Defines the minimum channel encryption protocol to use.
1161 Defines the minimum channel encryption protocol to use.
1162
1162
1163 By default, the highest version of TLS supported by both client and server
1163 By default, the highest version of TLS supported by both client and server
1164 is used.
1164 is used.
1165
1165
1166 Allowed values are: ``tls1.0``, ``tls1.1``, ``tls1.2``.
1166 Allowed values are: ``tls1.0``, ``tls1.1``, ``tls1.2``.
1167
1167
1168 When running on an old Python version, only ``tls1.0`` is allowed since
1168 When running on an old Python version, only ``tls1.0`` is allowed since
1169 old versions of Python only support up to TLS 1.0.
1169 old versions of Python only support up to TLS 1.0.
1170
1170
1171 When running a Python that supports modern TLS versions, the default is
1171 When running a Python that supports modern TLS versions, the default is
1172 ``tls1.1``. ``tls1.0`` can still be used to allow TLS 1.0. However, this
1172 ``tls1.1``. ``tls1.0`` can still be used to allow TLS 1.0. However, this
1173 weakens security and should only be used as a feature of last resort if
1173 weakens security and should only be used as a feature of last resort if
1174 a server does not support TLS 1.1+.
1174 a server does not support TLS 1.1+.
1175
1175
1176 Options in the ``[hostsecurity]`` section can have the form
1176 Options in the ``[hostsecurity]`` section can have the form
1177 ``hostname``:``setting``. This allows multiple settings to be defined on a
1177 ``hostname``:``setting``. This allows multiple settings to be defined on a
1178 per-host basis.
1178 per-host basis.
1179
1179
1180 The following per-host settings can be defined.
1180 The following per-host settings can be defined.
1181
1181
1182 ``ciphers``
1182 ``ciphers``
1183 This behaves like ``ciphers`` as described above except it only applies
1183 This behaves like ``ciphers`` as described above except it only applies
1184 to the host on which it is defined.
1184 to the host on which it is defined.
1185
1185
1186 ``fingerprints``
1186 ``fingerprints``
1187 A list of hashes of the DER encoded peer/remote certificate. Values have
1187 A list of hashes of the DER encoded peer/remote certificate. Values have
1188 the form ``algorithm``:``fingerprint``. e.g.
1188 the form ``algorithm``:``fingerprint``. e.g.
1189 ``sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2``.
1189 ``sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2``.
1190 In addition, colons (``:``) can appear in the fingerprint part.
1190 In addition, colons (``:``) can appear in the fingerprint part.
1191
1191
1192 The following algorithms/prefixes are supported: ``sha1``, ``sha256``,
1192 The following algorithms/prefixes are supported: ``sha1``, ``sha256``,
1193 ``sha512``.
1193 ``sha512``.
1194
1194
1195 Use of ``sha256`` or ``sha512`` is preferred.
1195 Use of ``sha256`` or ``sha512`` is preferred.
1196
1196
1197 If a fingerprint is specified, the CA chain is not validated for this
1197 If a fingerprint is specified, the CA chain is not validated for this
1198 host and Mercurial will require the remote certificate to match one
1198 host and Mercurial will require the remote certificate to match one
1199 of the fingerprints specified. This means if the server updates its
1199 of the fingerprints specified. This means if the server updates its
1200 certificate, Mercurial will abort until a new fingerprint is defined.
1200 certificate, Mercurial will abort until a new fingerprint is defined.
1201 This can provide stronger security than traditional CA-based validation
1201 This can provide stronger security than traditional CA-based validation
1202 at the expense of convenience.
1202 at the expense of convenience.
1203
1203
1204 This option takes precedence over ``verifycertsfile``.
1204 This option takes precedence over ``verifycertsfile``.
1205
1205
1206 ``minimumprotocol``
1206 ``minimumprotocol``
1207 This behaves like ``minimumprotocol`` as described above except it
1207 This behaves like ``minimumprotocol`` as described above except it
1208 only applies to the host on which it is defined.
1208 only applies to the host on which it is defined.
1209
1209
1210 ``verifycertsfile``
1210 ``verifycertsfile``
1211 Path to file a containing a list of PEM encoded certificates used to
1211 Path to file a containing a list of PEM encoded certificates used to
1212 verify the server certificate. Environment variables and ``~user``
1212 verify the server certificate. Environment variables and ``~user``
1213 constructs are expanded in the filename.
1213 constructs are expanded in the filename.
1214
1214
1215 The server certificate or the certificate's certificate authority (CA)
1215 The server certificate or the certificate's certificate authority (CA)
1216 must match a certificate from this file or certificate verification
1216 must match a certificate from this file or certificate verification
1217 will fail and connections to the server will be refused.
1217 will fail and connections to the server will be refused.
1218
1218
1219 If defined, only certificates provided by this file will be used:
1219 If defined, only certificates provided by this file will be used:
1220 ``web.cacerts`` and any system/default certificates will not be
1220 ``web.cacerts`` and any system/default certificates will not be
1221 used.
1221 used.
1222
1222
1223 This option has no effect if the per-host ``fingerprints`` option
1223 This option has no effect if the per-host ``fingerprints`` option
1224 is set.
1224 is set.
1225
1225
1226 The format of the file is as follows::
1226 The format of the file is as follows::
1227
1227
1228 -----BEGIN CERTIFICATE-----
1228 -----BEGIN CERTIFICATE-----
1229 ... (certificate in base64 PEM encoding) ...
1229 ... (certificate in base64 PEM encoding) ...
1230 -----END CERTIFICATE-----
1230 -----END CERTIFICATE-----
1231 -----BEGIN CERTIFICATE-----
1231 -----BEGIN CERTIFICATE-----
1232 ... (certificate in base64 PEM encoding) ...
1232 ... (certificate in base64 PEM encoding) ...
1233 -----END CERTIFICATE-----
1233 -----END CERTIFICATE-----
1234
1234
1235 For example::
1235 For example::
1236
1236
1237 [hostsecurity]
1237 [hostsecurity]
1238 hg.example.com:fingerprints = sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
1238 hg.example.com:fingerprints = sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
1239 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
1239 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
1240 hg3.example.com:fingerprints = sha256:9a:b0:dc:e2:75:ad:8a:b7:84:58:e5:1f:07:32:f1:87:e6:bd:24:22:af:b7:ce:8e:9c:b4:10:cf:b9:f4:0e:d2
1240 hg3.example.com:fingerprints = sha256:9a:b0:dc:e2:75:ad:8a:b7:84:58:e5:1f:07:32:f1:87:e6:bd:24:22:af:b7:ce:8e:9c:b4:10:cf:b9:f4:0e:d2
1241 foo.example.com:verifycertsfile = /etc/ssl/trusted-ca-certs.pem
1241 foo.example.com:verifycertsfile = /etc/ssl/trusted-ca-certs.pem
1242
1242
1243 To change the default minimum protocol version to TLS 1.2 but to allow TLS 1.1
1243 To change the default minimum protocol version to TLS 1.2 but to allow TLS 1.1
1244 when connecting to ``hg.example.com``::
1244 when connecting to ``hg.example.com``::
1245
1245
1246 [hostsecurity]
1246 [hostsecurity]
1247 minimumprotocol = tls1.2
1247 minimumprotocol = tls1.2
1248 hg.example.com:minimumprotocol = tls1.1
1248 hg.example.com:minimumprotocol = tls1.1
1249
1249
1250 ``http_proxy``
1250 ``http_proxy``
1251 --------------
1251 --------------
1252
1252
1253 Used to access web-based Mercurial repositories through a HTTP
1253 Used to access web-based Mercurial repositories through a HTTP
1254 proxy.
1254 proxy.
1255
1255
1256 ``host``
1256 ``host``
1257 Host name and (optional) port of the proxy server, for example
1257 Host name and (optional) port of the proxy server, for example
1258 "myproxy:8000".
1258 "myproxy:8000".
1259
1259
1260 ``no``
1260 ``no``
1261 Optional. Comma-separated list of host names that should bypass
1261 Optional. Comma-separated list of host names that should bypass
1262 the proxy.
1262 the proxy.
1263
1263
1264 ``passwd``
1264 ``passwd``
1265 Optional. Password to authenticate with at the proxy server.
1265 Optional. Password to authenticate with at the proxy server.
1266
1266
1267 ``user``
1267 ``user``
1268 Optional. User name to authenticate with at the proxy server.
1268 Optional. User name to authenticate with at the proxy server.
1269
1269
1270 ``always``
1270 ``always``
1271 Optional. Always use the proxy, even for localhost and any entries
1271 Optional. Always use the proxy, even for localhost and any entries
1272 in ``http_proxy.no``. (default: False)
1272 in ``http_proxy.no``. (default: False)
1273
1273
1274 ``merge``
1274 ``merge``
1275 ---------
1275 ---------
1276
1276
1277 This section specifies behavior during merges and updates.
1277 This section specifies behavior during merges and updates.
1278
1278
1279 ``checkignored``
1279 ``checkignored``
1280 Controls behavior when an ignored file on disk has the same name as a tracked
1280 Controls behavior when an ignored file on disk has the same name as a tracked
1281 file in the changeset being merged or updated to, and has different
1281 file in the changeset being merged or updated to, and has different
1282 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1282 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1283 abort on such files. With ``warn``, warn on such files and back them up as
1283 abort on such files. With ``warn``, warn on such files and back them up as
1284 ``.orig``. With ``ignore``, don't print a warning and back them up as
1284 ``.orig``. With ``ignore``, don't print a warning and back them up as
1285 ``.orig``. (default: ``abort``)
1285 ``.orig``. (default: ``abort``)
1286
1286
1287 ``checkunknown``
1287 ``checkunknown``
1288 Controls behavior when an unknown file that isn't ignored has the same name
1288 Controls behavior when an unknown file that isn't ignored has the same name
1289 as a tracked file in the changeset being merged or updated to, and has
1289 as a tracked file in the changeset being merged or updated to, and has
1290 different contents. Similar to ``merge.checkignored``, except for files that
1290 different contents. Similar to ``merge.checkignored``, except for files that
1291 are not ignored. (default: ``abort``)
1291 are not ignored. (default: ``abort``)
1292
1292
1293 ``on-failure``
1293 ``on-failure``
1294 When set to ``continue`` (the default), the merge process attempts to
1294 When set to ``continue`` (the default), the merge process attempts to
1295 merge all unresolved files using the merge chosen tool, regardless of
1295 merge all unresolved files using the merge chosen tool, regardless of
1296 whether previous file merge attempts during the process succeeded or not.
1296 whether previous file merge attempts during the process succeeded or not.
1297 Setting this to ``prompt`` will prompt after any merge failure continue
1297 Setting this to ``prompt`` will prompt after any merge failure continue
1298 or halt the merge process. Setting this to ``halt`` will automatically
1298 or halt the merge process. Setting this to ``halt`` will automatically
1299 halt the merge process on any merge tool failure. The merge process
1299 halt the merge process on any merge tool failure. The merge process
1300 can be restarted by using the ``resolve`` command. When a merge is
1300 can be restarted by using the ``resolve`` command. When a merge is
1301 halted, the repository is left in a normal ``unresolved`` merge state.
1301 halted, the repository is left in a normal ``unresolved`` merge state.
1302 (default: ``continue``)
1302 (default: ``continue``)
1303
1303
1304 ``merge-patterns``
1304 ``merge-patterns``
1305 ------------------
1305 ------------------
1306
1306
1307 This section specifies merge tools to associate with particular file
1307 This section specifies merge tools to associate with particular file
1308 patterns. Tools matched here will take precedence over the default
1308 patterns. Tools matched here will take precedence over the default
1309 merge tool. Patterns are globs by default, rooted at the repository
1309 merge tool. Patterns are globs by default, rooted at the repository
1310 root.
1310 root.
1311
1311
1312 Example::
1312 Example::
1313
1313
1314 [merge-patterns]
1314 [merge-patterns]
1315 **.c = kdiff3
1315 **.c = kdiff3
1316 **.jpg = myimgmerge
1316 **.jpg = myimgmerge
1317
1317
1318 ``merge-tools``
1318 ``merge-tools``
1319 ---------------
1319 ---------------
1320
1320
1321 This section configures external merge tools to use for file-level
1321 This section configures external merge tools to use for file-level
1322 merges. This section has likely been preconfigured at install time.
1322 merges. This section has likely been preconfigured at install time.
1323 Use :hg:`config merge-tools` to check the existing configuration.
1323 Use :hg:`config merge-tools` to check the existing configuration.
1324 Also see :hg:`help merge-tools` for more details.
1324 Also see :hg:`help merge-tools` for more details.
1325
1325
1326 Example ``~/.hgrc``::
1326 Example ``~/.hgrc``::
1327
1327
1328 [merge-tools]
1328 [merge-tools]
1329 # Override stock tool location
1329 # Override stock tool location
1330 kdiff3.executable = ~/bin/kdiff3
1330 kdiff3.executable = ~/bin/kdiff3
1331 # Specify command line
1331 # Specify command line
1332 kdiff3.args = $base $local $other -o $output
1332 kdiff3.args = $base $local $other -o $output
1333 # Give higher priority
1333 # Give higher priority
1334 kdiff3.priority = 1
1334 kdiff3.priority = 1
1335
1335
1336 # Changing the priority of preconfigured tool
1336 # Changing the priority of preconfigured tool
1337 meld.priority = 0
1337 meld.priority = 0
1338
1338
1339 # Disable a preconfigured tool
1339 # Disable a preconfigured tool
1340 vimdiff.disabled = yes
1340 vimdiff.disabled = yes
1341
1341
1342 # Define new tool
1342 # Define new tool
1343 myHtmlTool.args = -m $local $other $base $output
1343 myHtmlTool.args = -m $local $other $base $output
1344 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1344 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1345 myHtmlTool.priority = 1
1345 myHtmlTool.priority = 1
1346
1346
1347 Supported arguments:
1347 Supported arguments:
1348
1348
1349 ``priority``
1349 ``priority``
1350 The priority in which to evaluate this tool.
1350 The priority in which to evaluate this tool.
1351 (default: 0)
1351 (default: 0)
1352
1352
1353 ``executable``
1353 ``executable``
1354 Either just the name of the executable or its pathname.
1354 Either just the name of the executable or its pathname.
1355
1355
1356 .. container:: windows
1356 .. container:: windows
1357
1357
1358 On Windows, the path can use environment variables with ${ProgramFiles}
1358 On Windows, the path can use environment variables with ${ProgramFiles}
1359 syntax.
1359 syntax.
1360
1360
1361 (default: the tool name)
1361 (default: the tool name)
1362
1362
1363 ``args``
1363 ``args``
1364 The arguments to pass to the tool executable. You can refer to the
1364 The arguments to pass to the tool executable. You can refer to the
1365 files being merged as well as the output file through these
1365 files being merged as well as the output file through these
1366 variables: ``$base``, ``$local``, ``$other``, ``$output``. The meaning
1366 variables: ``$base``, ``$local``, ``$other``, ``$output``.
1367 of ``$local`` and ``$other`` can vary depending on which action is being
1367
1368 performed. During and update or merge, ``$local`` represents the original
1368 The meaning of ``$local`` and ``$other`` can vary depending on which action is
1369 state of the file, while ``$other`` represents the commit you are updating
1369 being performed. During an update or merge, ``$local`` represents the original
1370 to or the commit you are merging with. During a rebase ``$local``
1370 state of the file, while ``$other`` represents the commit you are updating to or
1371 represents the destination of the rebase, and ``$other`` represents the
1371 the commit you are merging with. During a rebase, ``$local`` represents the
1372 commit being rebased.
1372 destination of the rebase, and ``$other`` represents the commit being rebased.
1373
1374 Some operations define custom labels to assist with identifying the revisions,
1375 accessible via ``$labellocal``, ``$labelother``, and ``$labelbase``. If custom
1376 labels are not available, these will be ``local``, ``other``, and ``base``,
1377 respectively.
1373 (default: ``$local $base $other``)
1378 (default: ``$local $base $other``)
1374
1379
1375 ``premerge``
1380 ``premerge``
1376 Attempt to run internal non-interactive 3-way merge tool before
1381 Attempt to run internal non-interactive 3-way merge tool before
1377 launching external tool. Options are ``true``, ``false``, ``keep`` or
1382 launching external tool. Options are ``true``, ``false``, ``keep`` or
1378 ``keep-merge3``. The ``keep`` option will leave markers in the file if the
1383 ``keep-merge3``. The ``keep`` option will leave markers in the file if the
1379 premerge fails. The ``keep-merge3`` will do the same but include information
1384 premerge fails. The ``keep-merge3`` will do the same but include information
1380 about the base of the merge in the marker (see internal :merge3 in
1385 about the base of the merge in the marker (see internal :merge3 in
1381 :hg:`help merge-tools`).
1386 :hg:`help merge-tools`).
1382 (default: True)
1387 (default: True)
1383
1388
1384 ``binary``
1389 ``binary``
1385 This tool can merge binary files. (default: False, unless tool
1390 This tool can merge binary files. (default: False, unless tool
1386 was selected by file pattern match)
1391 was selected by file pattern match)
1387
1392
1388 ``symlink``
1393 ``symlink``
1389 This tool can merge symlinks. (default: False)
1394 This tool can merge symlinks. (default: False)
1390
1395
1391 ``check``
1396 ``check``
1392 A list of merge success-checking options:
1397 A list of merge success-checking options:
1393
1398
1394 ``changed``
1399 ``changed``
1395 Ask whether merge was successful when the merged file shows no changes.
1400 Ask whether merge was successful when the merged file shows no changes.
1396 ``conflicts``
1401 ``conflicts``
1397 Check whether there are conflicts even though the tool reported success.
1402 Check whether there are conflicts even though the tool reported success.
1398 ``prompt``
1403 ``prompt``
1399 Always prompt for merge success, regardless of success reported by tool.
1404 Always prompt for merge success, regardless of success reported by tool.
1400
1405
1401 ``fixeol``
1406 ``fixeol``
1402 Attempt to fix up EOL changes caused by the merge tool.
1407 Attempt to fix up EOL changes caused by the merge tool.
1403 (default: False)
1408 (default: False)
1404
1409
1405 ``gui``
1410 ``gui``
1406 This tool requires a graphical interface to run. (default: False)
1411 This tool requires a graphical interface to run. (default: False)
1407
1412
1413 ``mergemarkers``
1414 Controls whether the labels passed via ``$labellocal``, ``$labelother``, and
1415 ``$labelbase`` are ``detailed`` (respecting ``mergemarkertemplate``) or
1416 ``basic``. If ``premerge`` is ``keep`` or ``keep-merge3``, the conflict
1417 markers generated during premerge will be ``detailed`` if either this option or
1418 the corresponding option in the ``[ui]`` section is ``detailed``.
1419 (default: ``basic``)
1420
1421 ``mergemarkertemplate``
1422 This setting can be used to override ``mergemarkertemplate`` from the ``[ui]``
1423 section on a per-tool basis; this applies to the ``$label``-prefixed variables
1424 and to the conflict markers that are generated if ``premerge`` is ``keep` or
1425 ``keep-merge3``. See the corresponding variable in ``[ui]`` for more
1426 information.
1427
1408 .. container:: windows
1428 .. container:: windows
1409
1429
1410 ``regkey``
1430 ``regkey``
1411 Windows registry key which describes install location of this
1431 Windows registry key which describes install location of this
1412 tool. Mercurial will search for this key first under
1432 tool. Mercurial will search for this key first under
1413 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1433 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1414 (default: None)
1434 (default: None)
1415
1435
1416 ``regkeyalt``
1436 ``regkeyalt``
1417 An alternate Windows registry key to try if the first key is not
1437 An alternate Windows registry key to try if the first key is not
1418 found. The alternate key uses the same ``regname`` and ``regappend``
1438 found. The alternate key uses the same ``regname`` and ``regappend``
1419 semantics of the primary key. The most common use for this key
1439 semantics of the primary key. The most common use for this key
1420 is to search for 32bit applications on 64bit operating systems.
1440 is to search for 32bit applications on 64bit operating systems.
1421 (default: None)
1441 (default: None)
1422
1442
1423 ``regname``
1443 ``regname``
1424 Name of value to read from specified registry key.
1444 Name of value to read from specified registry key.
1425 (default: the unnamed (default) value)
1445 (default: the unnamed (default) value)
1426
1446
1427 ``regappend``
1447 ``regappend``
1428 String to append to the value read from the registry, typically
1448 String to append to the value read from the registry, typically
1429 the executable name of the tool.
1449 the executable name of the tool.
1430 (default: None)
1450 (default: None)
1431
1451
1432 ``pager``
1452 ``pager``
1433 ---------
1453 ---------
1434
1454
1435 Setting used to control when to paginate and with what external tool. See
1455 Setting used to control when to paginate and with what external tool. See
1436 :hg:`help pager` for details.
1456 :hg:`help pager` for details.
1437
1457
1438 ``pager``
1458 ``pager``
1439 Define the external tool used as pager.
1459 Define the external tool used as pager.
1440
1460
1441 If no pager is set, Mercurial uses the environment variable $PAGER.
1461 If no pager is set, Mercurial uses the environment variable $PAGER.
1442 If neither pager.pager, nor $PAGER is set, a default pager will be
1462 If neither pager.pager, nor $PAGER is set, a default pager will be
1443 used, typically `less` on Unix and `more` on Windows. Example::
1463 used, typically `less` on Unix and `more` on Windows. Example::
1444
1464
1445 [pager]
1465 [pager]
1446 pager = less -FRX
1466 pager = less -FRX
1447
1467
1448 ``ignore``
1468 ``ignore``
1449 List of commands to disable the pager for. Example::
1469 List of commands to disable the pager for. Example::
1450
1470
1451 [pager]
1471 [pager]
1452 ignore = version, help, update
1472 ignore = version, help, update
1453
1473
1454 ``patch``
1474 ``patch``
1455 ---------
1475 ---------
1456
1476
1457 Settings used when applying patches, for instance through the 'import'
1477 Settings used when applying patches, for instance through the 'import'
1458 command or with Mercurial Queues extension.
1478 command or with Mercurial Queues extension.
1459
1479
1460 ``eol``
1480 ``eol``
1461 When set to 'strict' patch content and patched files end of lines
1481 When set to 'strict' patch content and patched files end of lines
1462 are preserved. When set to ``lf`` or ``crlf``, both files end of
1482 are preserved. When set to ``lf`` or ``crlf``, both files end of
1463 lines are ignored when patching and the result line endings are
1483 lines are ignored when patching and the result line endings are
1464 normalized to either LF (Unix) or CRLF (Windows). When set to
1484 normalized to either LF (Unix) or CRLF (Windows). When set to
1465 ``auto``, end of lines are again ignored while patching but line
1485 ``auto``, end of lines are again ignored while patching but line
1466 endings in patched files are normalized to their original setting
1486 endings in patched files are normalized to their original setting
1467 on a per-file basis. If target file does not exist or has no end
1487 on a per-file basis. If target file does not exist or has no end
1468 of line, patch line endings are preserved.
1488 of line, patch line endings are preserved.
1469 (default: strict)
1489 (default: strict)
1470
1490
1471 ``fuzz``
1491 ``fuzz``
1472 The number of lines of 'fuzz' to allow when applying patches. This
1492 The number of lines of 'fuzz' to allow when applying patches. This
1473 controls how much context the patcher is allowed to ignore when
1493 controls how much context the patcher is allowed to ignore when
1474 trying to apply a patch.
1494 trying to apply a patch.
1475 (default: 2)
1495 (default: 2)
1476
1496
1477 ``paths``
1497 ``paths``
1478 ---------
1498 ---------
1479
1499
1480 Assigns symbolic names and behavior to repositories.
1500 Assigns symbolic names and behavior to repositories.
1481
1501
1482 Options are symbolic names defining the URL or directory that is the
1502 Options are symbolic names defining the URL or directory that is the
1483 location of the repository. Example::
1503 location of the repository. Example::
1484
1504
1485 [paths]
1505 [paths]
1486 my_server = https://example.com/my_repo
1506 my_server = https://example.com/my_repo
1487 local_path = /home/me/repo
1507 local_path = /home/me/repo
1488
1508
1489 These symbolic names can be used from the command line. To pull
1509 These symbolic names can be used from the command line. To pull
1490 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1510 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1491 :hg:`push local_path`.
1511 :hg:`push local_path`.
1492
1512
1493 Options containing colons (``:``) denote sub-options that can influence
1513 Options containing colons (``:``) denote sub-options that can influence
1494 behavior for that specific path. Example::
1514 behavior for that specific path. Example::
1495
1515
1496 [paths]
1516 [paths]
1497 my_server = https://example.com/my_path
1517 my_server = https://example.com/my_path
1498 my_server:pushurl = ssh://example.com/my_path
1518 my_server:pushurl = ssh://example.com/my_path
1499
1519
1500 The following sub-options can be defined:
1520 The following sub-options can be defined:
1501
1521
1502 ``pushurl``
1522 ``pushurl``
1503 The URL to use for push operations. If not defined, the location
1523 The URL to use for push operations. If not defined, the location
1504 defined by the path's main entry is used.
1524 defined by the path's main entry is used.
1505
1525
1506 ``pushrev``
1526 ``pushrev``
1507 A revset defining which revisions to push by default.
1527 A revset defining which revisions to push by default.
1508
1528
1509 When :hg:`push` is executed without a ``-r`` argument, the revset
1529 When :hg:`push` is executed without a ``-r`` argument, the revset
1510 defined by this sub-option is evaluated to determine what to push.
1530 defined by this sub-option is evaluated to determine what to push.
1511
1531
1512 For example, a value of ``.`` will push the working directory's
1532 For example, a value of ``.`` will push the working directory's
1513 revision by default.
1533 revision by default.
1514
1534
1515 Revsets specifying bookmarks will not result in the bookmark being
1535 Revsets specifying bookmarks will not result in the bookmark being
1516 pushed.
1536 pushed.
1517
1537
1518 The following special named paths exist:
1538 The following special named paths exist:
1519
1539
1520 ``default``
1540 ``default``
1521 The URL or directory to use when no source or remote is specified.
1541 The URL or directory to use when no source or remote is specified.
1522
1542
1523 :hg:`clone` will automatically define this path to the location the
1543 :hg:`clone` will automatically define this path to the location the
1524 repository was cloned from.
1544 repository was cloned from.
1525
1545
1526 ``default-push``
1546 ``default-push``
1527 (deprecated) The URL or directory for the default :hg:`push` location.
1547 (deprecated) The URL or directory for the default :hg:`push` location.
1528 ``default:pushurl`` should be used instead.
1548 ``default:pushurl`` should be used instead.
1529
1549
1530 ``phases``
1550 ``phases``
1531 ----------
1551 ----------
1532
1552
1533 Specifies default handling of phases. See :hg:`help phases` for more
1553 Specifies default handling of phases. See :hg:`help phases` for more
1534 information about working with phases.
1554 information about working with phases.
1535
1555
1536 ``publish``
1556 ``publish``
1537 Controls draft phase behavior when working as a server. When true,
1557 Controls draft phase behavior when working as a server. When true,
1538 pushed changesets are set to public in both client and server and
1558 pushed changesets are set to public in both client and server and
1539 pulled or cloned changesets are set to public in the client.
1559 pulled or cloned changesets are set to public in the client.
1540 (default: True)
1560 (default: True)
1541
1561
1542 ``new-commit``
1562 ``new-commit``
1543 Phase of newly-created commits.
1563 Phase of newly-created commits.
1544 (default: draft)
1564 (default: draft)
1545
1565
1546 ``checksubrepos``
1566 ``checksubrepos``
1547 Check the phase of the current revision of each subrepository. Allowed
1567 Check the phase of the current revision of each subrepository. Allowed
1548 values are "ignore", "follow" and "abort". For settings other than
1568 values are "ignore", "follow" and "abort". For settings other than
1549 "ignore", the phase of the current revision of each subrepository is
1569 "ignore", the phase of the current revision of each subrepository is
1550 checked before committing the parent repository. If any of those phases is
1570 checked before committing the parent repository. If any of those phases is
1551 greater than the phase of the parent repository (e.g. if a subrepo is in a
1571 greater than the phase of the parent repository (e.g. if a subrepo is in a
1552 "secret" phase while the parent repo is in "draft" phase), the commit is
1572 "secret" phase while the parent repo is in "draft" phase), the commit is
1553 either aborted (if checksubrepos is set to "abort") or the higher phase is
1573 either aborted (if checksubrepos is set to "abort") or the higher phase is
1554 used for the parent repository commit (if set to "follow").
1574 used for the parent repository commit (if set to "follow").
1555 (default: follow)
1575 (default: follow)
1556
1576
1557
1577
1558 ``profiling``
1578 ``profiling``
1559 -------------
1579 -------------
1560
1580
1561 Specifies profiling type, format, and file output. Two profilers are
1581 Specifies profiling type, format, and file output. Two profilers are
1562 supported: an instrumenting profiler (named ``ls``), and a sampling
1582 supported: an instrumenting profiler (named ``ls``), and a sampling
1563 profiler (named ``stat``).
1583 profiler (named ``stat``).
1564
1584
1565 In this section description, 'profiling data' stands for the raw data
1585 In this section description, 'profiling data' stands for the raw data
1566 collected during profiling, while 'profiling report' stands for a
1586 collected during profiling, while 'profiling report' stands for a
1567 statistical text report generated from the profiling data. The
1587 statistical text report generated from the profiling data. The
1568 profiling is done using lsprof.
1588 profiling is done using lsprof.
1569
1589
1570 ``enabled``
1590 ``enabled``
1571 Enable the profiler.
1591 Enable the profiler.
1572 (default: false)
1592 (default: false)
1573
1593
1574 This is equivalent to passing ``--profile`` on the command line.
1594 This is equivalent to passing ``--profile`` on the command line.
1575
1595
1576 ``type``
1596 ``type``
1577 The type of profiler to use.
1597 The type of profiler to use.
1578 (default: stat)
1598 (default: stat)
1579
1599
1580 ``ls``
1600 ``ls``
1581 Use Python's built-in instrumenting profiler. This profiler
1601 Use Python's built-in instrumenting profiler. This profiler
1582 works on all platforms, but each line number it reports is the
1602 works on all platforms, but each line number it reports is the
1583 first line of a function. This restriction makes it difficult to
1603 first line of a function. This restriction makes it difficult to
1584 identify the expensive parts of a non-trivial function.
1604 identify the expensive parts of a non-trivial function.
1585 ``stat``
1605 ``stat``
1586 Use a statistical profiler, statprof. This profiler is most
1606 Use a statistical profiler, statprof. This profiler is most
1587 useful for profiling commands that run for longer than about 0.1
1607 useful for profiling commands that run for longer than about 0.1
1588 seconds.
1608 seconds.
1589
1609
1590 ``format``
1610 ``format``
1591 Profiling format. Specific to the ``ls`` instrumenting profiler.
1611 Profiling format. Specific to the ``ls`` instrumenting profiler.
1592 (default: text)
1612 (default: text)
1593
1613
1594 ``text``
1614 ``text``
1595 Generate a profiling report. When saving to a file, it should be
1615 Generate a profiling report. When saving to a file, it should be
1596 noted that only the report is saved, and the profiling data is
1616 noted that only the report is saved, and the profiling data is
1597 not kept.
1617 not kept.
1598 ``kcachegrind``
1618 ``kcachegrind``
1599 Format profiling data for kcachegrind use: when saving to a
1619 Format profiling data for kcachegrind use: when saving to a
1600 file, the generated file can directly be loaded into
1620 file, the generated file can directly be loaded into
1601 kcachegrind.
1621 kcachegrind.
1602
1622
1603 ``statformat``
1623 ``statformat``
1604 Profiling format for the ``stat`` profiler.
1624 Profiling format for the ``stat`` profiler.
1605 (default: hotpath)
1625 (default: hotpath)
1606
1626
1607 ``hotpath``
1627 ``hotpath``
1608 Show a tree-based display containing the hot path of execution (where
1628 Show a tree-based display containing the hot path of execution (where
1609 most time was spent).
1629 most time was spent).
1610 ``bymethod``
1630 ``bymethod``
1611 Show a table of methods ordered by how frequently they are active.
1631 Show a table of methods ordered by how frequently they are active.
1612 ``byline``
1632 ``byline``
1613 Show a table of lines in files ordered by how frequently they are active.
1633 Show a table of lines in files ordered by how frequently they are active.
1614 ``json``
1634 ``json``
1615 Render profiling data as JSON.
1635 Render profiling data as JSON.
1616
1636
1617 ``frequency``
1637 ``frequency``
1618 Sampling frequency. Specific to the ``stat`` sampling profiler.
1638 Sampling frequency. Specific to the ``stat`` sampling profiler.
1619 (default: 1000)
1639 (default: 1000)
1620
1640
1621 ``output``
1641 ``output``
1622 File path where profiling data or report should be saved. If the
1642 File path where profiling data or report should be saved. If the
1623 file exists, it is replaced. (default: None, data is printed on
1643 file exists, it is replaced. (default: None, data is printed on
1624 stderr)
1644 stderr)
1625
1645
1626 ``sort``
1646 ``sort``
1627 Sort field. Specific to the ``ls`` instrumenting profiler.
1647 Sort field. Specific to the ``ls`` instrumenting profiler.
1628 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1648 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1629 ``inlinetime``.
1649 ``inlinetime``.
1630 (default: inlinetime)
1650 (default: inlinetime)
1631
1651
1632 ``limit``
1652 ``limit``
1633 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1653 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1634 (default: 30)
1654 (default: 30)
1635
1655
1636 ``nested``
1656 ``nested``
1637 Show at most this number of lines of drill-down info after each main entry.
1657 Show at most this number of lines of drill-down info after each main entry.
1638 This can help explain the difference between Total and Inline.
1658 This can help explain the difference between Total and Inline.
1639 Specific to the ``ls`` instrumenting profiler.
1659 Specific to the ``ls`` instrumenting profiler.
1640 (default: 5)
1660 (default: 5)
1641
1661
1642 ``showmin``
1662 ``showmin``
1643 Minimum fraction of samples an entry must have for it to be displayed.
1663 Minimum fraction of samples an entry must have for it to be displayed.
1644 Can be specified as a float between ``0.0`` and ``1.0`` or can have a
1664 Can be specified as a float between ``0.0`` and ``1.0`` or can have a
1645 ``%`` afterwards to allow values up to ``100``. e.g. ``5%``.
1665 ``%`` afterwards to allow values up to ``100``. e.g. ``5%``.
1646
1666
1647 Only used by the ``stat`` profiler.
1667 Only used by the ``stat`` profiler.
1648
1668
1649 For the ``hotpath`` format, default is ``0.05``.
1669 For the ``hotpath`` format, default is ``0.05``.
1650 For the ``chrome`` format, default is ``0.005``.
1670 For the ``chrome`` format, default is ``0.005``.
1651
1671
1652 The option is unused on other formats.
1672 The option is unused on other formats.
1653
1673
1654 ``showmax``
1674 ``showmax``
1655 Maximum fraction of samples an entry can have before it is ignored in
1675 Maximum fraction of samples an entry can have before it is ignored in
1656 display. Values format is the same as ``showmin``.
1676 display. Values format is the same as ``showmin``.
1657
1677
1658 Only used by the ``stat`` profiler.
1678 Only used by the ``stat`` profiler.
1659
1679
1660 For the ``chrome`` format, default is ``0.999``.
1680 For the ``chrome`` format, default is ``0.999``.
1661
1681
1662 The option is unused on other formats.
1682 The option is unused on other formats.
1663
1683
1664 ``progress``
1684 ``progress``
1665 ------------
1685 ------------
1666
1686
1667 Mercurial commands can draw progress bars that are as informative as
1687 Mercurial commands can draw progress bars that are as informative as
1668 possible. Some progress bars only offer indeterminate information, while others
1688 possible. Some progress bars only offer indeterminate information, while others
1669 have a definite end point.
1689 have a definite end point.
1670
1690
1671 ``delay``
1691 ``delay``
1672 Number of seconds (float) before showing the progress bar. (default: 3)
1692 Number of seconds (float) before showing the progress bar. (default: 3)
1673
1693
1674 ``changedelay``
1694 ``changedelay``
1675 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1695 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1676 that value will be used instead. (default: 1)
1696 that value will be used instead. (default: 1)
1677
1697
1678 ``estimateinterval``
1698 ``estimateinterval``
1679 Maximum sampling interval in seconds for speed and estimated time
1699 Maximum sampling interval in seconds for speed and estimated time
1680 calculation. (default: 60)
1700 calculation. (default: 60)
1681
1701
1682 ``refresh``
1702 ``refresh``
1683 Time in seconds between refreshes of the progress bar. (default: 0.1)
1703 Time in seconds between refreshes of the progress bar. (default: 0.1)
1684
1704
1685 ``format``
1705 ``format``
1686 Format of the progress bar.
1706 Format of the progress bar.
1687
1707
1688 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1708 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1689 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1709 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1690 last 20 characters of the item, but this can be changed by adding either
1710 last 20 characters of the item, but this can be changed by adding either
1691 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1711 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1692 first num characters.
1712 first num characters.
1693
1713
1694 (default: topic bar number estimate)
1714 (default: topic bar number estimate)
1695
1715
1696 ``width``
1716 ``width``
1697 If set, the maximum width of the progress information (that is, min(width,
1717 If set, the maximum width of the progress information (that is, min(width,
1698 term width) will be used).
1718 term width) will be used).
1699
1719
1700 ``clear-complete``
1720 ``clear-complete``
1701 Clear the progress bar after it's done. (default: True)
1721 Clear the progress bar after it's done. (default: True)
1702
1722
1703 ``disable``
1723 ``disable``
1704 If true, don't show a progress bar.
1724 If true, don't show a progress bar.
1705
1725
1706 ``assume-tty``
1726 ``assume-tty``
1707 If true, ALWAYS show a progress bar, unless disable is given.
1727 If true, ALWAYS show a progress bar, unless disable is given.
1708
1728
1709 ``rebase``
1729 ``rebase``
1710 ----------
1730 ----------
1711
1731
1712 ``evolution.allowdivergence``
1732 ``evolution.allowdivergence``
1713 Default to False, when True allow creating divergence when performing
1733 Default to False, when True allow creating divergence when performing
1714 rebase of obsolete changesets.
1734 rebase of obsolete changesets.
1715
1735
1716 ``revsetalias``
1736 ``revsetalias``
1717 ---------------
1737 ---------------
1718
1738
1719 Alias definitions for revsets. See :hg:`help revsets` for details.
1739 Alias definitions for revsets. See :hg:`help revsets` for details.
1720
1740
1721 ``server``
1741 ``server``
1722 ----------
1742 ----------
1723
1743
1724 Controls generic server settings.
1744 Controls generic server settings.
1725
1745
1726 ``bookmarks-pushkey-compat``
1746 ``bookmarks-pushkey-compat``
1727 Trigger pushkey hook when being pushed bookmark updates. This config exist
1747 Trigger pushkey hook when being pushed bookmark updates. This config exist
1728 for compatibility purpose (default to True)
1748 for compatibility purpose (default to True)
1729
1749
1730 If you use ``pushkey`` and ``pre-pushkey`` hooks to control bookmark
1750 If you use ``pushkey`` and ``pre-pushkey`` hooks to control bookmark
1731 movement we recommend you migrate them to ``txnclose-bookmark`` and
1751 movement we recommend you migrate them to ``txnclose-bookmark`` and
1732 ``pretxnclose-bookmark``.
1752 ``pretxnclose-bookmark``.
1733
1753
1734 ``compressionengines``
1754 ``compressionengines``
1735 List of compression engines and their relative priority to advertise
1755 List of compression engines and their relative priority to advertise
1736 to clients.
1756 to clients.
1737
1757
1738 The order of compression engines determines their priority, the first
1758 The order of compression engines determines their priority, the first
1739 having the highest priority. If a compression engine is not listed
1759 having the highest priority. If a compression engine is not listed
1740 here, it won't be advertised to clients.
1760 here, it won't be advertised to clients.
1741
1761
1742 If not set (the default), built-in defaults are used. Run
1762 If not set (the default), built-in defaults are used. Run
1743 :hg:`debuginstall` to list available compression engines and their
1763 :hg:`debuginstall` to list available compression engines and their
1744 default wire protocol priority.
1764 default wire protocol priority.
1745
1765
1746 Older Mercurial clients only support zlib compression and this setting
1766 Older Mercurial clients only support zlib compression and this setting
1747 has no effect for legacy clients.
1767 has no effect for legacy clients.
1748
1768
1749 ``uncompressed``
1769 ``uncompressed``
1750 Whether to allow clients to clone a repository using the
1770 Whether to allow clients to clone a repository using the
1751 uncompressed streaming protocol. This transfers about 40% more
1771 uncompressed streaming protocol. This transfers about 40% more
1752 data than a regular clone, but uses less memory and CPU on both
1772 data than a regular clone, but uses less memory and CPU on both
1753 server and client. Over a LAN (100 Mbps or better) or a very fast
1773 server and client. Over a LAN (100 Mbps or better) or a very fast
1754 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
1774 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
1755 regular clone. Over most WAN connections (anything slower than
1775 regular clone. Over most WAN connections (anything slower than
1756 about 6 Mbps), uncompressed streaming is slower, because of the
1776 about 6 Mbps), uncompressed streaming is slower, because of the
1757 extra data transfer overhead. This mode will also temporarily hold
1777 extra data transfer overhead. This mode will also temporarily hold
1758 the write lock while determining what data to transfer.
1778 the write lock while determining what data to transfer.
1759 (default: True)
1779 (default: True)
1760
1780
1761 ``uncompressedallowsecret``
1781 ``uncompressedallowsecret``
1762 Whether to allow stream clones when the repository contains secret
1782 Whether to allow stream clones when the repository contains secret
1763 changesets. (default: False)
1783 changesets. (default: False)
1764
1784
1765 ``preferuncompressed``
1785 ``preferuncompressed``
1766 When set, clients will try to use the uncompressed streaming
1786 When set, clients will try to use the uncompressed streaming
1767 protocol. (default: False)
1787 protocol. (default: False)
1768
1788
1769 ``disablefullbundle``
1789 ``disablefullbundle``
1770 When set, servers will refuse attempts to do pull-based clones.
1790 When set, servers will refuse attempts to do pull-based clones.
1771 If this option is set, ``preferuncompressed`` and/or clone bundles
1791 If this option is set, ``preferuncompressed`` and/or clone bundles
1772 are highly recommended. Partial clones will still be allowed.
1792 are highly recommended. Partial clones will still be allowed.
1773 (default: False)
1793 (default: False)
1774
1794
1775 ``concurrent-push-mode``
1795 ``concurrent-push-mode``
1776 Level of allowed race condition between two pushing clients.
1796 Level of allowed race condition between two pushing clients.
1777
1797
1778 - 'strict': push is abort if another client touched the repository
1798 - 'strict': push is abort if another client touched the repository
1779 while the push was preparing. (default)
1799 while the push was preparing. (default)
1780 - 'check-related': push is only aborted if it affects head that got also
1800 - 'check-related': push is only aborted if it affects head that got also
1781 affected while the push was preparing.
1801 affected while the push was preparing.
1782
1802
1783 This requires compatible client (version 4.3 and later). Old client will
1803 This requires compatible client (version 4.3 and later). Old client will
1784 use 'strict'.
1804 use 'strict'.
1785
1805
1786 ``validate``
1806 ``validate``
1787 Whether to validate the completeness of pushed changesets by
1807 Whether to validate the completeness of pushed changesets by
1788 checking that all new file revisions specified in manifests are
1808 checking that all new file revisions specified in manifests are
1789 present. (default: False)
1809 present. (default: False)
1790
1810
1791 ``maxhttpheaderlen``
1811 ``maxhttpheaderlen``
1792 Instruct HTTP clients not to send request headers longer than this
1812 Instruct HTTP clients not to send request headers longer than this
1793 many bytes. (default: 1024)
1813 many bytes. (default: 1024)
1794
1814
1795 ``bundle1``
1815 ``bundle1``
1796 Whether to allow clients to push and pull using the legacy bundle1
1816 Whether to allow clients to push and pull using the legacy bundle1
1797 exchange format. (default: True)
1817 exchange format. (default: True)
1798
1818
1799 ``bundle1gd``
1819 ``bundle1gd``
1800 Like ``bundle1`` but only used if the repository is using the
1820 Like ``bundle1`` but only used if the repository is using the
1801 *generaldelta* storage format. (default: True)
1821 *generaldelta* storage format. (default: True)
1802
1822
1803 ``bundle1.push``
1823 ``bundle1.push``
1804 Whether to allow clients to push using the legacy bundle1 exchange
1824 Whether to allow clients to push using the legacy bundle1 exchange
1805 format. (default: True)
1825 format. (default: True)
1806
1826
1807 ``bundle1gd.push``
1827 ``bundle1gd.push``
1808 Like ``bundle1.push`` but only used if the repository is using the
1828 Like ``bundle1.push`` but only used if the repository is using the
1809 *generaldelta* storage format. (default: True)
1829 *generaldelta* storage format. (default: True)
1810
1830
1811 ``bundle1.pull``
1831 ``bundle1.pull``
1812 Whether to allow clients to pull using the legacy bundle1 exchange
1832 Whether to allow clients to pull using the legacy bundle1 exchange
1813 format. (default: True)
1833 format. (default: True)
1814
1834
1815 ``bundle1gd.pull``
1835 ``bundle1gd.pull``
1816 Like ``bundle1.pull`` but only used if the repository is using the
1836 Like ``bundle1.pull`` but only used if the repository is using the
1817 *generaldelta* storage format. (default: True)
1837 *generaldelta* storage format. (default: True)
1818
1838
1819 Large repositories using the *generaldelta* storage format should
1839 Large repositories using the *generaldelta* storage format should
1820 consider setting this option because converting *generaldelta*
1840 consider setting this option because converting *generaldelta*
1821 repositories to the exchange format required by the bundle1 data
1841 repositories to the exchange format required by the bundle1 data
1822 format can consume a lot of CPU.
1842 format can consume a lot of CPU.
1823
1843
1824 ``zliblevel``
1844 ``zliblevel``
1825 Integer between ``-1`` and ``9`` that controls the zlib compression level
1845 Integer between ``-1`` and ``9`` that controls the zlib compression level
1826 for wire protocol commands that send zlib compressed output (notably the
1846 for wire protocol commands that send zlib compressed output (notably the
1827 commands that send repository history data).
1847 commands that send repository history data).
1828
1848
1829 The default (``-1``) uses the default zlib compression level, which is
1849 The default (``-1``) uses the default zlib compression level, which is
1830 likely equivalent to ``6``. ``0`` means no compression. ``9`` means
1850 likely equivalent to ``6``. ``0`` means no compression. ``9`` means
1831 maximum compression.
1851 maximum compression.
1832
1852
1833 Setting this option allows server operators to make trade-offs between
1853 Setting this option allows server operators to make trade-offs between
1834 bandwidth and CPU used. Lowering the compression lowers CPU utilization
1854 bandwidth and CPU used. Lowering the compression lowers CPU utilization
1835 but sends more bytes to clients.
1855 but sends more bytes to clients.
1836
1856
1837 This option only impacts the HTTP server.
1857 This option only impacts the HTTP server.
1838
1858
1839 ``zstdlevel``
1859 ``zstdlevel``
1840 Integer between ``1`` and ``22`` that controls the zstd compression level
1860 Integer between ``1`` and ``22`` that controls the zstd compression level
1841 for wire protocol commands. ``1`` is the minimal amount of compression and
1861 for wire protocol commands. ``1`` is the minimal amount of compression and
1842 ``22`` is the highest amount of compression.
1862 ``22`` is the highest amount of compression.
1843
1863
1844 The default (``3``) should be significantly faster than zlib while likely
1864 The default (``3``) should be significantly faster than zlib while likely
1845 delivering better compression ratios.
1865 delivering better compression ratios.
1846
1866
1847 This option only impacts the HTTP server.
1867 This option only impacts the HTTP server.
1848
1868
1849 See also ``server.zliblevel``.
1869 See also ``server.zliblevel``.
1850
1870
1851 ``smtp``
1871 ``smtp``
1852 --------
1872 --------
1853
1873
1854 Configuration for extensions that need to send email messages.
1874 Configuration for extensions that need to send email messages.
1855
1875
1856 ``host``
1876 ``host``
1857 Host name of mail server, e.g. "mail.example.com".
1877 Host name of mail server, e.g. "mail.example.com".
1858
1878
1859 ``port``
1879 ``port``
1860 Optional. Port to connect to on mail server. (default: 465 if
1880 Optional. Port to connect to on mail server. (default: 465 if
1861 ``tls`` is smtps; 25 otherwise)
1881 ``tls`` is smtps; 25 otherwise)
1862
1882
1863 ``tls``
1883 ``tls``
1864 Optional. Method to enable TLS when connecting to mail server: starttls,
1884 Optional. Method to enable TLS when connecting to mail server: starttls,
1865 smtps or none. (default: none)
1885 smtps or none. (default: none)
1866
1886
1867 ``username``
1887 ``username``
1868 Optional. User name for authenticating with the SMTP server.
1888 Optional. User name for authenticating with the SMTP server.
1869 (default: None)
1889 (default: None)
1870
1890
1871 ``password``
1891 ``password``
1872 Optional. Password for authenticating with the SMTP server. If not
1892 Optional. Password for authenticating with the SMTP server. If not
1873 specified, interactive sessions will prompt the user for a
1893 specified, interactive sessions will prompt the user for a
1874 password; non-interactive sessions will fail. (default: None)
1894 password; non-interactive sessions will fail. (default: None)
1875
1895
1876 ``local_hostname``
1896 ``local_hostname``
1877 Optional. The hostname that the sender can use to identify
1897 Optional. The hostname that the sender can use to identify
1878 itself to the MTA.
1898 itself to the MTA.
1879
1899
1880
1900
1881 ``subpaths``
1901 ``subpaths``
1882 ------------
1902 ------------
1883
1903
1884 Subrepository source URLs can go stale if a remote server changes name
1904 Subrepository source URLs can go stale if a remote server changes name
1885 or becomes temporarily unavailable. This section lets you define
1905 or becomes temporarily unavailable. This section lets you define
1886 rewrite rules of the form::
1906 rewrite rules of the form::
1887
1907
1888 <pattern> = <replacement>
1908 <pattern> = <replacement>
1889
1909
1890 where ``pattern`` is a regular expression matching a subrepository
1910 where ``pattern`` is a regular expression matching a subrepository
1891 source URL and ``replacement`` is the replacement string used to
1911 source URL and ``replacement`` is the replacement string used to
1892 rewrite it. Groups can be matched in ``pattern`` and referenced in
1912 rewrite it. Groups can be matched in ``pattern`` and referenced in
1893 ``replacements``. For instance::
1913 ``replacements``. For instance::
1894
1914
1895 http://server/(.*)-hg/ = http://hg.server/\1/
1915 http://server/(.*)-hg/ = http://hg.server/\1/
1896
1916
1897 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
1917 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
1898
1918
1899 Relative subrepository paths are first made absolute, and the
1919 Relative subrepository paths are first made absolute, and the
1900 rewrite rules are then applied on the full (absolute) path. If ``pattern``
1920 rewrite rules are then applied on the full (absolute) path. If ``pattern``
1901 doesn't match the full path, an attempt is made to apply it on the
1921 doesn't match the full path, an attempt is made to apply it on the
1902 relative path alone. The rules are applied in definition order.
1922 relative path alone. The rules are applied in definition order.
1903
1923
1904 ``subrepos``
1924 ``subrepos``
1905 ------------
1925 ------------
1906
1926
1907 This section contains options that control the behavior of the
1927 This section contains options that control the behavior of the
1908 subrepositories feature. See also :hg:`help subrepos`.
1928 subrepositories feature. See also :hg:`help subrepos`.
1909
1929
1910 Security note: auditing in Mercurial is known to be insufficient to
1930 Security note: auditing in Mercurial is known to be insufficient to
1911 prevent clone-time code execution with carefully constructed Git
1931 prevent clone-time code execution with carefully constructed Git
1912 subrepos. It is unknown if a similar detect is present in Subversion
1932 subrepos. It is unknown if a similar detect is present in Subversion
1913 subrepos. Both Git and Subversion subrepos are disabled by default
1933 subrepos. Both Git and Subversion subrepos are disabled by default
1914 out of security concerns. These subrepo types can be enabled using
1934 out of security concerns. These subrepo types can be enabled using
1915 the respective options below.
1935 the respective options below.
1916
1936
1917 ``allowed``
1937 ``allowed``
1918 Whether subrepositories are allowed in the working directory.
1938 Whether subrepositories are allowed in the working directory.
1919
1939
1920 When false, commands involving subrepositories (like :hg:`update`)
1940 When false, commands involving subrepositories (like :hg:`update`)
1921 will fail for all subrepository types.
1941 will fail for all subrepository types.
1922 (default: true)
1942 (default: true)
1923
1943
1924 ``hg:allowed``
1944 ``hg:allowed``
1925 Whether Mercurial subrepositories are allowed in the working
1945 Whether Mercurial subrepositories are allowed in the working
1926 directory. This option only has an effect if ``subrepos.allowed``
1946 directory. This option only has an effect if ``subrepos.allowed``
1927 is true.
1947 is true.
1928 (default: true)
1948 (default: true)
1929
1949
1930 ``git:allowed``
1950 ``git:allowed``
1931 Whether Git subrepositories are allowed in the working directory.
1951 Whether Git subrepositories are allowed in the working directory.
1932 This option only has an effect if ``subrepos.allowed`` is true.
1952 This option only has an effect if ``subrepos.allowed`` is true.
1933
1953
1934 See the security note above before enabling Git subrepos.
1954 See the security note above before enabling Git subrepos.
1935 (default: false)
1955 (default: false)
1936
1956
1937 ``svn:allowed``
1957 ``svn:allowed``
1938 Whether Subversion subrepositories are allowed in the working
1958 Whether Subversion subrepositories are allowed in the working
1939 directory. This option only has an effect if ``subrepos.allowed``
1959 directory. This option only has an effect if ``subrepos.allowed``
1940 is true.
1960 is true.
1941
1961
1942 See the security note above before enabling Subversion subrepos.
1962 See the security note above before enabling Subversion subrepos.
1943 (default: false)
1963 (default: false)
1944
1964
1945 ``templatealias``
1965 ``templatealias``
1946 -----------------
1966 -----------------
1947
1967
1948 Alias definitions for templates. See :hg:`help templates` for details.
1968 Alias definitions for templates. See :hg:`help templates` for details.
1949
1969
1950 ``templates``
1970 ``templates``
1951 -------------
1971 -------------
1952
1972
1953 Use the ``[templates]`` section to define template strings.
1973 Use the ``[templates]`` section to define template strings.
1954 See :hg:`help templates` for details.
1974 See :hg:`help templates` for details.
1955
1975
1956 ``trusted``
1976 ``trusted``
1957 -----------
1977 -----------
1958
1978
1959 Mercurial will not use the settings in the
1979 Mercurial will not use the settings in the
1960 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
1980 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
1961 user or to a trusted group, as various hgrc features allow arbitrary
1981 user or to a trusted group, as various hgrc features allow arbitrary
1962 commands to be run. This issue is often encountered when configuring
1982 commands to be run. This issue is often encountered when configuring
1963 hooks or extensions for shared repositories or servers. However,
1983 hooks or extensions for shared repositories or servers. However,
1964 the web interface will use some safe settings from the ``[web]``
1984 the web interface will use some safe settings from the ``[web]``
1965 section.
1985 section.
1966
1986
1967 This section specifies what users and groups are trusted. The
1987 This section specifies what users and groups are trusted. The
1968 current user is always trusted. To trust everybody, list a user or a
1988 current user is always trusted. To trust everybody, list a user or a
1969 group with name ``*``. These settings must be placed in an
1989 group with name ``*``. These settings must be placed in an
1970 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
1990 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
1971 user or service running Mercurial.
1991 user or service running Mercurial.
1972
1992
1973 ``users``
1993 ``users``
1974 Comma-separated list of trusted users.
1994 Comma-separated list of trusted users.
1975
1995
1976 ``groups``
1996 ``groups``
1977 Comma-separated list of trusted groups.
1997 Comma-separated list of trusted groups.
1978
1998
1979
1999
1980 ``ui``
2000 ``ui``
1981 ------
2001 ------
1982
2002
1983 User interface controls.
2003 User interface controls.
1984
2004
1985 ``archivemeta``
2005 ``archivemeta``
1986 Whether to include the .hg_archival.txt file containing meta data
2006 Whether to include the .hg_archival.txt file containing meta data
1987 (hashes for the repository base and for tip) in archives created
2007 (hashes for the repository base and for tip) in archives created
1988 by the :hg:`archive` command or downloaded via hgweb.
2008 by the :hg:`archive` command or downloaded via hgweb.
1989 (default: True)
2009 (default: True)
1990
2010
1991 ``askusername``
2011 ``askusername``
1992 Whether to prompt for a username when committing. If True, and
2012 Whether to prompt for a username when committing. If True, and
1993 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
2013 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
1994 be prompted to enter a username. If no username is entered, the
2014 be prompted to enter a username. If no username is entered, the
1995 default ``USER@HOST`` is used instead.
2015 default ``USER@HOST`` is used instead.
1996 (default: False)
2016 (default: False)
1997
2017
1998 ``clonebundles``
2018 ``clonebundles``
1999 Whether the "clone bundles" feature is enabled.
2019 Whether the "clone bundles" feature is enabled.
2000
2020
2001 When enabled, :hg:`clone` may download and apply a server-advertised
2021 When enabled, :hg:`clone` may download and apply a server-advertised
2002 bundle file from a URL instead of using the normal exchange mechanism.
2022 bundle file from a URL instead of using the normal exchange mechanism.
2003
2023
2004 This can likely result in faster and more reliable clones.
2024 This can likely result in faster and more reliable clones.
2005
2025
2006 (default: True)
2026 (default: True)
2007
2027
2008 ``clonebundlefallback``
2028 ``clonebundlefallback``
2009 Whether failure to apply an advertised "clone bundle" from a server
2029 Whether failure to apply an advertised "clone bundle" from a server
2010 should result in fallback to a regular clone.
2030 should result in fallback to a regular clone.
2011
2031
2012 This is disabled by default because servers advertising "clone
2032 This is disabled by default because servers advertising "clone
2013 bundles" often do so to reduce server load. If advertised bundles
2033 bundles" often do so to reduce server load. If advertised bundles
2014 start mass failing and clients automatically fall back to a regular
2034 start mass failing and clients automatically fall back to a regular
2015 clone, this would add significant and unexpected load to the server
2035 clone, this would add significant and unexpected load to the server
2016 since the server is expecting clone operations to be offloaded to
2036 since the server is expecting clone operations to be offloaded to
2017 pre-generated bundles. Failing fast (the default behavior) ensures
2037 pre-generated bundles. Failing fast (the default behavior) ensures
2018 clients don't overwhelm the server when "clone bundle" application
2038 clients don't overwhelm the server when "clone bundle" application
2019 fails.
2039 fails.
2020
2040
2021 (default: False)
2041 (default: False)
2022
2042
2023 ``clonebundleprefers``
2043 ``clonebundleprefers``
2024 Defines preferences for which "clone bundles" to use.
2044 Defines preferences for which "clone bundles" to use.
2025
2045
2026 Servers advertising "clone bundles" may advertise multiple available
2046 Servers advertising "clone bundles" may advertise multiple available
2027 bundles. Each bundle may have different attributes, such as the bundle
2047 bundles. Each bundle may have different attributes, such as the bundle
2028 type and compression format. This option is used to prefer a particular
2048 type and compression format. This option is used to prefer a particular
2029 bundle over another.
2049 bundle over another.
2030
2050
2031 The following keys are defined by Mercurial:
2051 The following keys are defined by Mercurial:
2032
2052
2033 BUNDLESPEC
2053 BUNDLESPEC
2034 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
2054 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
2035 e.g. ``gzip-v2`` or ``bzip2-v1``.
2055 e.g. ``gzip-v2`` or ``bzip2-v1``.
2036
2056
2037 COMPRESSION
2057 COMPRESSION
2038 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
2058 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
2039
2059
2040 Server operators may define custom keys.
2060 Server operators may define custom keys.
2041
2061
2042 Example values: ``COMPRESSION=bzip2``,
2062 Example values: ``COMPRESSION=bzip2``,
2043 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
2063 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
2044
2064
2045 By default, the first bundle advertised by the server is used.
2065 By default, the first bundle advertised by the server is used.
2046
2066
2047 ``color``
2067 ``color``
2048 When to colorize output. Possible value are Boolean ("yes" or "no"), or
2068 When to colorize output. Possible value are Boolean ("yes" or "no"), or
2049 "debug", or "always". (default: "yes"). "yes" will use color whenever it
2069 "debug", or "always". (default: "yes"). "yes" will use color whenever it
2050 seems possible. See :hg:`help color` for details.
2070 seems possible. See :hg:`help color` for details.
2051
2071
2052 ``commitsubrepos``
2072 ``commitsubrepos``
2053 Whether to commit modified subrepositories when committing the
2073 Whether to commit modified subrepositories when committing the
2054 parent repository. If False and one subrepository has uncommitted
2074 parent repository. If False and one subrepository has uncommitted
2055 changes, abort the commit.
2075 changes, abort the commit.
2056 (default: False)
2076 (default: False)
2057
2077
2058 ``debug``
2078 ``debug``
2059 Print debugging information. (default: False)
2079 Print debugging information. (default: False)
2060
2080
2061 ``editor``
2081 ``editor``
2062 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
2082 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
2063
2083
2064 ``fallbackencoding``
2084 ``fallbackencoding``
2065 Encoding to try if it's not possible to decode the changelog using
2085 Encoding to try if it's not possible to decode the changelog using
2066 UTF-8. (default: ISO-8859-1)
2086 UTF-8. (default: ISO-8859-1)
2067
2087
2068 ``graphnodetemplate``
2088 ``graphnodetemplate``
2069 The template used to print changeset nodes in an ASCII revision graph.
2089 The template used to print changeset nodes in an ASCII revision graph.
2070 (default: ``{graphnode}``)
2090 (default: ``{graphnode}``)
2071
2091
2072 ``ignore``
2092 ``ignore``
2073 A file to read per-user ignore patterns from. This file should be
2093 A file to read per-user ignore patterns from. This file should be
2074 in the same format as a repository-wide .hgignore file. Filenames
2094 in the same format as a repository-wide .hgignore file. Filenames
2075 are relative to the repository root. This option supports hook syntax,
2095 are relative to the repository root. This option supports hook syntax,
2076 so if you want to specify multiple ignore files, you can do so by
2096 so if you want to specify multiple ignore files, you can do so by
2077 setting something like ``ignore.other = ~/.hgignore2``. For details
2097 setting something like ``ignore.other = ~/.hgignore2``. For details
2078 of the ignore file format, see the ``hgignore(5)`` man page.
2098 of the ignore file format, see the ``hgignore(5)`` man page.
2079
2099
2080 ``interactive``
2100 ``interactive``
2081 Allow to prompt the user. (default: True)
2101 Allow to prompt the user. (default: True)
2082
2102
2083 ``interface``
2103 ``interface``
2084 Select the default interface for interactive features (default: text).
2104 Select the default interface for interactive features (default: text).
2085 Possible values are 'text' and 'curses'.
2105 Possible values are 'text' and 'curses'.
2086
2106
2087 ``interface.chunkselector``
2107 ``interface.chunkselector``
2088 Select the interface for change recording (e.g. :hg:`commit -i`).
2108 Select the interface for change recording (e.g. :hg:`commit -i`).
2089 Possible values are 'text' and 'curses'.
2109 Possible values are 'text' and 'curses'.
2090 This config overrides the interface specified by ui.interface.
2110 This config overrides the interface specified by ui.interface.
2091
2111
2092 ``logtemplate``
2112 ``logtemplate``
2093 Template string for commands that print changesets.
2113 Template string for commands that print changesets.
2094
2114
2095 ``merge``
2115 ``merge``
2096 The conflict resolution program to use during a manual merge.
2116 The conflict resolution program to use during a manual merge.
2097 For more information on merge tools see :hg:`help merge-tools`.
2117 For more information on merge tools see :hg:`help merge-tools`.
2098 For configuring merge tools see the ``[merge-tools]`` section.
2118 For configuring merge tools see the ``[merge-tools]`` section.
2099
2119
2100 ``mergemarkers``
2120 ``mergemarkers``
2101 Sets the merge conflict marker label styling. The ``detailed``
2121 Sets the merge conflict marker label styling. The ``detailed``
2102 style uses the ``mergemarkertemplate`` setting to style the labels.
2122 style uses the ``mergemarkertemplate`` setting to style the labels.
2103 The ``basic`` style just uses 'local' and 'other' as the marker label.
2123 The ``basic`` style just uses 'local' and 'other' as the marker label.
2104 One of ``basic`` or ``detailed``.
2124 One of ``basic`` or ``detailed``.
2105 (default: ``basic``)
2125 (default: ``basic``)
2106
2126
2107 ``mergemarkertemplate``
2127 ``mergemarkertemplate``
2108 The template used to print the commit description next to each conflict
2128 The template used to print the commit description next to each conflict
2109 marker during merge conflicts. See :hg:`help templates` for the template
2129 marker during merge conflicts. See :hg:`help templates` for the template
2110 format.
2130 format.
2111
2131
2112 Defaults to showing the hash, tags, branches, bookmarks, author, and
2132 Defaults to showing the hash, tags, branches, bookmarks, author, and
2113 the first line of the commit description.
2133 the first line of the commit description.
2114
2134
2115 If you use non-ASCII characters in names for tags, branches, bookmarks,
2135 If you use non-ASCII characters in names for tags, branches, bookmarks,
2116 authors, and/or commit descriptions, you must pay attention to encodings of
2136 authors, and/or commit descriptions, you must pay attention to encodings of
2117 managed files. At template expansion, non-ASCII characters use the encoding
2137 managed files. At template expansion, non-ASCII characters use the encoding
2118 specified by the ``--encoding`` global option, ``HGENCODING`` or other
2138 specified by the ``--encoding`` global option, ``HGENCODING`` or other
2119 environment variables that govern your locale. If the encoding of the merge
2139 environment variables that govern your locale. If the encoding of the merge
2120 markers is different from the encoding of the merged files,
2140 markers is different from the encoding of the merged files,
2121 serious problems may occur.
2141 serious problems may occur.
2122
2142
2143 Can be overridden per-merge-tool, see the ``[merge-tools]`` section.
2144
2123 ``origbackuppath``
2145 ``origbackuppath``
2124 The path to a directory used to store generated .orig files. If the path is
2146 The path to a directory used to store generated .orig files. If the path is
2125 not a directory, one will be created. If set, files stored in this
2147 not a directory, one will be created. If set, files stored in this
2126 directory have the same name as the original file and do not have a .orig
2148 directory have the same name as the original file and do not have a .orig
2127 suffix.
2149 suffix.
2128
2150
2129 ``paginate``
2151 ``paginate``
2130 Control the pagination of command output (default: True). See :hg:`help pager`
2152 Control the pagination of command output (default: True). See :hg:`help pager`
2131 for details.
2153 for details.
2132
2154
2133 ``patch``
2155 ``patch``
2134 An optional external tool that ``hg import`` and some extensions
2156 An optional external tool that ``hg import`` and some extensions
2135 will use for applying patches. By default Mercurial uses an
2157 will use for applying patches. By default Mercurial uses an
2136 internal patch utility. The external tool must work as the common
2158 internal patch utility. The external tool must work as the common
2137 Unix ``patch`` program. In particular, it must accept a ``-p``
2159 Unix ``patch`` program. In particular, it must accept a ``-p``
2138 argument to strip patch headers, a ``-d`` argument to specify the
2160 argument to strip patch headers, a ``-d`` argument to specify the
2139 current directory, a file name to patch, and a patch file to take
2161 current directory, a file name to patch, and a patch file to take
2140 from stdin.
2162 from stdin.
2141
2163
2142 It is possible to specify a patch tool together with extra
2164 It is possible to specify a patch tool together with extra
2143 arguments. For example, setting this option to ``patch --merge``
2165 arguments. For example, setting this option to ``patch --merge``
2144 will use the ``patch`` program with its 2-way merge option.
2166 will use the ``patch`` program with its 2-way merge option.
2145
2167
2146 ``portablefilenames``
2168 ``portablefilenames``
2147 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
2169 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
2148 (default: ``warn``)
2170 (default: ``warn``)
2149
2171
2150 ``warn``
2172 ``warn``
2151 Print a warning message on POSIX platforms, if a file with a non-portable
2173 Print a warning message on POSIX platforms, if a file with a non-portable
2152 filename is added (e.g. a file with a name that can't be created on
2174 filename is added (e.g. a file with a name that can't be created on
2153 Windows because it contains reserved parts like ``AUX``, reserved
2175 Windows because it contains reserved parts like ``AUX``, reserved
2154 characters like ``:``, or would cause a case collision with an existing
2176 characters like ``:``, or would cause a case collision with an existing
2155 file).
2177 file).
2156
2178
2157 ``ignore``
2179 ``ignore``
2158 Don't print a warning.
2180 Don't print a warning.
2159
2181
2160 ``abort``
2182 ``abort``
2161 The command is aborted.
2183 The command is aborted.
2162
2184
2163 ``true``
2185 ``true``
2164 Alias for ``warn``.
2186 Alias for ``warn``.
2165
2187
2166 ``false``
2188 ``false``
2167 Alias for ``ignore``.
2189 Alias for ``ignore``.
2168
2190
2169 .. container:: windows
2191 .. container:: windows
2170
2192
2171 On Windows, this configuration option is ignored and the command aborted.
2193 On Windows, this configuration option is ignored and the command aborted.
2172
2194
2173 ``quiet``
2195 ``quiet``
2174 Reduce the amount of output printed.
2196 Reduce the amount of output printed.
2175 (default: False)
2197 (default: False)
2176
2198
2177 ``remotecmd``
2199 ``remotecmd``
2178 Remote command to use for clone/push/pull operations.
2200 Remote command to use for clone/push/pull operations.
2179 (default: ``hg``)
2201 (default: ``hg``)
2180
2202
2181 ``report_untrusted``
2203 ``report_untrusted``
2182 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
2204 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
2183 trusted user or group.
2205 trusted user or group.
2184 (default: True)
2206 (default: True)
2185
2207
2186 ``slash``
2208 ``slash``
2187 (Deprecated. Use ``slashpath`` template filter instead.)
2209 (Deprecated. Use ``slashpath`` template filter instead.)
2188
2210
2189 Display paths using a slash (``/``) as the path separator. This
2211 Display paths using a slash (``/``) as the path separator. This
2190 only makes a difference on systems where the default path
2212 only makes a difference on systems where the default path
2191 separator is not the slash character (e.g. Windows uses the
2213 separator is not the slash character (e.g. Windows uses the
2192 backslash character (``\``)).
2214 backslash character (``\``)).
2193 (default: False)
2215 (default: False)
2194
2216
2195 ``statuscopies``
2217 ``statuscopies``
2196 Display copies in the status command.
2218 Display copies in the status command.
2197
2219
2198 ``ssh``
2220 ``ssh``
2199 Command to use for SSH connections. (default: ``ssh``)
2221 Command to use for SSH connections. (default: ``ssh``)
2200
2222
2201 ``ssherrorhint``
2223 ``ssherrorhint``
2202 A hint shown to the user in the case of SSH error (e.g.
2224 A hint shown to the user in the case of SSH error (e.g.
2203 ``Please see http://company/internalwiki/ssh.html``)
2225 ``Please see http://company/internalwiki/ssh.html``)
2204
2226
2205 ``strict``
2227 ``strict``
2206 Require exact command names, instead of allowing unambiguous
2228 Require exact command names, instead of allowing unambiguous
2207 abbreviations. (default: False)
2229 abbreviations. (default: False)
2208
2230
2209 ``style``
2231 ``style``
2210 Name of style to use for command output.
2232 Name of style to use for command output.
2211
2233
2212 ``supportcontact``
2234 ``supportcontact``
2213 A URL where users should report a Mercurial traceback. Use this if you are a
2235 A URL where users should report a Mercurial traceback. Use this if you are a
2214 large organisation with its own Mercurial deployment process and crash
2236 large organisation with its own Mercurial deployment process and crash
2215 reports should be addressed to your internal support.
2237 reports should be addressed to your internal support.
2216
2238
2217 ``textwidth``
2239 ``textwidth``
2218 Maximum width of help text. A longer line generated by ``hg help`` or
2240 Maximum width of help text. A longer line generated by ``hg help`` or
2219 ``hg subcommand --help`` will be broken after white space to get this
2241 ``hg subcommand --help`` will be broken after white space to get this
2220 width or the terminal width, whichever comes first.
2242 width or the terminal width, whichever comes first.
2221 A non-positive value will disable this and the terminal width will be
2243 A non-positive value will disable this and the terminal width will be
2222 used. (default: 78)
2244 used. (default: 78)
2223
2245
2224 ``timeout``
2246 ``timeout``
2225 The timeout used when a lock is held (in seconds), a negative value
2247 The timeout used when a lock is held (in seconds), a negative value
2226 means no timeout. (default: 600)
2248 means no timeout. (default: 600)
2227
2249
2228 ``timeout.warn``
2250 ``timeout.warn``
2229 Time (in seconds) before a warning is printed about held lock. A negative
2251 Time (in seconds) before a warning is printed about held lock. A negative
2230 value means no warning. (default: 0)
2252 value means no warning. (default: 0)
2231
2253
2232 ``traceback``
2254 ``traceback``
2233 Mercurial always prints a traceback when an unknown exception
2255 Mercurial always prints a traceback when an unknown exception
2234 occurs. Setting this to True will make Mercurial print a traceback
2256 occurs. Setting this to True will make Mercurial print a traceback
2235 on all exceptions, even those recognized by Mercurial (such as
2257 on all exceptions, even those recognized by Mercurial (such as
2236 IOError or MemoryError). (default: False)
2258 IOError or MemoryError). (default: False)
2237
2259
2238 ``tweakdefaults``
2260 ``tweakdefaults``
2239
2261
2240 By default Mercurial's behavior changes very little from release
2262 By default Mercurial's behavior changes very little from release
2241 to release, but over time the recommended config settings
2263 to release, but over time the recommended config settings
2242 shift. Enable this config to opt in to get automatic tweaks to
2264 shift. Enable this config to opt in to get automatic tweaks to
2243 Mercurial's behavior over time. This config setting will have no
2265 Mercurial's behavior over time. This config setting will have no
2244 effet if ``HGPLAIN` is set or ``HGPLAINEXCEPT`` is set and does
2266 effet if ``HGPLAIN` is set or ``HGPLAINEXCEPT`` is set and does
2245 not include ``tweakdefaults``. (default: False)
2267 not include ``tweakdefaults``. (default: False)
2246
2268
2247 ``username``
2269 ``username``
2248 The committer of a changeset created when running "commit".
2270 The committer of a changeset created when running "commit".
2249 Typically a person's name and email address, e.g. ``Fred Widget
2271 Typically a person's name and email address, e.g. ``Fred Widget
2250 <fred@example.com>``. Environment variables in the
2272 <fred@example.com>``. Environment variables in the
2251 username are expanded.
2273 username are expanded.
2252
2274
2253 (default: ``$EMAIL`` or ``username@hostname``. If the username in
2275 (default: ``$EMAIL`` or ``username@hostname``. If the username in
2254 hgrc is empty, e.g. if the system admin set ``username =`` in the
2276 hgrc is empty, e.g. if the system admin set ``username =`` in the
2255 system hgrc, it has to be specified manually or in a different
2277 system hgrc, it has to be specified manually or in a different
2256 hgrc file)
2278 hgrc file)
2257
2279
2258 ``verbose``
2280 ``verbose``
2259 Increase the amount of output printed. (default: False)
2281 Increase the amount of output printed. (default: False)
2260
2282
2261
2283
2262 ``web``
2284 ``web``
2263 -------
2285 -------
2264
2286
2265 Web interface configuration. The settings in this section apply to
2287 Web interface configuration. The settings in this section apply to
2266 both the builtin webserver (started by :hg:`serve`) and the script you
2288 both the builtin webserver (started by :hg:`serve`) and the script you
2267 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
2289 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
2268 and WSGI).
2290 and WSGI).
2269
2291
2270 The Mercurial webserver does no authentication (it does not prompt for
2292 The Mercurial webserver does no authentication (it does not prompt for
2271 usernames and passwords to validate *who* users are), but it does do
2293 usernames and passwords to validate *who* users are), but it does do
2272 authorization (it grants or denies access for *authenticated users*
2294 authorization (it grants or denies access for *authenticated users*
2273 based on settings in this section). You must either configure your
2295 based on settings in this section). You must either configure your
2274 webserver to do authentication for you, or disable the authorization
2296 webserver to do authentication for you, or disable the authorization
2275 checks.
2297 checks.
2276
2298
2277 For a quick setup in a trusted environment, e.g., a private LAN, where
2299 For a quick setup in a trusted environment, e.g., a private LAN, where
2278 you want it to accept pushes from anybody, you can use the following
2300 you want it to accept pushes from anybody, you can use the following
2279 command line::
2301 command line::
2280
2302
2281 $ hg --config web.allow-push=* --config web.push_ssl=False serve
2303 $ hg --config web.allow-push=* --config web.push_ssl=False serve
2282
2304
2283 Note that this will allow anybody to push anything to the server and
2305 Note that this will allow anybody to push anything to the server and
2284 that this should not be used for public servers.
2306 that this should not be used for public servers.
2285
2307
2286 The full set of options is:
2308 The full set of options is:
2287
2309
2288 ``accesslog``
2310 ``accesslog``
2289 Where to output the access log. (default: stdout)
2311 Where to output the access log. (default: stdout)
2290
2312
2291 ``address``
2313 ``address``
2292 Interface address to bind to. (default: all)
2314 Interface address to bind to. (default: all)
2293
2315
2294 ``allow_archive``
2316 ``allow_archive``
2295 List of archive format (bz2, gz, zip) allowed for downloading.
2317 List of archive format (bz2, gz, zip) allowed for downloading.
2296 (default: empty)
2318 (default: empty)
2297
2319
2298 ``allowbz2``
2320 ``allowbz2``
2299 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
2321 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
2300 revisions.
2322 revisions.
2301 (default: False)
2323 (default: False)
2302
2324
2303 ``allowgz``
2325 ``allowgz``
2304 (DEPRECATED) Whether to allow .tar.gz downloading of repository
2326 (DEPRECATED) Whether to allow .tar.gz downloading of repository
2305 revisions.
2327 revisions.
2306 (default: False)
2328 (default: False)
2307
2329
2308 ``allow-pull``
2330 ``allow-pull``
2309 Whether to allow pulling from the repository. (default: True)
2331 Whether to allow pulling from the repository. (default: True)
2310
2332
2311 ``allow-push``
2333 ``allow-push``
2312 Whether to allow pushing to the repository. If empty or not set,
2334 Whether to allow pushing to the repository. If empty or not set,
2313 pushing is not allowed. If the special value ``*``, any remote
2335 pushing is not allowed. If the special value ``*``, any remote
2314 user can push, including unauthenticated users. Otherwise, the
2336 user can push, including unauthenticated users. Otherwise, the
2315 remote user must have been authenticated, and the authenticated
2337 remote user must have been authenticated, and the authenticated
2316 user name must be present in this list. The contents of the
2338 user name must be present in this list. The contents of the
2317 allow-push list are examined after the deny_push list.
2339 allow-push list are examined after the deny_push list.
2318
2340
2319 ``allow_read``
2341 ``allow_read``
2320 If the user has not already been denied repository access due to
2342 If the user has not already been denied repository access due to
2321 the contents of deny_read, this list determines whether to grant
2343 the contents of deny_read, this list determines whether to grant
2322 repository access to the user. If this list is not empty, and the
2344 repository access to the user. If this list is not empty, and the
2323 user is unauthenticated or not present in the list, then access is
2345 user is unauthenticated or not present in the list, then access is
2324 denied for the user. If the list is empty or not set, then access
2346 denied for the user. If the list is empty or not set, then access
2325 is permitted to all users by default. Setting allow_read to the
2347 is permitted to all users by default. Setting allow_read to the
2326 special value ``*`` is equivalent to it not being set (i.e. access
2348 special value ``*`` is equivalent to it not being set (i.e. access
2327 is permitted to all users). The contents of the allow_read list are
2349 is permitted to all users). The contents of the allow_read list are
2328 examined after the deny_read list.
2350 examined after the deny_read list.
2329
2351
2330 ``allowzip``
2352 ``allowzip``
2331 (DEPRECATED) Whether to allow .zip downloading of repository
2353 (DEPRECATED) Whether to allow .zip downloading of repository
2332 revisions. This feature creates temporary files.
2354 revisions. This feature creates temporary files.
2333 (default: False)
2355 (default: False)
2334
2356
2335 ``archivesubrepos``
2357 ``archivesubrepos``
2336 Whether to recurse into subrepositories when archiving.
2358 Whether to recurse into subrepositories when archiving.
2337 (default: False)
2359 (default: False)
2338
2360
2339 ``baseurl``
2361 ``baseurl``
2340 Base URL to use when publishing URLs in other locations, so
2362 Base URL to use when publishing URLs in other locations, so
2341 third-party tools like email notification hooks can construct
2363 third-party tools like email notification hooks can construct
2342 URLs. Example: ``http://hgserver/repos/``.
2364 URLs. Example: ``http://hgserver/repos/``.
2343
2365
2344 ``cacerts``
2366 ``cacerts``
2345 Path to file containing a list of PEM encoded certificate
2367 Path to file containing a list of PEM encoded certificate
2346 authority certificates. Environment variables and ``~user``
2368 authority certificates. Environment variables and ``~user``
2347 constructs are expanded in the filename. If specified on the
2369 constructs are expanded in the filename. If specified on the
2348 client, then it will verify the identity of remote HTTPS servers
2370 client, then it will verify the identity of remote HTTPS servers
2349 with these certificates.
2371 with these certificates.
2350
2372
2351 To disable SSL verification temporarily, specify ``--insecure`` from
2373 To disable SSL verification temporarily, specify ``--insecure`` from
2352 command line.
2374 command line.
2353
2375
2354 You can use OpenSSL's CA certificate file if your platform has
2376 You can use OpenSSL's CA certificate file if your platform has
2355 one. On most Linux systems this will be
2377 one. On most Linux systems this will be
2356 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
2378 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
2357 generate this file manually. The form must be as follows::
2379 generate this file manually. The form must be as follows::
2358
2380
2359 -----BEGIN CERTIFICATE-----
2381 -----BEGIN CERTIFICATE-----
2360 ... (certificate in base64 PEM encoding) ...
2382 ... (certificate in base64 PEM encoding) ...
2361 -----END CERTIFICATE-----
2383 -----END CERTIFICATE-----
2362 -----BEGIN CERTIFICATE-----
2384 -----BEGIN CERTIFICATE-----
2363 ... (certificate in base64 PEM encoding) ...
2385 ... (certificate in base64 PEM encoding) ...
2364 -----END CERTIFICATE-----
2386 -----END CERTIFICATE-----
2365
2387
2366 ``cache``
2388 ``cache``
2367 Whether to support caching in hgweb. (default: True)
2389 Whether to support caching in hgweb. (default: True)
2368
2390
2369 ``certificate``
2391 ``certificate``
2370 Certificate to use when running :hg:`serve`.
2392 Certificate to use when running :hg:`serve`.
2371
2393
2372 ``collapse``
2394 ``collapse``
2373 With ``descend`` enabled, repositories in subdirectories are shown at
2395 With ``descend`` enabled, repositories in subdirectories are shown at
2374 a single level alongside repositories in the current path. With
2396 a single level alongside repositories in the current path. With
2375 ``collapse`` also enabled, repositories residing at a deeper level than
2397 ``collapse`` also enabled, repositories residing at a deeper level than
2376 the current path are grouped behind navigable directory entries that
2398 the current path are grouped behind navigable directory entries that
2377 lead to the locations of these repositories. In effect, this setting
2399 lead to the locations of these repositories. In effect, this setting
2378 collapses each collection of repositories found within a subdirectory
2400 collapses each collection of repositories found within a subdirectory
2379 into a single entry for that subdirectory. (default: False)
2401 into a single entry for that subdirectory. (default: False)
2380
2402
2381 ``comparisoncontext``
2403 ``comparisoncontext``
2382 Number of lines of context to show in side-by-side file comparison. If
2404 Number of lines of context to show in side-by-side file comparison. If
2383 negative or the value ``full``, whole files are shown. (default: 5)
2405 negative or the value ``full``, whole files are shown. (default: 5)
2384
2406
2385 This setting can be overridden by a ``context`` request parameter to the
2407 This setting can be overridden by a ``context`` request parameter to the
2386 ``comparison`` command, taking the same values.
2408 ``comparison`` command, taking the same values.
2387
2409
2388 ``contact``
2410 ``contact``
2389 Name or email address of the person in charge of the repository.
2411 Name or email address of the person in charge of the repository.
2390 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
2412 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
2391
2413
2392 ``csp``
2414 ``csp``
2393 Send a ``Content-Security-Policy`` HTTP header with this value.
2415 Send a ``Content-Security-Policy`` HTTP header with this value.
2394
2416
2395 The value may contain a special string ``%nonce%``, which will be replaced
2417 The value may contain a special string ``%nonce%``, which will be replaced
2396 by a randomly-generated one-time use value. If the value contains
2418 by a randomly-generated one-time use value. If the value contains
2397 ``%nonce%``, ``web.cache`` will be disabled, as caching undermines the
2419 ``%nonce%``, ``web.cache`` will be disabled, as caching undermines the
2398 one-time property of the nonce. This nonce will also be inserted into
2420 one-time property of the nonce. This nonce will also be inserted into
2399 ``<script>`` elements containing inline JavaScript.
2421 ``<script>`` elements containing inline JavaScript.
2400
2422
2401 Note: lots of HTML content sent by the server is derived from repository
2423 Note: lots of HTML content sent by the server is derived from repository
2402 data. Please consider the potential for malicious repository data to
2424 data. Please consider the potential for malicious repository data to
2403 "inject" itself into generated HTML content as part of your security
2425 "inject" itself into generated HTML content as part of your security
2404 threat model.
2426 threat model.
2405
2427
2406 ``deny_push``
2428 ``deny_push``
2407 Whether to deny pushing to the repository. If empty or not set,
2429 Whether to deny pushing to the repository. If empty or not set,
2408 push is not denied. If the special value ``*``, all remote users are
2430 push is not denied. If the special value ``*``, all remote users are
2409 denied push. Otherwise, unauthenticated users are all denied, and
2431 denied push. Otherwise, unauthenticated users are all denied, and
2410 any authenticated user name present in this list is also denied. The
2432 any authenticated user name present in this list is also denied. The
2411 contents of the deny_push list are examined before the allow-push list.
2433 contents of the deny_push list are examined before the allow-push list.
2412
2434
2413 ``deny_read``
2435 ``deny_read``
2414 Whether to deny reading/viewing of the repository. If this list is
2436 Whether to deny reading/viewing of the repository. If this list is
2415 not empty, unauthenticated users are all denied, and any
2437 not empty, unauthenticated users are all denied, and any
2416 authenticated user name present in this list is also denied access to
2438 authenticated user name present in this list is also denied access to
2417 the repository. If set to the special value ``*``, all remote users
2439 the repository. If set to the special value ``*``, all remote users
2418 are denied access (rarely needed ;). If deny_read is empty or not set,
2440 are denied access (rarely needed ;). If deny_read is empty or not set,
2419 the determination of repository access depends on the presence and
2441 the determination of repository access depends on the presence and
2420 content of the allow_read list (see description). If both
2442 content of the allow_read list (see description). If both
2421 deny_read and allow_read are empty or not set, then access is
2443 deny_read and allow_read are empty or not set, then access is
2422 permitted to all users by default. If the repository is being
2444 permitted to all users by default. If the repository is being
2423 served via hgwebdir, denied users will not be able to see it in
2445 served via hgwebdir, denied users will not be able to see it in
2424 the list of repositories. The contents of the deny_read list have
2446 the list of repositories. The contents of the deny_read list have
2425 priority over (are examined before) the contents of the allow_read
2447 priority over (are examined before) the contents of the allow_read
2426 list.
2448 list.
2427
2449
2428 ``descend``
2450 ``descend``
2429 hgwebdir indexes will not descend into subdirectories. Only repositories
2451 hgwebdir indexes will not descend into subdirectories. Only repositories
2430 directly in the current path will be shown (other repositories are still
2452 directly in the current path will be shown (other repositories are still
2431 available from the index corresponding to their containing path).
2453 available from the index corresponding to their containing path).
2432
2454
2433 ``description``
2455 ``description``
2434 Textual description of the repository's purpose or contents.
2456 Textual description of the repository's purpose or contents.
2435 (default: "unknown")
2457 (default: "unknown")
2436
2458
2437 ``encoding``
2459 ``encoding``
2438 Character encoding name. (default: the current locale charset)
2460 Character encoding name. (default: the current locale charset)
2439 Example: "UTF-8".
2461 Example: "UTF-8".
2440
2462
2441 ``errorlog``
2463 ``errorlog``
2442 Where to output the error log. (default: stderr)
2464 Where to output the error log. (default: stderr)
2443
2465
2444 ``guessmime``
2466 ``guessmime``
2445 Control MIME types for raw download of file content.
2467 Control MIME types for raw download of file content.
2446 Set to True to let hgweb guess the content type from the file
2468 Set to True to let hgweb guess the content type from the file
2447 extension. This will serve HTML files as ``text/html`` and might
2469 extension. This will serve HTML files as ``text/html`` and might
2448 allow cross-site scripting attacks when serving untrusted
2470 allow cross-site scripting attacks when serving untrusted
2449 repositories. (default: False)
2471 repositories. (default: False)
2450
2472
2451 ``hidden``
2473 ``hidden``
2452 Whether to hide the repository in the hgwebdir index.
2474 Whether to hide the repository in the hgwebdir index.
2453 (default: False)
2475 (default: False)
2454
2476
2455 ``ipv6``
2477 ``ipv6``
2456 Whether to use IPv6. (default: False)
2478 Whether to use IPv6. (default: False)
2457
2479
2458 ``labels``
2480 ``labels``
2459 List of string *labels* associated with the repository.
2481 List of string *labels* associated with the repository.
2460
2482
2461 Labels are exposed as a template keyword and can be used to customize
2483 Labels are exposed as a template keyword and can be used to customize
2462 output. e.g. the ``index`` template can group or filter repositories
2484 output. e.g. the ``index`` template can group or filter repositories
2463 by labels and the ``summary`` template can display additional content
2485 by labels and the ``summary`` template can display additional content
2464 if a specific label is present.
2486 if a specific label is present.
2465
2487
2466 ``logoimg``
2488 ``logoimg``
2467 File name of the logo image that some templates display on each page.
2489 File name of the logo image that some templates display on each page.
2468 The file name is relative to ``staticurl``. That is, the full path to
2490 The file name is relative to ``staticurl``. That is, the full path to
2469 the logo image is "staticurl/logoimg".
2491 the logo image is "staticurl/logoimg".
2470 If unset, ``hglogo.png`` will be used.
2492 If unset, ``hglogo.png`` will be used.
2471
2493
2472 ``logourl``
2494 ``logourl``
2473 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
2495 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
2474 will be used.
2496 will be used.
2475
2497
2476 ``maxchanges``
2498 ``maxchanges``
2477 Maximum number of changes to list on the changelog. (default: 10)
2499 Maximum number of changes to list on the changelog. (default: 10)
2478
2500
2479 ``maxfiles``
2501 ``maxfiles``
2480 Maximum number of files to list per changeset. (default: 10)
2502 Maximum number of files to list per changeset. (default: 10)
2481
2503
2482 ``maxshortchanges``
2504 ``maxshortchanges``
2483 Maximum number of changes to list on the shortlog, graph or filelog
2505 Maximum number of changes to list on the shortlog, graph or filelog
2484 pages. (default: 60)
2506 pages. (default: 60)
2485
2507
2486 ``name``
2508 ``name``
2487 Repository name to use in the web interface.
2509 Repository name to use in the web interface.
2488 (default: current working directory)
2510 (default: current working directory)
2489
2511
2490 ``port``
2512 ``port``
2491 Port to listen on. (default: 8000)
2513 Port to listen on. (default: 8000)
2492
2514
2493 ``prefix``
2515 ``prefix``
2494 Prefix path to serve from. (default: '' (server root))
2516 Prefix path to serve from. (default: '' (server root))
2495
2517
2496 ``push_ssl``
2518 ``push_ssl``
2497 Whether to require that inbound pushes be transported over SSL to
2519 Whether to require that inbound pushes be transported over SSL to
2498 prevent password sniffing. (default: True)
2520 prevent password sniffing. (default: True)
2499
2521
2500 ``refreshinterval``
2522 ``refreshinterval``
2501 How frequently directory listings re-scan the filesystem for new
2523 How frequently directory listings re-scan the filesystem for new
2502 repositories, in seconds. This is relevant when wildcards are used
2524 repositories, in seconds. This is relevant when wildcards are used
2503 to define paths. Depending on how much filesystem traversal is
2525 to define paths. Depending on how much filesystem traversal is
2504 required, refreshing may negatively impact performance.
2526 required, refreshing may negatively impact performance.
2505
2527
2506 Values less than or equal to 0 always refresh.
2528 Values less than or equal to 0 always refresh.
2507 (default: 20)
2529 (default: 20)
2508
2530
2509 ``staticurl``
2531 ``staticurl``
2510 Base URL to use for static files. If unset, static files (e.g. the
2532 Base URL to use for static files. If unset, static files (e.g. the
2511 hgicon.png favicon) will be served by the CGI script itself. Use
2533 hgicon.png favicon) will be served by the CGI script itself. Use
2512 this setting to serve them directly with the HTTP server.
2534 this setting to serve them directly with the HTTP server.
2513 Example: ``http://hgserver/static/``.
2535 Example: ``http://hgserver/static/``.
2514
2536
2515 ``stripes``
2537 ``stripes``
2516 How many lines a "zebra stripe" should span in multi-line output.
2538 How many lines a "zebra stripe" should span in multi-line output.
2517 Set to 0 to disable. (default: 1)
2539 Set to 0 to disable. (default: 1)
2518
2540
2519 ``style``
2541 ``style``
2520 Which template map style to use. The available options are the names of
2542 Which template map style to use. The available options are the names of
2521 subdirectories in the HTML templates path. (default: ``paper``)
2543 subdirectories in the HTML templates path. (default: ``paper``)
2522 Example: ``monoblue``.
2544 Example: ``monoblue``.
2523
2545
2524 ``templates``
2546 ``templates``
2525 Where to find the HTML templates. The default path to the HTML templates
2547 Where to find the HTML templates. The default path to the HTML templates
2526 can be obtained from ``hg debuginstall``.
2548 can be obtained from ``hg debuginstall``.
2527
2549
2528 ``websub``
2550 ``websub``
2529 ----------
2551 ----------
2530
2552
2531 Web substitution filter definition. You can use this section to
2553 Web substitution filter definition. You can use this section to
2532 define a set of regular expression substitution patterns which
2554 define a set of regular expression substitution patterns which
2533 let you automatically modify the hgweb server output.
2555 let you automatically modify the hgweb server output.
2534
2556
2535 The default hgweb templates only apply these substitution patterns
2557 The default hgweb templates only apply these substitution patterns
2536 on the revision description fields. You can apply them anywhere
2558 on the revision description fields. You can apply them anywhere
2537 you want when you create your own templates by adding calls to the
2559 you want when you create your own templates by adding calls to the
2538 "websub" filter (usually after calling the "escape" filter).
2560 "websub" filter (usually after calling the "escape" filter).
2539
2561
2540 This can be used, for example, to convert issue references to links
2562 This can be used, for example, to convert issue references to links
2541 to your issue tracker, or to convert "markdown-like" syntax into
2563 to your issue tracker, or to convert "markdown-like" syntax into
2542 HTML (see the examples below).
2564 HTML (see the examples below).
2543
2565
2544 Each entry in this section names a substitution filter.
2566 Each entry in this section names a substitution filter.
2545 The value of each entry defines the substitution expression itself.
2567 The value of each entry defines the substitution expression itself.
2546 The websub expressions follow the old interhg extension syntax,
2568 The websub expressions follow the old interhg extension syntax,
2547 which in turn imitates the Unix sed replacement syntax::
2569 which in turn imitates the Unix sed replacement syntax::
2548
2570
2549 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
2571 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
2550
2572
2551 You can use any separator other than "/". The final "i" is optional
2573 You can use any separator other than "/". The final "i" is optional
2552 and indicates that the search must be case insensitive.
2574 and indicates that the search must be case insensitive.
2553
2575
2554 Examples::
2576 Examples::
2555
2577
2556 [websub]
2578 [websub]
2557 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
2579 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
2558 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
2580 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
2559 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
2581 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
2560
2582
2561 ``worker``
2583 ``worker``
2562 ----------
2584 ----------
2563
2585
2564 Parallel master/worker configuration. We currently perform working
2586 Parallel master/worker configuration. We currently perform working
2565 directory updates in parallel on Unix-like systems, which greatly
2587 directory updates in parallel on Unix-like systems, which greatly
2566 helps performance.
2588 helps performance.
2567
2589
2568 ``enabled``
2590 ``enabled``
2569 Whether to enable workers code to be used.
2591 Whether to enable workers code to be used.
2570 (default: true)
2592 (default: true)
2571
2593
2572 ``numcpus``
2594 ``numcpus``
2573 Number of CPUs to use for parallel operations. A zero or
2595 Number of CPUs to use for parallel operations. A zero or
2574 negative value is treated as ``use the default``.
2596 negative value is treated as ``use the default``.
2575 (default: 4 or the number of CPUs on the system, whichever is larger)
2597 (default: 4 or the number of CPUs on the system, whichever is larger)
2576
2598
2577 ``backgroundclose``
2599 ``backgroundclose``
2578 Whether to enable closing file handles on background threads during certain
2600 Whether to enable closing file handles on background threads during certain
2579 operations. Some platforms aren't very efficient at closing file
2601 operations. Some platforms aren't very efficient at closing file
2580 handles that have been written or appended to. By performing file closing
2602 handles that have been written or appended to. By performing file closing
2581 on background threads, file write rate can increase substantially.
2603 on background threads, file write rate can increase substantially.
2582 (default: true on Windows, false elsewhere)
2604 (default: true on Windows, false elsewhere)
2583
2605
2584 ``backgroundcloseminfilecount``
2606 ``backgroundcloseminfilecount``
2585 Minimum number of files required to trigger background file closing.
2607 Minimum number of files required to trigger background file closing.
2586 Operations not writing this many files won't start background close
2608 Operations not writing this many files won't start background close
2587 threads.
2609 threads.
2588 (default: 2048)
2610 (default: 2048)
2589
2611
2590 ``backgroundclosemaxqueue``
2612 ``backgroundclosemaxqueue``
2591 The maximum number of opened file handles waiting to be closed in the
2613 The maximum number of opened file handles waiting to be closed in the
2592 background. This option only has an effect if ``backgroundclose`` is
2614 background. This option only has an effect if ``backgroundclose`` is
2593 enabled.
2615 enabled.
2594 (default: 384)
2616 (default: 384)
2595
2617
2596 ``backgroundclosethreadcount``
2618 ``backgroundclosethreadcount``
2597 Number of threads to process background file closes. Only relevant if
2619 Number of threads to process background file closes. Only relevant if
2598 ``backgroundclose`` is enabled.
2620 ``backgroundclose`` is enabled.
2599 (default: 4)
2621 (default: 4)
@@ -1,1348 +1,1628 b''
1 test merge-tools configuration - mostly exercising filemerge.py
1 test merge-tools configuration - mostly exercising filemerge.py
2
2
3 $ unset HGMERGE # make sure HGMERGE doesn't interfere with the test
3 $ unset HGMERGE # make sure HGMERGE doesn't interfere with the test
4 $ hg init
4 $ hg init
5
5
6 revision 0
6 revision 0
7
7
8 $ echo "revision 0" > f
8 $ echo "revision 0" > f
9 $ echo "space" >> f
9 $ echo "space" >> f
10 $ hg commit -Am "revision 0"
10 $ hg commit -Am "revision 0"
11 adding f
11 adding f
12
12
13 revision 1
13 revision 1
14
14
15 $ echo "revision 1" > f
15 $ echo "revision 1" > f
16 $ echo "space" >> f
16 $ echo "space" >> f
17 $ hg commit -Am "revision 1"
17 $ hg commit -Am "revision 1"
18 $ hg update 0 > /dev/null
18 $ hg update 0 > /dev/null
19
19
20 revision 2
20 revision 2
21
21
22 $ echo "revision 2" > f
22 $ echo "revision 2" > f
23 $ echo "space" >> f
23 $ echo "space" >> f
24 $ hg commit -Am "revision 2"
24 $ hg commit -Am "revision 2"
25 created new head
25 created new head
26 $ hg update 0 > /dev/null
26 $ hg update 0 > /dev/null
27
27
28 revision 3 - simple to merge
28 revision 3 - simple to merge
29
29
30 $ echo "revision 3" >> f
30 $ echo "revision 3" >> f
31 $ hg commit -Am "revision 3"
31 $ hg commit -Am "revision 3"
32 created new head
32 created new head
33
33
34 revision 4 - hard to merge
34 revision 4 - hard to merge
35
35
36 $ hg update 0 > /dev/null
36 $ hg update 0 > /dev/null
37 $ echo "revision 4" > f
37 $ echo "revision 4" > f
38 $ hg commit -Am "revision 4"
38 $ hg commit -Am "revision 4"
39 created new head
39 created new head
40
40
41 $ echo "[merge-tools]" > .hg/hgrc
41 $ echo "[merge-tools]" > .hg/hgrc
42
42
43 $ beforemerge() {
43 $ beforemerge() {
44 > cat .hg/hgrc
44 > cat .hg/hgrc
45 > echo "# hg update -C 1"
45 > echo "# hg update -C 1"
46 > hg update -C 1 > /dev/null
46 > hg update -C 1 > /dev/null
47 > }
47 > }
48 $ aftermerge() {
48 $ aftermerge() {
49 > echo "# cat f"
49 > echo "# cat f"
50 > cat f
50 > cat f
51 > echo "# hg stat"
51 > echo "# hg stat"
52 > hg stat
52 > hg stat
53 > echo "# hg resolve --list"
53 > echo "# hg resolve --list"
54 > hg resolve --list
54 > hg resolve --list
55 > rm -f f.orig
55 > rm -f f.orig
56 > }
56 > }
57
57
58 Tool selection
58 Tool selection
59
59
60 default is internal merge:
60 default is internal merge:
61
61
62 $ beforemerge
62 $ beforemerge
63 [merge-tools]
63 [merge-tools]
64 # hg update -C 1
64 # hg update -C 1
65
65
66 hg merge -r 2
66 hg merge -r 2
67 override $PATH to ensure hgmerge not visible; use $PYTHON in case we're
67 override $PATH to ensure hgmerge not visible; use $PYTHON in case we're
68 running from a devel copy, not a temp installation
68 running from a devel copy, not a temp installation
69
69
70 $ PATH="$BINDIR:/usr/sbin" $PYTHON "$BINDIR"/hg merge -r 2
70 $ PATH="$BINDIR:/usr/sbin" $PYTHON "$BINDIR"/hg merge -r 2
71 merging f
71 merging f
72 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
72 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
73 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
73 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
74 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
74 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
75 [1]
75 [1]
76 $ aftermerge
76 $ aftermerge
77 # cat f
77 # cat f
78 <<<<<<< working copy: ef83787e2614 - test: revision 1
78 <<<<<<< working copy: ef83787e2614 - test: revision 1
79 revision 1
79 revision 1
80 =======
80 =======
81 revision 2
81 revision 2
82 >>>>>>> merge rev: 0185f4e0cf02 - test: revision 2
82 >>>>>>> merge rev: 0185f4e0cf02 - test: revision 2
83 space
83 space
84 # hg stat
84 # hg stat
85 M f
85 M f
86 ? f.orig
86 ? f.orig
87 # hg resolve --list
87 # hg resolve --list
88 U f
88 U f
89
89
90 simplest hgrc using false for merge:
90 simplest hgrc using false for merge:
91
91
92 $ echo "false.whatever=" >> .hg/hgrc
92 $ echo "false.whatever=" >> .hg/hgrc
93 $ beforemerge
93 $ beforemerge
94 [merge-tools]
94 [merge-tools]
95 false.whatever=
95 false.whatever=
96 # hg update -C 1
96 # hg update -C 1
97 $ hg merge -r 2
97 $ hg merge -r 2
98 merging f
98 merging f
99 merging f failed!
99 merging f failed!
100 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
100 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
101 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
101 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
102 [1]
102 [1]
103 $ aftermerge
103 $ aftermerge
104 # cat f
104 # cat f
105 revision 1
105 revision 1
106 space
106 space
107 # hg stat
107 # hg stat
108 M f
108 M f
109 ? f.orig
109 ? f.orig
110 # hg resolve --list
110 # hg resolve --list
111 U f
111 U f
112
112
113 #if unix-permissions
113 #if unix-permissions
114
114
115 unexecutable file in $PATH shouldn't be found:
115 unexecutable file in $PATH shouldn't be found:
116
116
117 $ echo "echo fail" > false
117 $ echo "echo fail" > false
118 $ hg up -qC 1
118 $ hg up -qC 1
119 $ PATH="`pwd`:$BINDIR:/usr/sbin" $PYTHON "$BINDIR"/hg merge -r 2
119 $ PATH="`pwd`:$BINDIR:/usr/sbin" $PYTHON "$BINDIR"/hg merge -r 2
120 merging f
120 merging f
121 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
121 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
122 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
122 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
123 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
123 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
124 [1]
124 [1]
125 $ rm false
125 $ rm false
126
126
127 #endif
127 #endif
128
128
129 executable directory in $PATH shouldn't be found:
129 executable directory in $PATH shouldn't be found:
130
130
131 $ mkdir false
131 $ mkdir false
132 $ hg up -qC 1
132 $ hg up -qC 1
133 $ PATH="`pwd`:$BINDIR:/usr/sbin" $PYTHON "$BINDIR"/hg merge -r 2
133 $ PATH="`pwd`:$BINDIR:/usr/sbin" $PYTHON "$BINDIR"/hg merge -r 2
134 merging f
134 merging f
135 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
135 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
136 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
136 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
137 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
137 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
138 [1]
138 [1]
139 $ rmdir false
139 $ rmdir false
140
140
141 true with higher .priority gets precedence:
141 true with higher .priority gets precedence:
142
142
143 $ echo "true.priority=1" >> .hg/hgrc
143 $ echo "true.priority=1" >> .hg/hgrc
144 $ beforemerge
144 $ beforemerge
145 [merge-tools]
145 [merge-tools]
146 false.whatever=
146 false.whatever=
147 true.priority=1
147 true.priority=1
148 # hg update -C 1
148 # hg update -C 1
149 $ hg merge -r 2
149 $ hg merge -r 2
150 merging f
150 merging f
151 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
151 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
152 (branch merge, don't forget to commit)
152 (branch merge, don't forget to commit)
153 $ aftermerge
153 $ aftermerge
154 # cat f
154 # cat f
155 revision 1
155 revision 1
156 space
156 space
157 # hg stat
157 # hg stat
158 M f
158 M f
159 # hg resolve --list
159 # hg resolve --list
160 R f
160 R f
161
161
162 unless lowered on command line:
162 unless lowered on command line:
163
163
164 $ beforemerge
164 $ beforemerge
165 [merge-tools]
165 [merge-tools]
166 false.whatever=
166 false.whatever=
167 true.priority=1
167 true.priority=1
168 # hg update -C 1
168 # hg update -C 1
169 $ hg merge -r 2 --config merge-tools.true.priority=-7
169 $ hg merge -r 2 --config merge-tools.true.priority=-7
170 merging f
170 merging f
171 merging f failed!
171 merging f failed!
172 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
172 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
173 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
173 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
174 [1]
174 [1]
175 $ aftermerge
175 $ aftermerge
176 # cat f
176 # cat f
177 revision 1
177 revision 1
178 space
178 space
179 # hg stat
179 # hg stat
180 M f
180 M f
181 ? f.orig
181 ? f.orig
182 # hg resolve --list
182 # hg resolve --list
183 U f
183 U f
184
184
185 or false set higher on command line:
185 or false set higher on command line:
186
186
187 $ beforemerge
187 $ beforemerge
188 [merge-tools]
188 [merge-tools]
189 false.whatever=
189 false.whatever=
190 true.priority=1
190 true.priority=1
191 # hg update -C 1
191 # hg update -C 1
192 $ hg merge -r 2 --config merge-tools.false.priority=117
192 $ hg merge -r 2 --config merge-tools.false.priority=117
193 merging f
193 merging f
194 merging f failed!
194 merging f failed!
195 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
195 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
196 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
196 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
197 [1]
197 [1]
198 $ aftermerge
198 $ aftermerge
199 # cat f
199 # cat f
200 revision 1
200 revision 1
201 space
201 space
202 # hg stat
202 # hg stat
203 M f
203 M f
204 ? f.orig
204 ? f.orig
205 # hg resolve --list
205 # hg resolve --list
206 U f
206 U f
207
207
208 or true set to disabled:
208 or true set to disabled:
209 $ beforemerge
209 $ beforemerge
210 [merge-tools]
210 [merge-tools]
211 false.whatever=
211 false.whatever=
212 true.priority=1
212 true.priority=1
213 # hg update -C 1
213 # hg update -C 1
214 $ hg merge -r 2 --config merge-tools.true.disabled=yes
214 $ hg merge -r 2 --config merge-tools.true.disabled=yes
215 merging f
215 merging f
216 merging f failed!
216 merging f failed!
217 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
217 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
218 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
218 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
219 [1]
219 [1]
220 $ aftermerge
220 $ aftermerge
221 # cat f
221 # cat f
222 revision 1
222 revision 1
223 space
223 space
224 # hg stat
224 # hg stat
225 M f
225 M f
226 ? f.orig
226 ? f.orig
227 # hg resolve --list
227 # hg resolve --list
228 U f
228 U f
229
229
230 or true.executable not found in PATH:
230 or true.executable not found in PATH:
231
231
232 $ beforemerge
232 $ beforemerge
233 [merge-tools]
233 [merge-tools]
234 false.whatever=
234 false.whatever=
235 true.priority=1
235 true.priority=1
236 # hg update -C 1
236 # hg update -C 1
237 $ hg merge -r 2 --config merge-tools.true.executable=nonexistentmergetool
237 $ hg merge -r 2 --config merge-tools.true.executable=nonexistentmergetool
238 merging f
238 merging f
239 merging f failed!
239 merging f failed!
240 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
240 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
241 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
241 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
242 [1]
242 [1]
243 $ aftermerge
243 $ aftermerge
244 # cat f
244 # cat f
245 revision 1
245 revision 1
246 space
246 space
247 # hg stat
247 # hg stat
248 M f
248 M f
249 ? f.orig
249 ? f.orig
250 # hg resolve --list
250 # hg resolve --list
251 U f
251 U f
252
252
253 or true.executable with bogus path:
253 or true.executable with bogus path:
254
254
255 $ beforemerge
255 $ beforemerge
256 [merge-tools]
256 [merge-tools]
257 false.whatever=
257 false.whatever=
258 true.priority=1
258 true.priority=1
259 # hg update -C 1
259 # hg update -C 1
260 $ hg merge -r 2 --config merge-tools.true.executable=/nonexistent/mergetool
260 $ hg merge -r 2 --config merge-tools.true.executable=/nonexistent/mergetool
261 merging f
261 merging f
262 merging f failed!
262 merging f failed!
263 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
263 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
264 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
264 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
265 [1]
265 [1]
266 $ aftermerge
266 $ aftermerge
267 # cat f
267 # cat f
268 revision 1
268 revision 1
269 space
269 space
270 # hg stat
270 # hg stat
271 M f
271 M f
272 ? f.orig
272 ? f.orig
273 # hg resolve --list
273 # hg resolve --list
274 U f
274 U f
275
275
276 but true.executable set to cat found in PATH works:
276 but true.executable set to cat found in PATH works:
277
277
278 $ echo "true.executable=cat" >> .hg/hgrc
278 $ echo "true.executable=cat" >> .hg/hgrc
279 $ beforemerge
279 $ beforemerge
280 [merge-tools]
280 [merge-tools]
281 false.whatever=
281 false.whatever=
282 true.priority=1
282 true.priority=1
283 true.executable=cat
283 true.executable=cat
284 # hg update -C 1
284 # hg update -C 1
285 $ hg merge -r 2
285 $ hg merge -r 2
286 merging f
286 merging f
287 revision 1
287 revision 1
288 space
288 space
289 revision 0
289 revision 0
290 space
290 space
291 revision 2
291 revision 2
292 space
292 space
293 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
293 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
294 (branch merge, don't forget to commit)
294 (branch merge, don't forget to commit)
295 $ aftermerge
295 $ aftermerge
296 # cat f
296 # cat f
297 revision 1
297 revision 1
298 space
298 space
299 # hg stat
299 # hg stat
300 M f
300 M f
301 # hg resolve --list
301 # hg resolve --list
302 R f
302 R f
303
303
304 and true.executable set to cat with path works:
304 and true.executable set to cat with path works:
305
305
306 $ beforemerge
306 $ beforemerge
307 [merge-tools]
307 [merge-tools]
308 false.whatever=
308 false.whatever=
309 true.priority=1
309 true.priority=1
310 true.executable=cat
310 true.executable=cat
311 # hg update -C 1
311 # hg update -C 1
312 $ hg merge -r 2 --config merge-tools.true.executable=cat
312 $ hg merge -r 2 --config merge-tools.true.executable=cat
313 merging f
313 merging f
314 revision 1
314 revision 1
315 space
315 space
316 revision 0
316 revision 0
317 space
317 space
318 revision 2
318 revision 2
319 space
319 space
320 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
320 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
321 (branch merge, don't forget to commit)
321 (branch merge, don't forget to commit)
322 $ aftermerge
322 $ aftermerge
323 # cat f
323 # cat f
324 revision 1
324 revision 1
325 space
325 space
326 # hg stat
326 # hg stat
327 M f
327 M f
328 # hg resolve --list
328 # hg resolve --list
329 R f
329 R f
330
330
331 #if unix-permissions
331 #if unix-permissions
332
332
333 environment variables in true.executable are handled:
333 environment variables in true.executable are handled:
334
334
335 $ echo 'echo "custom merge tool"' > .hg/merge.sh
335 $ echo 'echo "custom merge tool"' > .hg/merge.sh
336 $ beforemerge
336 $ beforemerge
337 [merge-tools]
337 [merge-tools]
338 false.whatever=
338 false.whatever=
339 true.priority=1
339 true.priority=1
340 true.executable=cat
340 true.executable=cat
341 # hg update -C 1
341 # hg update -C 1
342 $ hg --config merge-tools.true.executable='sh' \
342 $ hg --config merge-tools.true.executable='sh' \
343 > --config merge-tools.true.args=.hg/merge.sh \
343 > --config merge-tools.true.args=.hg/merge.sh \
344 > merge -r 2
344 > merge -r 2
345 merging f
345 merging f
346 custom merge tool
346 custom merge tool
347 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
347 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
348 (branch merge, don't forget to commit)
348 (branch merge, don't forget to commit)
349 $ aftermerge
349 $ aftermerge
350 # cat f
350 # cat f
351 revision 1
351 revision 1
352 space
352 space
353 # hg stat
353 # hg stat
354 M f
354 M f
355 # hg resolve --list
355 # hg resolve --list
356 R f
356 R f
357
357
358 #endif
358 #endif
359
359
360 Tool selection and merge-patterns
360 Tool selection and merge-patterns
361
361
362 merge-patterns specifies new tool false:
362 merge-patterns specifies new tool false:
363
363
364 $ beforemerge
364 $ beforemerge
365 [merge-tools]
365 [merge-tools]
366 false.whatever=
366 false.whatever=
367 true.priority=1
367 true.priority=1
368 true.executable=cat
368 true.executable=cat
369 # hg update -C 1
369 # hg update -C 1
370 $ hg merge -r 2 --config merge-patterns.f=false
370 $ hg merge -r 2 --config merge-patterns.f=false
371 merging f
371 merging f
372 merging f failed!
372 merging f failed!
373 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
373 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
374 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
374 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
375 [1]
375 [1]
376 $ aftermerge
376 $ aftermerge
377 # cat f
377 # cat f
378 revision 1
378 revision 1
379 space
379 space
380 # hg stat
380 # hg stat
381 M f
381 M f
382 ? f.orig
382 ? f.orig
383 # hg resolve --list
383 # hg resolve --list
384 U f
384 U f
385
385
386 merge-patterns specifies executable not found in PATH and gets warning:
386 merge-patterns specifies executable not found in PATH and gets warning:
387
387
388 $ beforemerge
388 $ beforemerge
389 [merge-tools]
389 [merge-tools]
390 false.whatever=
390 false.whatever=
391 true.priority=1
391 true.priority=1
392 true.executable=cat
392 true.executable=cat
393 # hg update -C 1
393 # hg update -C 1
394 $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool
394 $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool
395 couldn't find merge tool true (for pattern f)
395 couldn't find merge tool true (for pattern f)
396 merging f
396 merging f
397 couldn't find merge tool true (for pattern f)
397 couldn't find merge tool true (for pattern f)
398 merging f failed!
398 merging f failed!
399 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
399 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
400 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
400 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
401 [1]
401 [1]
402 $ aftermerge
402 $ aftermerge
403 # cat f
403 # cat f
404 revision 1
404 revision 1
405 space
405 space
406 # hg stat
406 # hg stat
407 M f
407 M f
408 ? f.orig
408 ? f.orig
409 # hg resolve --list
409 # hg resolve --list
410 U f
410 U f
411
411
412 merge-patterns specifies executable with bogus path and gets warning:
412 merge-patterns specifies executable with bogus path and gets warning:
413
413
414 $ beforemerge
414 $ beforemerge
415 [merge-tools]
415 [merge-tools]
416 false.whatever=
416 false.whatever=
417 true.priority=1
417 true.priority=1
418 true.executable=cat
418 true.executable=cat
419 # hg update -C 1
419 # hg update -C 1
420 $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexistent/mergetool
420 $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexistent/mergetool
421 couldn't find merge tool true (for pattern f)
421 couldn't find merge tool true (for pattern f)
422 merging f
422 merging f
423 couldn't find merge tool true (for pattern f)
423 couldn't find merge tool true (for pattern f)
424 merging f failed!
424 merging f failed!
425 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
425 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
426 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
426 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
427 [1]
427 [1]
428 $ aftermerge
428 $ aftermerge
429 # cat f
429 # cat f
430 revision 1
430 revision 1
431 space
431 space
432 # hg stat
432 # hg stat
433 M f
433 M f
434 ? f.orig
434 ? f.orig
435 # hg resolve --list
435 # hg resolve --list
436 U f
436 U f
437
437
438 ui.merge overrules priority
438 ui.merge overrules priority
439
439
440 ui.merge specifies false:
440 ui.merge specifies false:
441
441
442 $ beforemerge
442 $ beforemerge
443 [merge-tools]
443 [merge-tools]
444 false.whatever=
444 false.whatever=
445 true.priority=1
445 true.priority=1
446 true.executable=cat
446 true.executable=cat
447 # hg update -C 1
447 # hg update -C 1
448 $ hg merge -r 2 --config ui.merge=false
448 $ hg merge -r 2 --config ui.merge=false
449 merging f
449 merging f
450 merging f failed!
450 merging f failed!
451 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
451 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
452 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
452 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
453 [1]
453 [1]
454 $ aftermerge
454 $ aftermerge
455 # cat f
455 # cat f
456 revision 1
456 revision 1
457 space
457 space
458 # hg stat
458 # hg stat
459 M f
459 M f
460 ? f.orig
460 ? f.orig
461 # hg resolve --list
461 # hg resolve --list
462 U f
462 U f
463
463
464 ui.merge specifies internal:fail:
464 ui.merge specifies internal:fail:
465
465
466 $ beforemerge
466 $ beforemerge
467 [merge-tools]
467 [merge-tools]
468 false.whatever=
468 false.whatever=
469 true.priority=1
469 true.priority=1
470 true.executable=cat
470 true.executable=cat
471 # hg update -C 1
471 # hg update -C 1
472 $ hg merge -r 2 --config ui.merge=internal:fail
472 $ hg merge -r 2 --config ui.merge=internal:fail
473 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
473 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
474 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
474 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
475 [1]
475 [1]
476 $ aftermerge
476 $ aftermerge
477 # cat f
477 # cat f
478 revision 1
478 revision 1
479 space
479 space
480 # hg stat
480 # hg stat
481 M f
481 M f
482 # hg resolve --list
482 # hg resolve --list
483 U f
483 U f
484
484
485 ui.merge specifies :local (without internal prefix):
485 ui.merge specifies :local (without internal prefix):
486
486
487 $ beforemerge
487 $ beforemerge
488 [merge-tools]
488 [merge-tools]
489 false.whatever=
489 false.whatever=
490 true.priority=1
490 true.priority=1
491 true.executable=cat
491 true.executable=cat
492 # hg update -C 1
492 # hg update -C 1
493 $ hg merge -r 2 --config ui.merge=:local
493 $ hg merge -r 2 --config ui.merge=:local
494 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
494 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
495 (branch merge, don't forget to commit)
495 (branch merge, don't forget to commit)
496 $ aftermerge
496 $ aftermerge
497 # cat f
497 # cat f
498 revision 1
498 revision 1
499 space
499 space
500 # hg stat
500 # hg stat
501 M f
501 M f
502 # hg resolve --list
502 # hg resolve --list
503 R f
503 R f
504
504
505 ui.merge specifies internal:other:
505 ui.merge specifies internal:other:
506
506
507 $ beforemerge
507 $ beforemerge
508 [merge-tools]
508 [merge-tools]
509 false.whatever=
509 false.whatever=
510 true.priority=1
510 true.priority=1
511 true.executable=cat
511 true.executable=cat
512 # hg update -C 1
512 # hg update -C 1
513 $ hg merge -r 2 --config ui.merge=internal:other
513 $ hg merge -r 2 --config ui.merge=internal:other
514 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
514 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
515 (branch merge, don't forget to commit)
515 (branch merge, don't forget to commit)
516 $ aftermerge
516 $ aftermerge
517 # cat f
517 # cat f
518 revision 2
518 revision 2
519 space
519 space
520 # hg stat
520 # hg stat
521 M f
521 M f
522 # hg resolve --list
522 # hg resolve --list
523 R f
523 R f
524
524
525 ui.merge specifies internal:prompt:
525 ui.merge specifies internal:prompt:
526
526
527 $ beforemerge
527 $ beforemerge
528 [merge-tools]
528 [merge-tools]
529 false.whatever=
529 false.whatever=
530 true.priority=1
530 true.priority=1
531 true.executable=cat
531 true.executable=cat
532 # hg update -C 1
532 # hg update -C 1
533 $ hg merge -r 2 --config ui.merge=internal:prompt
533 $ hg merge -r 2 --config ui.merge=internal:prompt
534 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
534 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
535 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
535 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
536 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
536 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
537 [1]
537 [1]
538 $ aftermerge
538 $ aftermerge
539 # cat f
539 # cat f
540 revision 1
540 revision 1
541 space
541 space
542 # hg stat
542 # hg stat
543 M f
543 M f
544 # hg resolve --list
544 # hg resolve --list
545 U f
545 U f
546
546
547 ui.merge specifies :prompt, with 'leave unresolved' chosen
547 ui.merge specifies :prompt, with 'leave unresolved' chosen
548
548
549 $ beforemerge
549 $ beforemerge
550 [merge-tools]
550 [merge-tools]
551 false.whatever=
551 false.whatever=
552 true.priority=1
552 true.priority=1
553 true.executable=cat
553 true.executable=cat
554 # hg update -C 1
554 # hg update -C 1
555 $ hg merge -r 2 --config ui.merge=:prompt --config ui.interactive=True << EOF
555 $ hg merge -r 2 --config ui.merge=:prompt --config ui.interactive=True << EOF
556 > u
556 > u
557 > EOF
557 > EOF
558 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
558 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
559 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
559 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
560 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
560 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
561 [1]
561 [1]
562 $ aftermerge
562 $ aftermerge
563 # cat f
563 # cat f
564 revision 1
564 revision 1
565 space
565 space
566 # hg stat
566 # hg stat
567 M f
567 M f
568 # hg resolve --list
568 # hg resolve --list
569 U f
569 U f
570
570
571 prompt with EOF
571 prompt with EOF
572
572
573 $ beforemerge
573 $ beforemerge
574 [merge-tools]
574 [merge-tools]
575 false.whatever=
575 false.whatever=
576 true.priority=1
576 true.priority=1
577 true.executable=cat
577 true.executable=cat
578 # hg update -C 1
578 # hg update -C 1
579 $ hg merge -r 2 --config ui.merge=internal:prompt --config ui.interactive=true
579 $ hg merge -r 2 --config ui.merge=internal:prompt --config ui.interactive=true
580 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f?
580 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f?
581 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
581 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
582 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
582 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
583 [1]
583 [1]
584 $ aftermerge
584 $ aftermerge
585 # cat f
585 # cat f
586 revision 1
586 revision 1
587 space
587 space
588 # hg stat
588 # hg stat
589 M f
589 M f
590 # hg resolve --list
590 # hg resolve --list
591 U f
591 U f
592 $ hg resolve --all --config ui.merge=internal:prompt --config ui.interactive=true
592 $ hg resolve --all --config ui.merge=internal:prompt --config ui.interactive=true
593 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f?
593 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f?
594 [1]
594 [1]
595 $ aftermerge
595 $ aftermerge
596 # cat f
596 # cat f
597 revision 1
597 revision 1
598 space
598 space
599 # hg stat
599 # hg stat
600 M f
600 M f
601 ? f.orig
601 ? f.orig
602 # hg resolve --list
602 # hg resolve --list
603 U f
603 U f
604 $ rm f
604 $ rm f
605 $ hg resolve --all --config ui.merge=internal:prompt --config ui.interactive=true
605 $ hg resolve --all --config ui.merge=internal:prompt --config ui.interactive=true
606 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f?
606 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f?
607 [1]
607 [1]
608 $ aftermerge
608 $ aftermerge
609 # cat f
609 # cat f
610 revision 1
610 revision 1
611 space
611 space
612 # hg stat
612 # hg stat
613 M f
613 M f
614 # hg resolve --list
614 # hg resolve --list
615 U f
615 U f
616 $ hg resolve --all --config ui.merge=internal:prompt
616 $ hg resolve --all --config ui.merge=internal:prompt
617 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
617 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
618 [1]
618 [1]
619 $ aftermerge
619 $ aftermerge
620 # cat f
620 # cat f
621 revision 1
621 revision 1
622 space
622 space
623 # hg stat
623 # hg stat
624 M f
624 M f
625 ? f.orig
625 ? f.orig
626 # hg resolve --list
626 # hg resolve --list
627 U f
627 U f
628
628
629 ui.merge specifies internal:dump:
629 ui.merge specifies internal:dump:
630
630
631 $ beforemerge
631 $ beforemerge
632 [merge-tools]
632 [merge-tools]
633 false.whatever=
633 false.whatever=
634 true.priority=1
634 true.priority=1
635 true.executable=cat
635 true.executable=cat
636 # hg update -C 1
636 # hg update -C 1
637 $ hg merge -r 2 --config ui.merge=internal:dump
637 $ hg merge -r 2 --config ui.merge=internal:dump
638 merging f
638 merging f
639 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
639 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
640 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
640 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
641 [1]
641 [1]
642 $ aftermerge
642 $ aftermerge
643 # cat f
643 # cat f
644 revision 1
644 revision 1
645 space
645 space
646 # hg stat
646 # hg stat
647 M f
647 M f
648 ? f.base
648 ? f.base
649 ? f.local
649 ? f.local
650 ? f.orig
650 ? f.orig
651 ? f.other
651 ? f.other
652 # hg resolve --list
652 # hg resolve --list
653 U f
653 U f
654
654
655 f.base:
655 f.base:
656
656
657 $ cat f.base
657 $ cat f.base
658 revision 0
658 revision 0
659 space
659 space
660
660
661 f.local:
661 f.local:
662
662
663 $ cat f.local
663 $ cat f.local
664 revision 1
664 revision 1
665 space
665 space
666
666
667 f.other:
667 f.other:
668
668
669 $ cat f.other
669 $ cat f.other
670 revision 2
670 revision 2
671 space
671 space
672 $ rm f.base f.local f.other
672 $ rm f.base f.local f.other
673
673
674 check that internal:dump doesn't dump files if premerge runs
674 check that internal:dump doesn't dump files if premerge runs
675 successfully
675 successfully
676
676
677 $ beforemerge
677 $ beforemerge
678 [merge-tools]
678 [merge-tools]
679 false.whatever=
679 false.whatever=
680 true.priority=1
680 true.priority=1
681 true.executable=cat
681 true.executable=cat
682 # hg update -C 1
682 # hg update -C 1
683 $ hg merge -r 3 --config ui.merge=internal:dump
683 $ hg merge -r 3 --config ui.merge=internal:dump
684 merging f
684 merging f
685 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
685 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
686 (branch merge, don't forget to commit)
686 (branch merge, don't forget to commit)
687
687
688 $ aftermerge
688 $ aftermerge
689 # cat f
689 # cat f
690 revision 1
690 revision 1
691 space
691 space
692 revision 3
692 revision 3
693 # hg stat
693 # hg stat
694 M f
694 M f
695 # hg resolve --list
695 # hg resolve --list
696 R f
696 R f
697
697
698 check that internal:forcedump dumps files, even if local and other can
698 check that internal:forcedump dumps files, even if local and other can
699 be merged easily
699 be merged easily
700
700
701 $ beforemerge
701 $ beforemerge
702 [merge-tools]
702 [merge-tools]
703 false.whatever=
703 false.whatever=
704 true.priority=1
704 true.priority=1
705 true.executable=cat
705 true.executable=cat
706 # hg update -C 1
706 # hg update -C 1
707 $ hg merge -r 3 --config ui.merge=internal:forcedump
707 $ hg merge -r 3 --config ui.merge=internal:forcedump
708 merging f
708 merging f
709 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
709 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
710 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
710 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
711 [1]
711 [1]
712 $ aftermerge
712 $ aftermerge
713 # cat f
713 # cat f
714 revision 1
714 revision 1
715 space
715 space
716 # hg stat
716 # hg stat
717 M f
717 M f
718 ? f.base
718 ? f.base
719 ? f.local
719 ? f.local
720 ? f.orig
720 ? f.orig
721 ? f.other
721 ? f.other
722 # hg resolve --list
722 # hg resolve --list
723 U f
723 U f
724
724
725 $ cat f.base
725 $ cat f.base
726 revision 0
726 revision 0
727 space
727 space
728
728
729 $ cat f.local
729 $ cat f.local
730 revision 1
730 revision 1
731 space
731 space
732
732
733 $ cat f.other
733 $ cat f.other
734 revision 0
734 revision 0
735 space
735 space
736 revision 3
736 revision 3
737
737
738 $ rm -f f.base f.local f.other
738 $ rm -f f.base f.local f.other
739
739
740 ui.merge specifies internal:other but is overruled by pattern for false:
740 ui.merge specifies internal:other but is overruled by pattern for false:
741
741
742 $ beforemerge
742 $ beforemerge
743 [merge-tools]
743 [merge-tools]
744 false.whatever=
744 false.whatever=
745 true.priority=1
745 true.priority=1
746 true.executable=cat
746 true.executable=cat
747 # hg update -C 1
747 # hg update -C 1
748 $ hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false
748 $ hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false
749 merging f
749 merging f
750 merging f failed!
750 merging f failed!
751 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
751 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
752 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
752 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
753 [1]
753 [1]
754 $ aftermerge
754 $ aftermerge
755 # cat f
755 # cat f
756 revision 1
756 revision 1
757 space
757 space
758 # hg stat
758 # hg stat
759 M f
759 M f
760 ? f.orig
760 ? f.orig
761 # hg resolve --list
761 # hg resolve --list
762 U f
762 U f
763
763
764 Premerge
764 Premerge
765
765
766 ui.merge specifies internal:other but is overruled by --tool=false
766 ui.merge specifies internal:other but is overruled by --tool=false
767
767
768 $ beforemerge
768 $ beforemerge
769 [merge-tools]
769 [merge-tools]
770 false.whatever=
770 false.whatever=
771 true.priority=1
771 true.priority=1
772 true.executable=cat
772 true.executable=cat
773 # hg update -C 1
773 # hg update -C 1
774 $ hg merge -r 2 --config ui.merge=internal:other --tool=false
774 $ hg merge -r 2 --config ui.merge=internal:other --tool=false
775 merging f
775 merging f
776 merging f failed!
776 merging f failed!
777 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
777 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
778 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
778 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
779 [1]
779 [1]
780 $ aftermerge
780 $ aftermerge
781 # cat f
781 # cat f
782 revision 1
782 revision 1
783 space
783 space
784 # hg stat
784 # hg stat
785 M f
785 M f
786 ? f.orig
786 ? f.orig
787 # hg resolve --list
787 # hg resolve --list
788 U f
788 U f
789
789
790 HGMERGE specifies internal:other but is overruled by --tool=false
790 HGMERGE specifies internal:other but is overruled by --tool=false
791
791
792 $ HGMERGE=internal:other ; export HGMERGE
792 $ HGMERGE=internal:other ; export HGMERGE
793 $ beforemerge
793 $ beforemerge
794 [merge-tools]
794 [merge-tools]
795 false.whatever=
795 false.whatever=
796 true.priority=1
796 true.priority=1
797 true.executable=cat
797 true.executable=cat
798 # hg update -C 1
798 # hg update -C 1
799 $ hg merge -r 2 --tool=false
799 $ hg merge -r 2 --tool=false
800 merging f
800 merging f
801 merging f failed!
801 merging f failed!
802 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
802 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
803 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
803 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
804 [1]
804 [1]
805 $ aftermerge
805 $ aftermerge
806 # cat f
806 # cat f
807 revision 1
807 revision 1
808 space
808 space
809 # hg stat
809 # hg stat
810 M f
810 M f
811 ? f.orig
811 ? f.orig
812 # hg resolve --list
812 # hg resolve --list
813 U f
813 U f
814
814
815 $ unset HGMERGE # make sure HGMERGE doesn't interfere with remaining tests
815 $ unset HGMERGE # make sure HGMERGE doesn't interfere with remaining tests
816
816
817 update is a merge ...
817 update is a merge ...
818
818
819 (this also tests that files reverted with '--rev REV' are treated as
819 (this also tests that files reverted with '--rev REV' are treated as
820 "modified", even if none of mode, size and timestamp of them isn't
820 "modified", even if none of mode, size and timestamp of them isn't
821 changed on the filesystem (see also issue4583))
821 changed on the filesystem (see also issue4583))
822
822
823 $ cat >> $HGRCPATH <<EOF
823 $ cat >> $HGRCPATH <<EOF
824 > [fakedirstatewritetime]
824 > [fakedirstatewritetime]
825 > # emulate invoking dirstate.write() via repo.status()
825 > # emulate invoking dirstate.write() via repo.status()
826 > # at 2000-01-01 00:00
826 > # at 2000-01-01 00:00
827 > fakenow = 200001010000
827 > fakenow = 200001010000
828 > EOF
828 > EOF
829
829
830 $ beforemerge
830 $ beforemerge
831 [merge-tools]
831 [merge-tools]
832 false.whatever=
832 false.whatever=
833 true.priority=1
833 true.priority=1
834 true.executable=cat
834 true.executable=cat
835 # hg update -C 1
835 # hg update -C 1
836 $ hg update -q 0
836 $ hg update -q 0
837 $ f -s f
837 $ f -s f
838 f: size=17
838 f: size=17
839 $ touch -t 200001010000 f
839 $ touch -t 200001010000 f
840 $ hg debugrebuildstate
840 $ hg debugrebuildstate
841 $ cat >> $HGRCPATH <<EOF
841 $ cat >> $HGRCPATH <<EOF
842 > [extensions]
842 > [extensions]
843 > fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py
843 > fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py
844 > EOF
844 > EOF
845 $ hg revert -q -r 1 .
845 $ hg revert -q -r 1 .
846 $ cat >> $HGRCPATH <<EOF
846 $ cat >> $HGRCPATH <<EOF
847 > [extensions]
847 > [extensions]
848 > fakedirstatewritetime = !
848 > fakedirstatewritetime = !
849 > EOF
849 > EOF
850 $ f -s f
850 $ f -s f
851 f: size=17
851 f: size=17
852 $ touch -t 200001010000 f
852 $ touch -t 200001010000 f
853 $ hg status f
853 $ hg status f
854 M f
854 M f
855 $ hg update -r 2
855 $ hg update -r 2
856 merging f
856 merging f
857 revision 1
857 revision 1
858 space
858 space
859 revision 0
859 revision 0
860 space
860 space
861 revision 2
861 revision 2
862 space
862 space
863 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
863 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
864 $ aftermerge
864 $ aftermerge
865 # cat f
865 # cat f
866 revision 1
866 revision 1
867 space
867 space
868 # hg stat
868 # hg stat
869 M f
869 M f
870 # hg resolve --list
870 # hg resolve --list
871 R f
871 R f
872
872
873 update should also have --tool
873 update should also have --tool
874
874
875 $ beforemerge
875 $ beforemerge
876 [merge-tools]
876 [merge-tools]
877 false.whatever=
877 false.whatever=
878 true.priority=1
878 true.priority=1
879 true.executable=cat
879 true.executable=cat
880 # hg update -C 1
880 # hg update -C 1
881 $ hg update -q 0
881 $ hg update -q 0
882 $ f -s f
882 $ f -s f
883 f: size=17
883 f: size=17
884 $ touch -t 200001010000 f
884 $ touch -t 200001010000 f
885 $ hg debugrebuildstate
885 $ hg debugrebuildstate
886 $ cat >> $HGRCPATH <<EOF
886 $ cat >> $HGRCPATH <<EOF
887 > [extensions]
887 > [extensions]
888 > fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py
888 > fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py
889 > EOF
889 > EOF
890 $ hg revert -q -r 1 .
890 $ hg revert -q -r 1 .
891 $ cat >> $HGRCPATH <<EOF
891 $ cat >> $HGRCPATH <<EOF
892 > [extensions]
892 > [extensions]
893 > fakedirstatewritetime = !
893 > fakedirstatewritetime = !
894 > EOF
894 > EOF
895 $ f -s f
895 $ f -s f
896 f: size=17
896 f: size=17
897 $ touch -t 200001010000 f
897 $ touch -t 200001010000 f
898 $ hg status f
898 $ hg status f
899 M f
899 M f
900 $ hg update -r 2 --tool false
900 $ hg update -r 2 --tool false
901 merging f
901 merging f
902 merging f failed!
902 merging f failed!
903 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
903 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
904 use 'hg resolve' to retry unresolved file merges
904 use 'hg resolve' to retry unresolved file merges
905 [1]
905 [1]
906 $ aftermerge
906 $ aftermerge
907 # cat f
907 # cat f
908 revision 1
908 revision 1
909 space
909 space
910 # hg stat
910 # hg stat
911 M f
911 M f
912 ? f.orig
912 ? f.orig
913 # hg resolve --list
913 # hg resolve --list
914 U f
914 U f
915
915
916 Default is silent simplemerge:
916 Default is silent simplemerge:
917
917
918 $ beforemerge
918 $ beforemerge
919 [merge-tools]
919 [merge-tools]
920 false.whatever=
920 false.whatever=
921 true.priority=1
921 true.priority=1
922 true.executable=cat
922 true.executable=cat
923 # hg update -C 1
923 # hg update -C 1
924 $ hg merge -r 3
924 $ hg merge -r 3
925 merging f
925 merging f
926 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
926 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
927 (branch merge, don't forget to commit)
927 (branch merge, don't forget to commit)
928 $ aftermerge
928 $ aftermerge
929 # cat f
929 # cat f
930 revision 1
930 revision 1
931 space
931 space
932 revision 3
932 revision 3
933 # hg stat
933 # hg stat
934 M f
934 M f
935 # hg resolve --list
935 # hg resolve --list
936 R f
936 R f
937
937
938 .premerge=True is same:
938 .premerge=True is same:
939
939
940 $ beforemerge
940 $ beforemerge
941 [merge-tools]
941 [merge-tools]
942 false.whatever=
942 false.whatever=
943 true.priority=1
943 true.priority=1
944 true.executable=cat
944 true.executable=cat
945 # hg update -C 1
945 # hg update -C 1
946 $ hg merge -r 3 --config merge-tools.true.premerge=True
946 $ hg merge -r 3 --config merge-tools.true.premerge=True
947 merging f
947 merging f
948 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
948 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
949 (branch merge, don't forget to commit)
949 (branch merge, don't forget to commit)
950 $ aftermerge
950 $ aftermerge
951 # cat f
951 # cat f
952 revision 1
952 revision 1
953 space
953 space
954 revision 3
954 revision 3
955 # hg stat
955 # hg stat
956 M f
956 M f
957 # hg resolve --list
957 # hg resolve --list
958 R f
958 R f
959
959
960 .premerge=False executes merge-tool:
960 .premerge=False executes merge-tool:
961
961
962 $ beforemerge
962 $ beforemerge
963 [merge-tools]
963 [merge-tools]
964 false.whatever=
964 false.whatever=
965 true.priority=1
965 true.priority=1
966 true.executable=cat
966 true.executable=cat
967 # hg update -C 1
967 # hg update -C 1
968 $ hg merge -r 3 --config merge-tools.true.premerge=False
968 $ hg merge -r 3 --config merge-tools.true.premerge=False
969 merging f
969 merging f
970 revision 1
970 revision 1
971 space
971 space
972 revision 0
972 revision 0
973 space
973 space
974 revision 0
974 revision 0
975 space
975 space
976 revision 3
976 revision 3
977 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
977 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
978 (branch merge, don't forget to commit)
978 (branch merge, don't forget to commit)
979 $ aftermerge
979 $ aftermerge
980 # cat f
980 # cat f
981 revision 1
981 revision 1
982 space
982 space
983 # hg stat
983 # hg stat
984 M f
984 M f
985 # hg resolve --list
985 # hg resolve --list
986 R f
986 R f
987
987
988 premerge=keep keeps conflict markers in:
988 premerge=keep keeps conflict markers in:
989
989
990 $ beforemerge
990 $ beforemerge
991 [merge-tools]
991 [merge-tools]
992 false.whatever=
992 false.whatever=
993 true.priority=1
993 true.priority=1
994 true.executable=cat
994 true.executable=cat
995 # hg update -C 1
995 # hg update -C 1
996 $ hg merge -r 4 --config merge-tools.true.premerge=keep
996 $ hg merge -r 4 --config merge-tools.true.premerge=keep
997 merging f
997 merging f
998 <<<<<<< working copy: ef83787e2614 - test: revision 1
998 <<<<<<< working copy: ef83787e2614 - test: revision 1
999 revision 1
999 revision 1
1000 space
1000 space
1001 =======
1001 =======
1002 revision 4
1002 revision 4
1003 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1003 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1004 revision 0
1004 revision 0
1005 space
1005 space
1006 revision 4
1006 revision 4
1007 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1007 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1008 (branch merge, don't forget to commit)
1008 (branch merge, don't forget to commit)
1009 $ aftermerge
1009 $ aftermerge
1010 # cat f
1010 # cat f
1011 <<<<<<< working copy: ef83787e2614 - test: revision 1
1011 <<<<<<< working copy: ef83787e2614 - test: revision 1
1012 revision 1
1012 revision 1
1013 space
1013 space
1014 =======
1014 =======
1015 revision 4
1015 revision 4
1016 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1016 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1017 # hg stat
1017 # hg stat
1018 M f
1018 M f
1019 # hg resolve --list
1019 # hg resolve --list
1020 R f
1020 R f
1021
1021
1022 premerge=keep-merge3 keeps conflict markers with base content:
1022 premerge=keep-merge3 keeps conflict markers with base content:
1023
1023
1024 $ beforemerge
1024 $ beforemerge
1025 [merge-tools]
1025 [merge-tools]
1026 false.whatever=
1026 false.whatever=
1027 true.priority=1
1027 true.priority=1
1028 true.executable=cat
1028 true.executable=cat
1029 # hg update -C 1
1029 # hg update -C 1
1030 $ hg merge -r 4 --config merge-tools.true.premerge=keep-merge3
1030 $ hg merge -r 4 --config merge-tools.true.premerge=keep-merge3
1031 merging f
1031 merging f
1032 <<<<<<< working copy: ef83787e2614 - test: revision 1
1032 <<<<<<< working copy: ef83787e2614 - test: revision 1
1033 revision 1
1033 revision 1
1034 space
1034 space
1035 ||||||| base
1035 ||||||| base
1036 revision 0
1036 revision 0
1037 space
1037 space
1038 =======
1038 =======
1039 revision 4
1039 revision 4
1040 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1040 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1041 revision 0
1041 revision 0
1042 space
1042 space
1043 revision 4
1043 revision 4
1044 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1044 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1045 (branch merge, don't forget to commit)
1045 (branch merge, don't forget to commit)
1046 $ aftermerge
1046 $ aftermerge
1047 # cat f
1047 # cat f
1048 <<<<<<< working copy: ef83787e2614 - test: revision 1
1048 <<<<<<< working copy: ef83787e2614 - test: revision 1
1049 revision 1
1049 revision 1
1050 space
1050 space
1051 ||||||| base
1051 ||||||| base
1052 revision 0
1052 revision 0
1053 space
1053 space
1054 =======
1054 =======
1055 revision 4
1055 revision 4
1056 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1056 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1057 # hg stat
1057 # hg stat
1058 M f
1058 M f
1059 # hg resolve --list
1059 # hg resolve --list
1060 R f
1060 R f
1061
1061
1062 premerge=keep respects ui.mergemarkers=basic:
1063
1064 $ beforemerge
1065 [merge-tools]
1066 false.whatever=
1067 true.priority=1
1068 true.executable=cat
1069 # hg update -C 1
1070 $ hg merge -r 4 --config merge-tools.true.premerge=keep --config ui.mergemarkers=basic
1071 merging f
1072 <<<<<<< working copy
1073 revision 1
1074 space
1075 =======
1076 revision 4
1077 >>>>>>> merge rev
1078 revision 0
1079 space
1080 revision 4
1081 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1082 (branch merge, don't forget to commit)
1083 $ aftermerge
1084 # cat f
1085 <<<<<<< working copy
1086 revision 1
1087 space
1088 =======
1089 revision 4
1090 >>>>>>> merge rev
1091 # hg stat
1092 M f
1093 # hg resolve --list
1094 R f
1095
1096 premerge=keep ignores ui.mergemarkers=basic if true.mergemarkers=detailed:
1097
1098 $ beforemerge
1099 [merge-tools]
1100 false.whatever=
1101 true.priority=1
1102 true.executable=cat
1103 # hg update -C 1
1104 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1105 > --config ui.mergemarkers=basic \
1106 > --config merge-tools.true.mergemarkers=detailed
1107 merging f
1108 <<<<<<< working copy: ef83787e2614 - test: revision 1
1109 revision 1
1110 space
1111 =======
1112 revision 4
1113 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1114 revision 0
1115 space
1116 revision 4
1117 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1118 (branch merge, don't forget to commit)
1119 $ aftermerge
1120 # cat f
1121 <<<<<<< working copy: ef83787e2614 - test: revision 1
1122 revision 1
1123 space
1124 =======
1125 revision 4
1126 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1127 # hg stat
1128 M f
1129 # hg resolve --list
1130 R f
1131
1132 premerge=keep respects ui.mergemarkertemplate instead of
1133 true.mergemarkertemplate if true.mergemarkers=basic:
1134
1135 $ beforemerge
1136 [merge-tools]
1137 false.whatever=
1138 true.priority=1
1139 true.executable=cat
1140 # hg update -C 1
1141 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1142 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1143 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}'
1144 merging f
1145 <<<<<<< working copy: uitmpl 1
1146 revision 1
1147 space
1148 =======
1149 revision 4
1150 >>>>>>> merge rev: uitmpl 4
1151 revision 0
1152 space
1153 revision 4
1154 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1155 (branch merge, don't forget to commit)
1156 $ aftermerge
1157 # cat f
1158 <<<<<<< working copy: uitmpl 1
1159 revision 1
1160 space
1161 =======
1162 revision 4
1163 >>>>>>> merge rev: uitmpl 4
1164 # hg stat
1165 M f
1166 # hg resolve --list
1167 R f
1168
1169 premerge=keep respects true.mergemarkertemplate instead of
1170 true.mergemarkertemplate if true.mergemarkers=detailed:
1171
1172 $ beforemerge
1173 [merge-tools]
1174 false.whatever=
1175 true.priority=1
1176 true.executable=cat
1177 # hg update -C 1
1178 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1179 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1180 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1181 > --config merge-tools.true.mergemarkers=detailed
1182 merging f
1183 <<<<<<< working copy: tooltmpl ef83787e2614
1184 revision 1
1185 space
1186 =======
1187 revision 4
1188 >>>>>>> merge rev: tooltmpl 81448d39c9a0
1189 revision 0
1190 space
1191 revision 4
1192 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1193 (branch merge, don't forget to commit)
1194 $ aftermerge
1195 # cat f
1196 <<<<<<< working copy: tooltmpl ef83787e2614
1197 revision 1
1198 space
1199 =======
1200 revision 4
1201 >>>>>>> merge rev: tooltmpl 81448d39c9a0
1202 # hg stat
1203 M f
1204 # hg resolve --list
1205 R f
1062
1206
1063 Tool execution
1207 Tool execution
1064
1208
1065 set tools.args explicit to include $base $local $other $output:
1209 set tools.args explicit to include $base $local $other $output:
1066
1210
1067 $ beforemerge
1211 $ beforemerge
1068 [merge-tools]
1212 [merge-tools]
1069 false.whatever=
1213 false.whatever=
1070 true.priority=1
1214 true.priority=1
1071 true.executable=cat
1215 true.executable=cat
1072 # hg update -C 1
1216 # hg update -C 1
1073 $ hg merge -r 2 --config merge-tools.true.executable=head --config merge-tools.true.args='$base $local $other $output' \
1217 $ hg merge -r 2 --config merge-tools.true.executable=head --config merge-tools.true.args='$base $local $other $output' \
1074 > | sed 's,==> .* <==,==> ... <==,g'
1218 > | sed 's,==> .* <==,==> ... <==,g'
1075 merging f
1219 merging f
1076 ==> ... <==
1220 ==> ... <==
1077 revision 0
1221 revision 0
1078 space
1222 space
1079
1223
1080 ==> ... <==
1224 ==> ... <==
1081 revision 1
1225 revision 1
1082 space
1226 space
1083
1227
1084 ==> ... <==
1228 ==> ... <==
1085 revision 2
1229 revision 2
1086 space
1230 space
1087
1231
1088 ==> ... <==
1232 ==> ... <==
1089 revision 1
1233 revision 1
1090 space
1234 space
1091 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1235 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1092 (branch merge, don't forget to commit)
1236 (branch merge, don't forget to commit)
1093 $ aftermerge
1237 $ aftermerge
1094 # cat f
1238 # cat f
1095 revision 1
1239 revision 1
1096 space
1240 space
1097 # hg stat
1241 # hg stat
1098 M f
1242 M f
1099 # hg resolve --list
1243 # hg resolve --list
1100 R f
1244 R f
1101
1245
1102 Merge with "echo mergeresult > $local":
1246 Merge with "echo mergeresult > $local":
1103
1247
1104 $ beforemerge
1248 $ beforemerge
1105 [merge-tools]
1249 [merge-tools]
1106 false.whatever=
1250 false.whatever=
1107 true.priority=1
1251 true.priority=1
1108 true.executable=cat
1252 true.executable=cat
1109 # hg update -C 1
1253 # hg update -C 1
1110 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $local'
1254 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $local'
1111 merging f
1255 merging f
1112 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1256 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1113 (branch merge, don't forget to commit)
1257 (branch merge, don't forget to commit)
1114 $ aftermerge
1258 $ aftermerge
1115 # cat f
1259 # cat f
1116 mergeresult
1260 mergeresult
1117 # hg stat
1261 # hg stat
1118 M f
1262 M f
1119 # hg resolve --list
1263 # hg resolve --list
1120 R f
1264 R f
1121
1265
1122 - and $local is the file f:
1266 - and $local is the file f:
1123
1267
1124 $ beforemerge
1268 $ beforemerge
1125 [merge-tools]
1269 [merge-tools]
1126 false.whatever=
1270 false.whatever=
1127 true.priority=1
1271 true.priority=1
1128 true.executable=cat
1272 true.executable=cat
1129 # hg update -C 1
1273 # hg update -C 1
1130 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > f'
1274 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > f'
1131 merging f
1275 merging f
1132 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1276 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1133 (branch merge, don't forget to commit)
1277 (branch merge, don't forget to commit)
1134 $ aftermerge
1278 $ aftermerge
1135 # cat f
1279 # cat f
1136 mergeresult
1280 mergeresult
1137 # hg stat
1281 # hg stat
1138 M f
1282 M f
1139 # hg resolve --list
1283 # hg resolve --list
1140 R f
1284 R f
1141
1285
1142 Merge with "echo mergeresult > $output" - the variable is a bit magic:
1286 Merge with "echo mergeresult > $output" - the variable is a bit magic:
1143
1287
1144 $ beforemerge
1288 $ beforemerge
1145 [merge-tools]
1289 [merge-tools]
1146 false.whatever=
1290 false.whatever=
1147 true.priority=1
1291 true.priority=1
1148 true.executable=cat
1292 true.executable=cat
1149 # hg update -C 1
1293 # hg update -C 1
1150 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $output'
1294 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $output'
1151 merging f
1295 merging f
1152 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1296 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1153 (branch merge, don't forget to commit)
1297 (branch merge, don't forget to commit)
1154 $ aftermerge
1298 $ aftermerge
1155 # cat f
1299 # cat f
1156 mergeresult
1300 mergeresult
1157 # hg stat
1301 # hg stat
1158 M f
1302 M f
1159 # hg resolve --list
1303 # hg resolve --list
1160 R f
1304 R f
1161
1305
1162 Merge using tool with a path that must be quoted:
1306 Merge using tool with a path that must be quoted:
1163
1307
1164 $ beforemerge
1308 $ beforemerge
1165 [merge-tools]
1309 [merge-tools]
1166 false.whatever=
1310 false.whatever=
1167 true.priority=1
1311 true.priority=1
1168 true.executable=cat
1312 true.executable=cat
1169 # hg update -C 1
1313 # hg update -C 1
1170 $ cat <<EOF > 'my merge tool'
1314 $ cat <<EOF > 'my merge tool'
1171 > cat "\$1" "\$2" "\$3" > "\$4"
1315 > cat "\$1" "\$2" "\$3" > "\$4"
1172 > EOF
1316 > EOF
1173 $ hg --config merge-tools.true.executable='sh' \
1317 $ hg --config merge-tools.true.executable='sh' \
1174 > --config merge-tools.true.args='"./my merge tool" $base $local $other $output' \
1318 > --config merge-tools.true.args='"./my merge tool" $base $local $other $output' \
1175 > merge -r 2
1319 > merge -r 2
1176 merging f
1320 merging f
1177 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1321 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1178 (branch merge, don't forget to commit)
1322 (branch merge, don't forget to commit)
1179 $ rm -f 'my merge tool'
1323 $ rm -f 'my merge tool'
1180 $ aftermerge
1324 $ aftermerge
1181 # cat f
1325 # cat f
1182 revision 0
1326 revision 0
1183 space
1327 space
1184 revision 1
1328 revision 1
1185 space
1329 space
1186 revision 2
1330 revision 2
1187 space
1331 space
1188 # hg stat
1332 # hg stat
1189 M f
1333 M f
1190 # hg resolve --list
1334 # hg resolve --list
1191 R f
1335 R f
1192
1336
1337 Merge using a tool that supports labellocal, labelother, and labelbase, checking
1338 that they're quoted properly as well. This is using the default 'basic'
1339 mergemarkers even though ui.mergemarkers is 'detailed', so it's ignoring both
1340 mergemarkertemplate settings:
1341
1342 $ beforemerge
1343 [merge-tools]
1344 false.whatever=
1345 true.priority=1
1346 true.executable=cat
1347 # hg update -C 1
1348 $ cat <<EOF > printargs_merge_tool
1349 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1350 > EOF
1351 $ hg --config merge-tools.true.executable='sh' \
1352 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1353 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1354 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1355 > --config ui.mergemarkers=detailed \
1356 > merge -r 2
1357 merging f
1358 arg: "ll:working copy"
1359 arg: "lo:"
1360 arg: "merge rev"
1361 arg: "lb:base: /tmp/f~base.*" (glob)
1362 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1363 (branch merge, don't forget to commit)
1364 $ rm -f 'printargs_merge_tool'
1365
1366 Merge using a tool that supports labellocal, labelother, and labelbase, checking
1367 that they're quoted properly as well. This is using 'detailed' mergemarkers,
1368 even though ui.mergemarkers is 'basic', and using the tool's
1369 mergemarkertemplate:
1370
1371 $ beforemerge
1372 [merge-tools]
1373 false.whatever=
1374 true.priority=1
1375 true.executable=cat
1376 # hg update -C 1
1377 $ cat <<EOF > printargs_merge_tool
1378 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1379 > EOF
1380 $ hg --config merge-tools.true.executable='sh' \
1381 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1382 > --config merge-tools.true.mergemarkers=detailed \
1383 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1384 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1385 > --config ui.mergemarkers=basic \
1386 > merge -r 2
1387 merging f
1388 arg: "ll:working copy: tooltmpl ef83787e2614"
1389 arg: "lo:"
1390 arg: "merge rev: tooltmpl 0185f4e0cf02"
1391 arg: "lb:base: /tmp/f~base.*" (glob)
1392 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1393 (branch merge, don't forget to commit)
1394 $ rm -f 'printargs_merge_tool'
1395
1396 The merge tool still gets labellocal and labelother as 'basic' even when
1397 premerge=keep is used and has 'detailed' markers:
1398
1399 $ beforemerge
1400 [merge-tools]
1401 false.whatever=
1402 true.priority=1
1403 true.executable=cat
1404 # hg update -C 1
1405 $ cat <<EOF > mytool
1406 > echo labellocal: \"\$1\"
1407 > echo labelother: \"\$2\"
1408 > echo "output (arg)": \"\$3\"
1409 > echo "output (contents)":
1410 > cat "\$3"
1411 > EOF
1412 $ hg --config merge-tools.true.executable='sh' \
1413 > --config merge-tools.true.args='mytool $labellocal $labelother $output' \
1414 > --config merge-tools.true.premerge=keep \
1415 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1416 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1417 > --config ui.mergemarkers=detailed \
1418 > merge -r 2
1419 merging f
1420 labellocal: "working copy"
1421 labelother: "merge rev"
1422 output (arg): "$TESTTMP/f"
1423 output (contents):
1424 <<<<<<< working copy: uitmpl 1
1425 revision 1
1426 =======
1427 revision 2
1428 >>>>>>> merge rev: uitmpl 2
1429 space
1430 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1431 (branch merge, don't forget to commit)
1432 $ rm -f 'mytool'
1433
1434 premerge=keep uses the *tool's* mergemarkertemplate if tool's
1435 mergemarkers=detailed; labellocal and labelother also use the tool's template
1436
1437 $ beforemerge
1438 [merge-tools]
1439 false.whatever=
1440 true.priority=1
1441 true.executable=cat
1442 # hg update -C 1
1443 $ cat <<EOF > mytool
1444 > echo labellocal: \"\$1\"
1445 > echo labelother: \"\$2\"
1446 > echo "output (arg)": \"\$3\"
1447 > echo "output (contents)":
1448 > cat "\$3"
1449 > EOF
1450 $ hg --config merge-tools.true.executable='sh' \
1451 > --config merge-tools.true.args='mytool $labellocal $labelother $output' \
1452 > --config merge-tools.true.premerge=keep \
1453 > --config merge-tools.true.mergemarkers=detailed \
1454 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1455 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1456 > --config ui.mergemarkers=detailed \
1457 > merge -r 2
1458 merging f
1459 labellocal: "working copy: tooltmpl ef83787e2614"
1460 labelother: "merge rev: tooltmpl 0185f4e0cf02"
1461 output (arg): "$TESTTMP/f"
1462 output (contents):
1463 <<<<<<< working copy: tooltmpl ef83787e2614
1464 revision 1
1465 =======
1466 revision 2
1467 >>>>>>> merge rev: tooltmpl 0185f4e0cf02
1468 space
1469 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1470 (branch merge, don't forget to commit)
1471 $ rm -f 'mytool'
1472
1193 Issue3581: Merging a filename that needs to be quoted
1473 Issue3581: Merging a filename that needs to be quoted
1194 (This test doesn't work on Windows filesystems even on Linux, so check
1474 (This test doesn't work on Windows filesystems even on Linux, so check
1195 for Unix-like permission)
1475 for Unix-like permission)
1196
1476
1197 #if unix-permissions
1477 #if unix-permissions
1198 $ beforemerge
1478 $ beforemerge
1199 [merge-tools]
1479 [merge-tools]
1200 false.whatever=
1480 false.whatever=
1201 true.priority=1
1481 true.priority=1
1202 true.executable=cat
1482 true.executable=cat
1203 # hg update -C 1
1483 # hg update -C 1
1204 $ echo "revision 5" > '"; exit 1; echo "'
1484 $ echo "revision 5" > '"; exit 1; echo "'
1205 $ hg commit -Am "revision 5"
1485 $ hg commit -Am "revision 5"
1206 adding "; exit 1; echo "
1486 adding "; exit 1; echo "
1207 warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
1487 warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
1208 $ hg update -C 1 > /dev/null
1488 $ hg update -C 1 > /dev/null
1209 $ echo "revision 6" > '"; exit 1; echo "'
1489 $ echo "revision 6" > '"; exit 1; echo "'
1210 $ hg commit -Am "revision 6"
1490 $ hg commit -Am "revision 6"
1211 adding "; exit 1; echo "
1491 adding "; exit 1; echo "
1212 warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
1492 warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
1213 created new head
1493 created new head
1214 $ hg merge --config merge-tools.true.executable="true" -r 5
1494 $ hg merge --config merge-tools.true.executable="true" -r 5
1215 merging "; exit 1; echo "
1495 merging "; exit 1; echo "
1216 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1496 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1217 (branch merge, don't forget to commit)
1497 (branch merge, don't forget to commit)
1218 $ hg update -C 1 > /dev/null
1498 $ hg update -C 1 > /dev/null
1219 #endif
1499 #endif
1220
1500
1221 Merge post-processing
1501 Merge post-processing
1222
1502
1223 cat is a bad merge-tool and doesn't change:
1503 cat is a bad merge-tool and doesn't change:
1224
1504
1225 $ beforemerge
1505 $ beforemerge
1226 [merge-tools]
1506 [merge-tools]
1227 false.whatever=
1507 false.whatever=
1228 true.priority=1
1508 true.priority=1
1229 true.executable=cat
1509 true.executable=cat
1230 # hg update -C 1
1510 # hg update -C 1
1231 $ hg merge -y -r 2 --config merge-tools.true.checkchanged=1
1511 $ hg merge -y -r 2 --config merge-tools.true.checkchanged=1
1232 merging f
1512 merging f
1233 revision 1
1513 revision 1
1234 space
1514 space
1235 revision 0
1515 revision 0
1236 space
1516 space
1237 revision 2
1517 revision 2
1238 space
1518 space
1239 output file f appears unchanged
1519 output file f appears unchanged
1240 was merge successful (yn)? n
1520 was merge successful (yn)? n
1241 merging f failed!
1521 merging f failed!
1242 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1522 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1243 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1523 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1244 [1]
1524 [1]
1245 $ aftermerge
1525 $ aftermerge
1246 # cat f
1526 # cat f
1247 revision 1
1527 revision 1
1248 space
1528 space
1249 # hg stat
1529 # hg stat
1250 M f
1530 M f
1251 ? f.orig
1531 ? f.orig
1252 # hg resolve --list
1532 # hg resolve --list
1253 U f
1533 U f
1254
1534
1255 #if symlink
1535 #if symlink
1256
1536
1257 internal merge cannot handle symlinks and shouldn't try:
1537 internal merge cannot handle symlinks and shouldn't try:
1258
1538
1259 $ hg update -q -C 1
1539 $ hg update -q -C 1
1260 $ rm f
1540 $ rm f
1261 $ ln -s symlink f
1541 $ ln -s symlink f
1262 $ hg commit -qm 'f is symlink'
1542 $ hg commit -qm 'f is symlink'
1263 $ hg merge -r 2 --tool internal:merge
1543 $ hg merge -r 2 --tool internal:merge
1264 merging f
1544 merging f
1265 warning: internal :merge cannot merge symlinks for f
1545 warning: internal :merge cannot merge symlinks for f
1266 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
1546 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
1267 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1547 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1268 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1548 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1269 [1]
1549 [1]
1270
1550
1271 #endif
1551 #endif
1272
1552
1273 Verify naming of temporary files and that extension is preserved:
1553 Verify naming of temporary files and that extension is preserved:
1274
1554
1275 $ hg update -q -C 1
1555 $ hg update -q -C 1
1276 $ hg mv f f.txt
1556 $ hg mv f f.txt
1277 $ hg ci -qm "f.txt"
1557 $ hg ci -qm "f.txt"
1278 $ hg update -q -C 2
1558 $ hg update -q -C 2
1279 $ hg merge -y -r tip --tool echo --config merge-tools.echo.args='$base $local $other $output'
1559 $ hg merge -y -r tip --tool echo --config merge-tools.echo.args='$base $local $other $output'
1280 merging f and f.txt to f.txt
1560 merging f and f.txt to f.txt
1281 */f~base.?????? $TESTTMP/f.txt.orig */f~other.??????.txt $TESTTMP/f.txt (glob)
1561 */f~base.?????? $TESTTMP/f.txt.orig */f~other.??????.txt $TESTTMP/f.txt (glob)
1282 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1562 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1283 (branch merge, don't forget to commit)
1563 (branch merge, don't forget to commit)
1284
1564
1285 Check that debugpicktool examines which merge tool is chosen for
1565 Check that debugpicktool examines which merge tool is chosen for
1286 specified file as expected
1566 specified file as expected
1287
1567
1288 $ beforemerge
1568 $ beforemerge
1289 [merge-tools]
1569 [merge-tools]
1290 false.whatever=
1570 false.whatever=
1291 true.priority=1
1571 true.priority=1
1292 true.executable=cat
1572 true.executable=cat
1293 # hg update -C 1
1573 # hg update -C 1
1294
1574
1295 (default behavior: checking files in the working parent context)
1575 (default behavior: checking files in the working parent context)
1296
1576
1297 $ hg manifest
1577 $ hg manifest
1298 f
1578 f
1299 $ hg debugpickmergetool
1579 $ hg debugpickmergetool
1300 f = true
1580 f = true
1301
1581
1302 (-X/-I and file patterns limmit examination targets)
1582 (-X/-I and file patterns limmit examination targets)
1303
1583
1304 $ hg debugpickmergetool -X f
1584 $ hg debugpickmergetool -X f
1305 $ hg debugpickmergetool unknown
1585 $ hg debugpickmergetool unknown
1306 unknown: no such file in rev ef83787e2614
1586 unknown: no such file in rev ef83787e2614
1307
1587
1308 (--changedelete emulates merging change and delete)
1588 (--changedelete emulates merging change and delete)
1309
1589
1310 $ hg debugpickmergetool --changedelete
1590 $ hg debugpickmergetool --changedelete
1311 f = :prompt
1591 f = :prompt
1312
1592
1313 (-r REV causes checking files in specified revision)
1593 (-r REV causes checking files in specified revision)
1314
1594
1315 $ hg manifest -r tip
1595 $ hg manifest -r tip
1316 f.txt
1596 f.txt
1317 $ hg debugpickmergetool -r tip
1597 $ hg debugpickmergetool -r tip
1318 f.txt = true
1598 f.txt = true
1319
1599
1320 #if symlink
1600 #if symlink
1321
1601
1322 (symlink causes chosing :prompt)
1602 (symlink causes chosing :prompt)
1323
1603
1324 $ hg debugpickmergetool -r 6d00b3726f6e
1604 $ hg debugpickmergetool -r 6d00b3726f6e
1325 f = :prompt
1605 f = :prompt
1326
1606
1327 #endif
1607 #endif
1328
1608
1329 (--verbose shows some configurations)
1609 (--verbose shows some configurations)
1330
1610
1331 $ hg debugpickmergetool --tool foobar -v
1611 $ hg debugpickmergetool --tool foobar -v
1332 with --tool 'foobar'
1612 with --tool 'foobar'
1333 f = foobar
1613 f = foobar
1334
1614
1335 $ HGMERGE=false hg debugpickmergetool -v
1615 $ HGMERGE=false hg debugpickmergetool -v
1336 with HGMERGE='false'
1616 with HGMERGE='false'
1337 f = false
1617 f = false
1338
1618
1339 $ hg debugpickmergetool --config ui.merge=false -v
1619 $ hg debugpickmergetool --config ui.merge=false -v
1340 with ui.merge='false'
1620 with ui.merge='false'
1341 f = false
1621 f = false
1342
1622
1343 (--debug shows errors detected intermediately)
1623 (--debug shows errors detected intermediately)
1344
1624
1345 $ hg debugpickmergetool --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool --debug f
1625 $ hg debugpickmergetool --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool --debug f
1346 couldn't find merge tool true (for pattern f)
1626 couldn't find merge tool true (for pattern f)
1347 couldn't find merge tool true
1627 couldn't find merge tool true
1348 f = false
1628 f = false
General Comments 0
You need to be logged in to leave comments. Login now