##// END OF EJS Templates
help: document rewrite.backup-bundle option
Yuya Nishihara -
r41243:25cec00b default
parent child Browse files
Show More
@@ -1,2241 +1,2240 b''
1 # histedit.py - interactive history editing for mercurial
1 # histedit.py - interactive history editing for mercurial
2 #
2 #
3 # Copyright 2009 Augie Fackler <raf@durin42.com>
3 # Copyright 2009 Augie Fackler <raf@durin42.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 """interactive history editing
7 """interactive history editing
8
8
9 With this extension installed, Mercurial gains one new command: histedit. Usage
9 With this extension installed, Mercurial gains one new command: histedit. Usage
10 is as follows, assuming the following history::
10 is as follows, assuming the following history::
11
11
12 @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42
12 @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42
13 | Add delta
13 | Add delta
14 |
14 |
15 o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42
15 o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42
16 | Add gamma
16 | Add gamma
17 |
17 |
18 o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42
18 o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42
19 | Add beta
19 | Add beta
20 |
20 |
21 o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
21 o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
22 Add alpha
22 Add alpha
23
23
24 If you were to run ``hg histedit c561b4e977df``, you would see the following
24 If you were to run ``hg histedit c561b4e977df``, you would see the following
25 file open in your editor::
25 file open in your editor::
26
26
27 pick c561b4e977df Add beta
27 pick c561b4e977df Add beta
28 pick 030b686bedc4 Add gamma
28 pick 030b686bedc4 Add gamma
29 pick 7c2fd3b9020c Add delta
29 pick 7c2fd3b9020c Add delta
30
30
31 # Edit history between c561b4e977df and 7c2fd3b9020c
31 # Edit history between c561b4e977df and 7c2fd3b9020c
32 #
32 #
33 # Commits are listed from least to most recent
33 # Commits are listed from least to most recent
34 #
34 #
35 # Commands:
35 # Commands:
36 # p, pick = use commit
36 # p, pick = use commit
37 # e, edit = use commit, but stop for amending
37 # e, edit = use commit, but stop for amending
38 # f, fold = use commit, but combine it with the one above
38 # f, fold = use commit, but combine it with the one above
39 # r, roll = like fold, but discard this commit's description and date
39 # r, roll = like fold, but discard this commit's description and date
40 # d, drop = remove commit from history
40 # d, drop = remove commit from history
41 # m, mess = edit commit message without changing commit content
41 # m, mess = edit commit message without changing commit content
42 # b, base = checkout changeset and apply further changesets from there
42 # b, base = checkout changeset and apply further changesets from there
43 #
43 #
44
44
45 In this file, lines beginning with ``#`` are ignored. You must specify a rule
45 In this file, lines beginning with ``#`` are ignored. You must specify a rule
46 for each revision in your history. For example, if you had meant to add gamma
46 for each revision in your history. For example, if you had meant to add gamma
47 before beta, and then wanted to add delta in the same revision as beta, you
47 before beta, and then wanted to add delta in the same revision as beta, you
48 would reorganize the file to look like this::
48 would reorganize the file to look like this::
49
49
50 pick 030b686bedc4 Add gamma
50 pick 030b686bedc4 Add gamma
51 pick c561b4e977df Add beta
51 pick c561b4e977df Add beta
52 fold 7c2fd3b9020c Add delta
52 fold 7c2fd3b9020c Add delta
53
53
54 # Edit history between c561b4e977df and 7c2fd3b9020c
54 # Edit history between c561b4e977df and 7c2fd3b9020c
55 #
55 #
56 # Commits are listed from least to most recent
56 # Commits are listed from least to most recent
57 #
57 #
58 # Commands:
58 # Commands:
59 # p, pick = use commit
59 # p, pick = use commit
60 # e, edit = use commit, but stop for amending
60 # e, edit = use commit, but stop for amending
61 # f, fold = use commit, but combine it with the one above
61 # f, fold = use commit, but combine it with the one above
62 # r, roll = like fold, but discard this commit's description and date
62 # r, roll = like fold, but discard this commit's description and date
63 # d, drop = remove commit from history
63 # d, drop = remove commit from history
64 # m, mess = edit commit message without changing commit content
64 # m, mess = edit commit message without changing commit content
65 # b, base = checkout changeset and apply further changesets from there
65 # b, base = checkout changeset and apply further changesets from there
66 #
66 #
67
67
68 At which point you close the editor and ``histedit`` starts working. When you
68 At which point you close the editor and ``histedit`` starts working. When you
69 specify a ``fold`` operation, ``histedit`` will open an editor when it folds
69 specify a ``fold`` operation, ``histedit`` will open an editor when it folds
70 those revisions together, offering you a chance to clean up the commit message::
70 those revisions together, offering you a chance to clean up the commit message::
71
71
72 Add beta
72 Add beta
73 ***
73 ***
74 Add delta
74 Add delta
75
75
76 Edit the commit message to your liking, then close the editor. The date used
76 Edit the commit message to your liking, then close the editor. The date used
77 for the commit will be the later of the two commits' dates. For this example,
77 for the commit will be the later of the two commits' dates. For this example,
78 let's assume that the commit message was changed to ``Add beta and delta.``
78 let's assume that the commit message was changed to ``Add beta and delta.``
79 After histedit has run and had a chance to remove any old or temporary
79 After histedit has run and had a chance to remove any old or temporary
80 revisions it needed, the history looks like this::
80 revisions it needed, the history looks like this::
81
81
82 @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42
82 @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42
83 | Add beta and delta.
83 | Add beta and delta.
84 |
84 |
85 o 1 081603921c3f 2009-04-27 18:04 -0500 durin42
85 o 1 081603921c3f 2009-04-27 18:04 -0500 durin42
86 | Add gamma
86 | Add gamma
87 |
87 |
88 o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
88 o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
89 Add alpha
89 Add alpha
90
90
91 Note that ``histedit`` does *not* remove any revisions (even its own temporary
91 Note that ``histedit`` does *not* remove any revisions (even its own temporary
92 ones) until after it has completed all the editing operations, so it will
92 ones) until after it has completed all the editing operations, so it will
93 probably perform several strip operations when it's done. For the above example,
93 probably perform several strip operations when it's done. For the above example,
94 it had to run strip twice. Strip can be slow depending on a variety of factors,
94 it had to run strip twice. Strip can be slow depending on a variety of factors,
95 so you might need to be a little patient. You can choose to keep the original
95 so you might need to be a little patient. You can choose to keep the original
96 revisions by passing the ``--keep`` flag.
96 revisions by passing the ``--keep`` flag.
97
97
98 The ``edit`` operation will drop you back to a command prompt,
98 The ``edit`` operation will drop you back to a command prompt,
99 allowing you to edit files freely, or even use ``hg record`` to commit
99 allowing you to edit files freely, or even use ``hg record`` to commit
100 some changes as a separate commit. When you're done, any remaining
100 some changes as a separate commit. When you're done, any remaining
101 uncommitted changes will be committed as well. When done, run ``hg
101 uncommitted changes will be committed as well. When done, run ``hg
102 histedit --continue`` to finish this step. If there are uncommitted
102 histedit --continue`` to finish this step. If there are uncommitted
103 changes, you'll be prompted for a new commit message, but the default
103 changes, you'll be prompted for a new commit message, but the default
104 commit message will be the original message for the ``edit`` ed
104 commit message will be the original message for the ``edit`` ed
105 revision, and the date of the original commit will be preserved.
105 revision, and the date of the original commit will be preserved.
106
106
107 The ``message`` operation will give you a chance to revise a commit
107 The ``message`` operation will give you a chance to revise a commit
108 message without changing the contents. It's a shortcut for doing
108 message without changing the contents. It's a shortcut for doing
109 ``edit`` immediately followed by `hg histedit --continue``.
109 ``edit`` immediately followed by `hg histedit --continue``.
110
110
111 If ``histedit`` encounters a conflict when moving a revision (while
111 If ``histedit`` encounters a conflict when moving a revision (while
112 handling ``pick`` or ``fold``), it'll stop in a similar manner to
112 handling ``pick`` or ``fold``), it'll stop in a similar manner to
113 ``edit`` with the difference that it won't prompt you for a commit
113 ``edit`` with the difference that it won't prompt you for a commit
114 message when done. If you decide at this point that you don't like how
114 message when done. If you decide at this point that you don't like how
115 much work it will be to rearrange history, or that you made a mistake,
115 much work it will be to rearrange history, or that you made a mistake,
116 you can use ``hg histedit --abort`` to abandon the new changes you
116 you can use ``hg histedit --abort`` to abandon the new changes you
117 have made and return to the state before you attempted to edit your
117 have made and return to the state before you attempted to edit your
118 history.
118 history.
119
119
120 If we clone the histedit-ed example repository above and add four more
120 If we clone the histedit-ed example repository above and add four more
121 changes, such that we have the following history::
121 changes, such that we have the following history::
122
122
123 @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan
123 @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan
124 | Add theta
124 | Add theta
125 |
125 |
126 o 5 140988835471 2009-04-27 18:04 -0500 stefan
126 o 5 140988835471 2009-04-27 18:04 -0500 stefan
127 | Add eta
127 | Add eta
128 |
128 |
129 o 4 122930637314 2009-04-27 18:04 -0500 stefan
129 o 4 122930637314 2009-04-27 18:04 -0500 stefan
130 | Add zeta
130 | Add zeta
131 |
131 |
132 o 3 836302820282 2009-04-27 18:04 -0500 stefan
132 o 3 836302820282 2009-04-27 18:04 -0500 stefan
133 | Add epsilon
133 | Add epsilon
134 |
134 |
135 o 2 989b4d060121 2009-04-27 18:04 -0500 durin42
135 o 2 989b4d060121 2009-04-27 18:04 -0500 durin42
136 | Add beta and delta.
136 | Add beta and delta.
137 |
137 |
138 o 1 081603921c3f 2009-04-27 18:04 -0500 durin42
138 o 1 081603921c3f 2009-04-27 18:04 -0500 durin42
139 | Add gamma
139 | Add gamma
140 |
140 |
141 o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
141 o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
142 Add alpha
142 Add alpha
143
143
144 If you run ``hg histedit --outgoing`` on the clone then it is the same
144 If you run ``hg histedit --outgoing`` on the clone then it is the same
145 as running ``hg histedit 836302820282``. If you need plan to push to a
145 as running ``hg histedit 836302820282``. If you need plan to push to a
146 repository that Mercurial does not detect to be related to the source
146 repository that Mercurial does not detect to be related to the source
147 repo, you can add a ``--force`` option.
147 repo, you can add a ``--force`` option.
148
148
149 Config
149 Config
150 ------
150 ------
151
151
152 Histedit rule lines are truncated to 80 characters by default. You
152 Histedit rule lines are truncated to 80 characters by default. You
153 can customize this behavior by setting a different length in your
153 can customize this behavior by setting a different length in your
154 configuration file::
154 configuration file::
155
155
156 [histedit]
156 [histedit]
157 linelen = 120 # truncate rule lines at 120 characters
157 linelen = 120 # truncate rule lines at 120 characters
158
158
159 ``hg histedit`` attempts to automatically choose an appropriate base
159 ``hg histedit`` attempts to automatically choose an appropriate base
160 revision to use. To change which base revision is used, define a
160 revision to use. To change which base revision is used, define a
161 revset in your configuration file::
161 revset in your configuration file::
162
162
163 [histedit]
163 [histedit]
164 defaultrev = only(.) & draft()
164 defaultrev = only(.) & draft()
165
165
166 By default each edited revision needs to be present in histedit commands.
166 By default each edited revision needs to be present in histedit commands.
167 To remove revision you need to use ``drop`` operation. You can configure
167 To remove revision you need to use ``drop`` operation. You can configure
168 the drop to be implicit for missing commits by adding::
168 the drop to be implicit for missing commits by adding::
169
169
170 [histedit]
170 [histedit]
171 dropmissing = True
171 dropmissing = True
172
172
173 By default, histedit will close the transaction after each action. For
173 By default, histedit will close the transaction after each action. For
174 performance purposes, you can configure histedit to use a single transaction
174 performance purposes, you can configure histedit to use a single transaction
175 across the entire histedit. WARNING: This setting introduces a significant risk
175 across the entire histedit. WARNING: This setting introduces a significant risk
176 of losing the work you've done in a histedit if the histedit aborts
176 of losing the work you've done in a histedit if the histedit aborts
177 unexpectedly::
177 unexpectedly::
178
178
179 [histedit]
179 [histedit]
180 singletransaction = True
180 singletransaction = True
181
181
182 """
182 """
183
183
184 from __future__ import absolute_import
184 from __future__ import absolute_import
185
185
186 # chistedit dependencies that are not available everywhere
186 # chistedit dependencies that are not available everywhere
187 try:
187 try:
188 import fcntl
188 import fcntl
189 import termios
189 import termios
190 except ImportError:
190 except ImportError:
191 fcntl = None
191 fcntl = None
192 termios = None
192 termios = None
193
193
194 import functools
194 import functools
195 import os
195 import os
196 import struct
196 import struct
197
197
198 from mercurial.i18n import _
198 from mercurial.i18n import _
199 from mercurial import (
199 from mercurial import (
200 bundle2,
200 bundle2,
201 cmdutil,
201 cmdutil,
202 context,
202 context,
203 copies,
203 copies,
204 destutil,
204 destutil,
205 discovery,
205 discovery,
206 error,
206 error,
207 exchange,
207 exchange,
208 extensions,
208 extensions,
209 hg,
209 hg,
210 logcmdutil,
210 logcmdutil,
211 merge as mergemod,
211 merge as mergemod,
212 mergeutil,
212 mergeutil,
213 node,
213 node,
214 obsolete,
214 obsolete,
215 pycompat,
215 pycompat,
216 registrar,
216 registrar,
217 repair,
217 repair,
218 scmutil,
218 scmutil,
219 state as statemod,
219 state as statemod,
220 util,
220 util,
221 )
221 )
222 from mercurial.utils import (
222 from mercurial.utils import (
223 stringutil,
223 stringutil,
224 )
224 )
225
225
226 pickle = util.pickle
226 pickle = util.pickle
227 cmdtable = {}
227 cmdtable = {}
228 command = registrar.command(cmdtable)
228 command = registrar.command(cmdtable)
229
229
230 configtable = {}
230 configtable = {}
231 configitem = registrar.configitem(configtable)
231 configitem = registrar.configitem(configtable)
232 configitem('experimental', 'histedit.autoverb',
232 configitem('experimental', 'histedit.autoverb',
233 default=False,
233 default=False,
234 )
234 )
235 configitem('histedit', 'defaultrev',
235 configitem('histedit', 'defaultrev',
236 default=None,
236 default=None,
237 )
237 )
238 configitem('histedit', 'dropmissing',
238 configitem('histedit', 'dropmissing',
239 default=False,
239 default=False,
240 )
240 )
241 configitem('histedit', 'linelen',
241 configitem('histedit', 'linelen',
242 default=80,
242 default=80,
243 )
243 )
244 configitem('histedit', 'singletransaction',
244 configitem('histedit', 'singletransaction',
245 default=False,
245 default=False,
246 )
246 )
247 configitem('ui', 'interface.histedit',
247 configitem('ui', 'interface.histedit',
248 default=None,
248 default=None,
249 )
249 )
250
250
251 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
251 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
252 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
252 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
253 # be specifying the version(s) of Mercurial they are tested with, or
253 # be specifying the version(s) of Mercurial they are tested with, or
254 # leave the attribute unspecified.
254 # leave the attribute unspecified.
255 testedwith = 'ships-with-hg-core'
255 testedwith = 'ships-with-hg-core'
256
256
257 actiontable = {}
257 actiontable = {}
258 primaryactions = set()
258 primaryactions = set()
259 secondaryactions = set()
259 secondaryactions = set()
260 tertiaryactions = set()
260 tertiaryactions = set()
261 internalactions = set()
261 internalactions = set()
262
262
263 def geteditcomment(ui, first, last):
263 def geteditcomment(ui, first, last):
264 """ construct the editor comment
264 """ construct the editor comment
265 The comment includes::
265 The comment includes::
266 - an intro
266 - an intro
267 - sorted primary commands
267 - sorted primary commands
268 - sorted short commands
268 - sorted short commands
269 - sorted long commands
269 - sorted long commands
270 - additional hints
270 - additional hints
271
271
272 Commands are only included once.
272 Commands are only included once.
273 """
273 """
274 intro = _("""Edit history between %s and %s
274 intro = _("""Edit history between %s and %s
275
275
276 Commits are listed from least to most recent
276 Commits are listed from least to most recent
277
277
278 You can reorder changesets by reordering the lines
278 You can reorder changesets by reordering the lines
279
279
280 Commands:
280 Commands:
281 """)
281 """)
282 actions = []
282 actions = []
283 def addverb(v):
283 def addverb(v):
284 a = actiontable[v]
284 a = actiontable[v]
285 lines = a.message.split("\n")
285 lines = a.message.split("\n")
286 if len(a.verbs):
286 if len(a.verbs):
287 v = ', '.join(sorted(a.verbs, key=lambda v: len(v)))
287 v = ', '.join(sorted(a.verbs, key=lambda v: len(v)))
288 actions.append(" %s = %s" % (v, lines[0]))
288 actions.append(" %s = %s" % (v, lines[0]))
289 actions.extend([' %s' for l in lines[1:]])
289 actions.extend([' %s' for l in lines[1:]])
290
290
291 for v in (
291 for v in (
292 sorted(primaryactions) +
292 sorted(primaryactions) +
293 sorted(secondaryactions) +
293 sorted(secondaryactions) +
294 sorted(tertiaryactions)
294 sorted(tertiaryactions)
295 ):
295 ):
296 addverb(v)
296 addverb(v)
297 actions.append('')
297 actions.append('')
298
298
299 hints = []
299 hints = []
300 if ui.configbool('histedit', 'dropmissing'):
300 if ui.configbool('histedit', 'dropmissing'):
301 hints.append("Deleting a changeset from the list "
301 hints.append("Deleting a changeset from the list "
302 "will DISCARD it from the edited history!")
302 "will DISCARD it from the edited history!")
303
303
304 lines = (intro % (first, last)).split('\n') + actions + hints
304 lines = (intro % (first, last)).split('\n') + actions + hints
305
305
306 return ''.join(['# %s\n' % l if l else '#\n' for l in lines])
306 return ''.join(['# %s\n' % l if l else '#\n' for l in lines])
307
307
308 class histeditstate(object):
308 class histeditstate(object):
309 def __init__(self, repo):
309 def __init__(self, repo):
310 self.repo = repo
310 self.repo = repo
311 self.actions = None
311 self.actions = None
312 self.keep = None
312 self.keep = None
313 self.topmost = None
313 self.topmost = None
314 self.parentctxnode = None
314 self.parentctxnode = None
315 self.lock = None
315 self.lock = None
316 self.wlock = None
316 self.wlock = None
317 self.backupfile = None
317 self.backupfile = None
318 self.stateobj = statemod.cmdstate(repo, 'histedit-state')
318 self.stateobj = statemod.cmdstate(repo, 'histedit-state')
319 self.replacements = []
319 self.replacements = []
320
320
321 def read(self):
321 def read(self):
322 """Load histedit state from disk and set fields appropriately."""
322 """Load histedit state from disk and set fields appropriately."""
323 if not self.stateobj.exists():
323 if not self.stateobj.exists():
324 cmdutil.wrongtooltocontinue(self.repo, _('histedit'))
324 cmdutil.wrongtooltocontinue(self.repo, _('histedit'))
325
325
326 data = self._read()
326 data = self._read()
327
327
328 self.parentctxnode = data['parentctxnode']
328 self.parentctxnode = data['parentctxnode']
329 actions = parserules(data['rules'], self)
329 actions = parserules(data['rules'], self)
330 self.actions = actions
330 self.actions = actions
331 self.keep = data['keep']
331 self.keep = data['keep']
332 self.topmost = data['topmost']
332 self.topmost = data['topmost']
333 self.replacements = data['replacements']
333 self.replacements = data['replacements']
334 self.backupfile = data['backupfile']
334 self.backupfile = data['backupfile']
335
335
336 def _read(self):
336 def _read(self):
337 fp = self.repo.vfs.read('histedit-state')
337 fp = self.repo.vfs.read('histedit-state')
338 if fp.startswith('v1\n'):
338 if fp.startswith('v1\n'):
339 data = self._load()
339 data = self._load()
340 parentctxnode, rules, keep, topmost, replacements, backupfile = data
340 parentctxnode, rules, keep, topmost, replacements, backupfile = data
341 else:
341 else:
342 data = pickle.loads(fp)
342 data = pickle.loads(fp)
343 parentctxnode, rules, keep, topmost, replacements = data
343 parentctxnode, rules, keep, topmost, replacements = data
344 backupfile = None
344 backupfile = None
345 rules = "\n".join(["%s %s" % (verb, rest) for [verb, rest] in rules])
345 rules = "\n".join(["%s %s" % (verb, rest) for [verb, rest] in rules])
346
346
347 return {'parentctxnode': parentctxnode, "rules": rules, "keep": keep,
347 return {'parentctxnode': parentctxnode, "rules": rules, "keep": keep,
348 "topmost": topmost, "replacements": replacements,
348 "topmost": topmost, "replacements": replacements,
349 "backupfile": backupfile}
349 "backupfile": backupfile}
350
350
351 def write(self, tr=None):
351 def write(self, tr=None):
352 if tr:
352 if tr:
353 tr.addfilegenerator('histedit-state', ('histedit-state',),
353 tr.addfilegenerator('histedit-state', ('histedit-state',),
354 self._write, location='plain')
354 self._write, location='plain')
355 else:
355 else:
356 with self.repo.vfs("histedit-state", "w") as f:
356 with self.repo.vfs("histedit-state", "w") as f:
357 self._write(f)
357 self._write(f)
358
358
359 def _write(self, fp):
359 def _write(self, fp):
360 fp.write('v1\n')
360 fp.write('v1\n')
361 fp.write('%s\n' % node.hex(self.parentctxnode))
361 fp.write('%s\n' % node.hex(self.parentctxnode))
362 fp.write('%s\n' % node.hex(self.topmost))
362 fp.write('%s\n' % node.hex(self.topmost))
363 fp.write('%s\n' % ('True' if self.keep else 'False'))
363 fp.write('%s\n' % ('True' if self.keep else 'False'))
364 fp.write('%d\n' % len(self.actions))
364 fp.write('%d\n' % len(self.actions))
365 for action in self.actions:
365 for action in self.actions:
366 fp.write('%s\n' % action.tostate())
366 fp.write('%s\n' % action.tostate())
367 fp.write('%d\n' % len(self.replacements))
367 fp.write('%d\n' % len(self.replacements))
368 for replacement in self.replacements:
368 for replacement in self.replacements:
369 fp.write('%s%s\n' % (node.hex(replacement[0]), ''.join(node.hex(r)
369 fp.write('%s%s\n' % (node.hex(replacement[0]), ''.join(node.hex(r)
370 for r in replacement[1])))
370 for r in replacement[1])))
371 backupfile = self.backupfile
371 backupfile = self.backupfile
372 if not backupfile:
372 if not backupfile:
373 backupfile = ''
373 backupfile = ''
374 fp.write('%s\n' % backupfile)
374 fp.write('%s\n' % backupfile)
375
375
376 def _load(self):
376 def _load(self):
377 fp = self.repo.vfs('histedit-state', 'r')
377 fp = self.repo.vfs('histedit-state', 'r')
378 lines = [l[:-1] for l in fp.readlines()]
378 lines = [l[:-1] for l in fp.readlines()]
379
379
380 index = 0
380 index = 0
381 lines[index] # version number
381 lines[index] # version number
382 index += 1
382 index += 1
383
383
384 parentctxnode = node.bin(lines[index])
384 parentctxnode = node.bin(lines[index])
385 index += 1
385 index += 1
386
386
387 topmost = node.bin(lines[index])
387 topmost = node.bin(lines[index])
388 index += 1
388 index += 1
389
389
390 keep = lines[index] == 'True'
390 keep = lines[index] == 'True'
391 index += 1
391 index += 1
392
392
393 # Rules
393 # Rules
394 rules = []
394 rules = []
395 rulelen = int(lines[index])
395 rulelen = int(lines[index])
396 index += 1
396 index += 1
397 for i in pycompat.xrange(rulelen):
397 for i in pycompat.xrange(rulelen):
398 ruleaction = lines[index]
398 ruleaction = lines[index]
399 index += 1
399 index += 1
400 rule = lines[index]
400 rule = lines[index]
401 index += 1
401 index += 1
402 rules.append((ruleaction, rule))
402 rules.append((ruleaction, rule))
403
403
404 # Replacements
404 # Replacements
405 replacements = []
405 replacements = []
406 replacementlen = int(lines[index])
406 replacementlen = int(lines[index])
407 index += 1
407 index += 1
408 for i in pycompat.xrange(replacementlen):
408 for i in pycompat.xrange(replacementlen):
409 replacement = lines[index]
409 replacement = lines[index]
410 original = node.bin(replacement[:40])
410 original = node.bin(replacement[:40])
411 succ = [node.bin(replacement[i:i + 40]) for i in
411 succ = [node.bin(replacement[i:i + 40]) for i in
412 range(40, len(replacement), 40)]
412 range(40, len(replacement), 40)]
413 replacements.append((original, succ))
413 replacements.append((original, succ))
414 index += 1
414 index += 1
415
415
416 backupfile = lines[index]
416 backupfile = lines[index]
417 index += 1
417 index += 1
418
418
419 fp.close()
419 fp.close()
420
420
421 return parentctxnode, rules, keep, topmost, replacements, backupfile
421 return parentctxnode, rules, keep, topmost, replacements, backupfile
422
422
423 def clear(self):
423 def clear(self):
424 if self.inprogress():
424 if self.inprogress():
425 self.repo.vfs.unlink('histedit-state')
425 self.repo.vfs.unlink('histedit-state')
426
426
427 def inprogress(self):
427 def inprogress(self):
428 return self.repo.vfs.exists('histedit-state')
428 return self.repo.vfs.exists('histedit-state')
429
429
430
430
431 class histeditaction(object):
431 class histeditaction(object):
432 def __init__(self, state, node):
432 def __init__(self, state, node):
433 self.state = state
433 self.state = state
434 self.repo = state.repo
434 self.repo = state.repo
435 self.node = node
435 self.node = node
436
436
437 @classmethod
437 @classmethod
438 def fromrule(cls, state, rule):
438 def fromrule(cls, state, rule):
439 """Parses the given rule, returning an instance of the histeditaction.
439 """Parses the given rule, returning an instance of the histeditaction.
440 """
440 """
441 ruleid = rule.strip().split(' ', 1)[0]
441 ruleid = rule.strip().split(' ', 1)[0]
442 # ruleid can be anything from rev numbers, hashes, "bookmarks" etc
442 # ruleid can be anything from rev numbers, hashes, "bookmarks" etc
443 # Check for validation of rule ids and get the rulehash
443 # Check for validation of rule ids and get the rulehash
444 try:
444 try:
445 rev = node.bin(ruleid)
445 rev = node.bin(ruleid)
446 except TypeError:
446 except TypeError:
447 try:
447 try:
448 _ctx = scmutil.revsingle(state.repo, ruleid)
448 _ctx = scmutil.revsingle(state.repo, ruleid)
449 rulehash = _ctx.hex()
449 rulehash = _ctx.hex()
450 rev = node.bin(rulehash)
450 rev = node.bin(rulehash)
451 except error.RepoLookupError:
451 except error.RepoLookupError:
452 raise error.ParseError(_("invalid changeset %s") % ruleid)
452 raise error.ParseError(_("invalid changeset %s") % ruleid)
453 return cls(state, rev)
453 return cls(state, rev)
454
454
455 def verify(self, prev, expected, seen):
455 def verify(self, prev, expected, seen):
456 """ Verifies semantic correctness of the rule"""
456 """ Verifies semantic correctness of the rule"""
457 repo = self.repo
457 repo = self.repo
458 ha = node.hex(self.node)
458 ha = node.hex(self.node)
459 self.node = scmutil.resolvehexnodeidprefix(repo, ha)
459 self.node = scmutil.resolvehexnodeidprefix(repo, ha)
460 if self.node is None:
460 if self.node is None:
461 raise error.ParseError(_('unknown changeset %s listed') % ha[:12])
461 raise error.ParseError(_('unknown changeset %s listed') % ha[:12])
462 self._verifynodeconstraints(prev, expected, seen)
462 self._verifynodeconstraints(prev, expected, seen)
463
463
464 def _verifynodeconstraints(self, prev, expected, seen):
464 def _verifynodeconstraints(self, prev, expected, seen):
465 # by default command need a node in the edited list
465 # by default command need a node in the edited list
466 if self.node not in expected:
466 if self.node not in expected:
467 raise error.ParseError(_('%s "%s" changeset was not a candidate')
467 raise error.ParseError(_('%s "%s" changeset was not a candidate')
468 % (self.verb, node.short(self.node)),
468 % (self.verb, node.short(self.node)),
469 hint=_('only use listed changesets'))
469 hint=_('only use listed changesets'))
470 # and only one command per node
470 # and only one command per node
471 if self.node in seen:
471 if self.node in seen:
472 raise error.ParseError(_('duplicated command for changeset %s') %
472 raise error.ParseError(_('duplicated command for changeset %s') %
473 node.short(self.node))
473 node.short(self.node))
474
474
475 def torule(self):
475 def torule(self):
476 """build a histedit rule line for an action
476 """build a histedit rule line for an action
477
477
478 by default lines are in the form:
478 by default lines are in the form:
479 <hash> <rev> <summary>
479 <hash> <rev> <summary>
480 """
480 """
481 ctx = self.repo[self.node]
481 ctx = self.repo[self.node]
482 summary = _getsummary(ctx)
482 summary = _getsummary(ctx)
483 line = '%s %s %d %s' % (self.verb, ctx, ctx.rev(), summary)
483 line = '%s %s %d %s' % (self.verb, ctx, ctx.rev(), summary)
484 # trim to 75 columns by default so it's not stupidly wide in my editor
484 # trim to 75 columns by default so it's not stupidly wide in my editor
485 # (the 5 more are left for verb)
485 # (the 5 more are left for verb)
486 maxlen = self.repo.ui.configint('histedit', 'linelen')
486 maxlen = self.repo.ui.configint('histedit', 'linelen')
487 maxlen = max(maxlen, 22) # avoid truncating hash
487 maxlen = max(maxlen, 22) # avoid truncating hash
488 return stringutil.ellipsis(line, maxlen)
488 return stringutil.ellipsis(line, maxlen)
489
489
490 def tostate(self):
490 def tostate(self):
491 """Print an action in format used by histedit state files
491 """Print an action in format used by histedit state files
492 (the first line is a verb, the remainder is the second)
492 (the first line is a verb, the remainder is the second)
493 """
493 """
494 return "%s\n%s" % (self.verb, node.hex(self.node))
494 return "%s\n%s" % (self.verb, node.hex(self.node))
495
495
496 def run(self):
496 def run(self):
497 """Runs the action. The default behavior is simply apply the action's
497 """Runs the action. The default behavior is simply apply the action's
498 rulectx onto the current parentctx."""
498 rulectx onto the current parentctx."""
499 self.applychange()
499 self.applychange()
500 self.continuedirty()
500 self.continuedirty()
501 return self.continueclean()
501 return self.continueclean()
502
502
503 def applychange(self):
503 def applychange(self):
504 """Applies the changes from this action's rulectx onto the current
504 """Applies the changes from this action's rulectx onto the current
505 parentctx, but does not commit them."""
505 parentctx, but does not commit them."""
506 repo = self.repo
506 repo = self.repo
507 rulectx = repo[self.node]
507 rulectx = repo[self.node]
508 repo.ui.pushbuffer(error=True, labeled=True)
508 repo.ui.pushbuffer(error=True, labeled=True)
509 hg.update(repo, self.state.parentctxnode, quietempty=True)
509 hg.update(repo, self.state.parentctxnode, quietempty=True)
510 stats = applychanges(repo.ui, repo, rulectx, {})
510 stats = applychanges(repo.ui, repo, rulectx, {})
511 repo.dirstate.setbranch(rulectx.branch())
511 repo.dirstate.setbranch(rulectx.branch())
512 if stats.unresolvedcount:
512 if stats.unresolvedcount:
513 buf = repo.ui.popbuffer()
513 buf = repo.ui.popbuffer()
514 repo.ui.write(buf)
514 repo.ui.write(buf)
515 raise error.InterventionRequired(
515 raise error.InterventionRequired(
516 _('Fix up the change (%s %s)') %
516 _('Fix up the change (%s %s)') %
517 (self.verb, node.short(self.node)),
517 (self.verb, node.short(self.node)),
518 hint=_('hg histedit --continue to resume'))
518 hint=_('hg histedit --continue to resume'))
519 else:
519 else:
520 repo.ui.popbuffer()
520 repo.ui.popbuffer()
521
521
522 def continuedirty(self):
522 def continuedirty(self):
523 """Continues the action when changes have been applied to the working
523 """Continues the action when changes have been applied to the working
524 copy. The default behavior is to commit the dirty changes."""
524 copy. The default behavior is to commit the dirty changes."""
525 repo = self.repo
525 repo = self.repo
526 rulectx = repo[self.node]
526 rulectx = repo[self.node]
527
527
528 editor = self.commiteditor()
528 editor = self.commiteditor()
529 commit = commitfuncfor(repo, rulectx)
529 commit = commitfuncfor(repo, rulectx)
530
530
531 commit(text=rulectx.description(), user=rulectx.user(),
531 commit(text=rulectx.description(), user=rulectx.user(),
532 date=rulectx.date(), extra=rulectx.extra(), editor=editor)
532 date=rulectx.date(), extra=rulectx.extra(), editor=editor)
533
533
534 def commiteditor(self):
534 def commiteditor(self):
535 """The editor to be used to edit the commit message."""
535 """The editor to be used to edit the commit message."""
536 return False
536 return False
537
537
538 def continueclean(self):
538 def continueclean(self):
539 """Continues the action when the working copy is clean. The default
539 """Continues the action when the working copy is clean. The default
540 behavior is to accept the current commit as the new version of the
540 behavior is to accept the current commit as the new version of the
541 rulectx."""
541 rulectx."""
542 ctx = self.repo['.']
542 ctx = self.repo['.']
543 if ctx.node() == self.state.parentctxnode:
543 if ctx.node() == self.state.parentctxnode:
544 self.repo.ui.warn(_('%s: skipping changeset (no changes)\n') %
544 self.repo.ui.warn(_('%s: skipping changeset (no changes)\n') %
545 node.short(self.node))
545 node.short(self.node))
546 return ctx, [(self.node, tuple())]
546 return ctx, [(self.node, tuple())]
547 if ctx.node() == self.node:
547 if ctx.node() == self.node:
548 # Nothing changed
548 # Nothing changed
549 return ctx, []
549 return ctx, []
550 return ctx, [(self.node, (ctx.node(),))]
550 return ctx, [(self.node, (ctx.node(),))]
551
551
552 def commitfuncfor(repo, src):
552 def commitfuncfor(repo, src):
553 """Build a commit function for the replacement of <src>
553 """Build a commit function for the replacement of <src>
554
554
555 This function ensure we apply the same treatment to all changesets.
555 This function ensure we apply the same treatment to all changesets.
556
556
557 - Add a 'histedit_source' entry in extra.
557 - Add a 'histedit_source' entry in extra.
558
558
559 Note that fold has its own separated logic because its handling is a bit
559 Note that fold has its own separated logic because its handling is a bit
560 different and not easily factored out of the fold method.
560 different and not easily factored out of the fold method.
561 """
561 """
562 phasemin = src.phase()
562 phasemin = src.phase()
563 def commitfunc(**kwargs):
563 def commitfunc(**kwargs):
564 overrides = {('phases', 'new-commit'): phasemin}
564 overrides = {('phases', 'new-commit'): phasemin}
565 with repo.ui.configoverride(overrides, 'histedit'):
565 with repo.ui.configoverride(overrides, 'histedit'):
566 extra = kwargs.get(r'extra', {}).copy()
566 extra = kwargs.get(r'extra', {}).copy()
567 extra['histedit_source'] = src.hex()
567 extra['histedit_source'] = src.hex()
568 kwargs[r'extra'] = extra
568 kwargs[r'extra'] = extra
569 return repo.commit(**kwargs)
569 return repo.commit(**kwargs)
570 return commitfunc
570 return commitfunc
571
571
572 def applychanges(ui, repo, ctx, opts):
572 def applychanges(ui, repo, ctx, opts):
573 """Merge changeset from ctx (only) in the current working directory"""
573 """Merge changeset from ctx (only) in the current working directory"""
574 wcpar = repo.dirstate.parents()[0]
574 wcpar = repo.dirstate.parents()[0]
575 if ctx.p1().node() == wcpar:
575 if ctx.p1().node() == wcpar:
576 # edits are "in place" we do not need to make any merge,
576 # edits are "in place" we do not need to make any merge,
577 # just applies changes on parent for editing
577 # just applies changes on parent for editing
578 cmdutil.revert(ui, repo, ctx, (wcpar, node.nullid), all=True)
578 cmdutil.revert(ui, repo, ctx, (wcpar, node.nullid), all=True)
579 stats = mergemod.updateresult(0, 0, 0, 0)
579 stats = mergemod.updateresult(0, 0, 0, 0)
580 else:
580 else:
581 try:
581 try:
582 # ui.forcemerge is an internal variable, do not document
582 # ui.forcemerge is an internal variable, do not document
583 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
583 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
584 'histedit')
584 'histedit')
585 stats = mergemod.graft(repo, ctx, ctx.p1(), ['local', 'histedit'])
585 stats = mergemod.graft(repo, ctx, ctx.p1(), ['local', 'histedit'])
586 finally:
586 finally:
587 repo.ui.setconfig('ui', 'forcemerge', '', 'histedit')
587 repo.ui.setconfig('ui', 'forcemerge', '', 'histedit')
588 return stats
588 return stats
589
589
590 def collapse(repo, firstctx, lastctx, commitopts, skipprompt=False):
590 def collapse(repo, firstctx, lastctx, commitopts, skipprompt=False):
591 """collapse the set of revisions from first to last as new one.
591 """collapse the set of revisions from first to last as new one.
592
592
593 Expected commit options are:
593 Expected commit options are:
594 - message
594 - message
595 - date
595 - date
596 - username
596 - username
597 Commit message is edited in all cases.
597 Commit message is edited in all cases.
598
598
599 This function works in memory."""
599 This function works in memory."""
600 ctxs = list(repo.set('%d::%d', firstctx.rev(), lastctx.rev()))
600 ctxs = list(repo.set('%d::%d', firstctx.rev(), lastctx.rev()))
601 if not ctxs:
601 if not ctxs:
602 return None
602 return None
603 for c in ctxs:
603 for c in ctxs:
604 if not c.mutable():
604 if not c.mutable():
605 raise error.ParseError(
605 raise error.ParseError(
606 _("cannot fold into public change %s") % node.short(c.node()))
606 _("cannot fold into public change %s") % node.short(c.node()))
607 base = firstctx.parents()[0]
607 base = firstctx.parents()[0]
608
608
609 # commit a new version of the old changeset, including the update
609 # commit a new version of the old changeset, including the update
610 # collect all files which might be affected
610 # collect all files which might be affected
611 files = set()
611 files = set()
612 for ctx in ctxs:
612 for ctx in ctxs:
613 files.update(ctx.files())
613 files.update(ctx.files())
614
614
615 # Recompute copies (avoid recording a -> b -> a)
615 # Recompute copies (avoid recording a -> b -> a)
616 copied = copies.pathcopies(base, lastctx)
616 copied = copies.pathcopies(base, lastctx)
617
617
618 # prune files which were reverted by the updates
618 # prune files which were reverted by the updates
619 files = [f for f in files if not cmdutil.samefile(f, lastctx, base)]
619 files = [f for f in files if not cmdutil.samefile(f, lastctx, base)]
620 # commit version of these files as defined by head
620 # commit version of these files as defined by head
621 headmf = lastctx.manifest()
621 headmf = lastctx.manifest()
622 def filectxfn(repo, ctx, path):
622 def filectxfn(repo, ctx, path):
623 if path in headmf:
623 if path in headmf:
624 fctx = lastctx[path]
624 fctx = lastctx[path]
625 flags = fctx.flags()
625 flags = fctx.flags()
626 mctx = context.memfilectx(repo, ctx,
626 mctx = context.memfilectx(repo, ctx,
627 fctx.path(), fctx.data(),
627 fctx.path(), fctx.data(),
628 islink='l' in flags,
628 islink='l' in flags,
629 isexec='x' in flags,
629 isexec='x' in flags,
630 copied=copied.get(path))
630 copied=copied.get(path))
631 return mctx
631 return mctx
632 return None
632 return None
633
633
634 if commitopts.get('message'):
634 if commitopts.get('message'):
635 message = commitopts['message']
635 message = commitopts['message']
636 else:
636 else:
637 message = firstctx.description()
637 message = firstctx.description()
638 user = commitopts.get('user')
638 user = commitopts.get('user')
639 date = commitopts.get('date')
639 date = commitopts.get('date')
640 extra = commitopts.get('extra')
640 extra = commitopts.get('extra')
641
641
642 parents = (firstctx.p1().node(), firstctx.p2().node())
642 parents = (firstctx.p1().node(), firstctx.p2().node())
643 editor = None
643 editor = None
644 if not skipprompt:
644 if not skipprompt:
645 editor = cmdutil.getcommiteditor(edit=True, editform='histedit.fold')
645 editor = cmdutil.getcommiteditor(edit=True, editform='histedit.fold')
646 new = context.memctx(repo,
646 new = context.memctx(repo,
647 parents=parents,
647 parents=parents,
648 text=message,
648 text=message,
649 files=files,
649 files=files,
650 filectxfn=filectxfn,
650 filectxfn=filectxfn,
651 user=user,
651 user=user,
652 date=date,
652 date=date,
653 extra=extra,
653 extra=extra,
654 editor=editor)
654 editor=editor)
655 return repo.commitctx(new)
655 return repo.commitctx(new)
656
656
657 def _isdirtywc(repo):
657 def _isdirtywc(repo):
658 return repo[None].dirty(missing=True)
658 return repo[None].dirty(missing=True)
659
659
660 def abortdirty():
660 def abortdirty():
661 raise error.Abort(_('working copy has pending changes'),
661 raise error.Abort(_('working copy has pending changes'),
662 hint=_('amend, commit, or revert them and run histedit '
662 hint=_('amend, commit, or revert them and run histedit '
663 '--continue, or abort with histedit --abort'))
663 '--continue, or abort with histedit --abort'))
664
664
665 def action(verbs, message, priority=False, internal=False):
665 def action(verbs, message, priority=False, internal=False):
666 def wrap(cls):
666 def wrap(cls):
667 assert not priority or not internal
667 assert not priority or not internal
668 verb = verbs[0]
668 verb = verbs[0]
669 if priority:
669 if priority:
670 primaryactions.add(verb)
670 primaryactions.add(verb)
671 elif internal:
671 elif internal:
672 internalactions.add(verb)
672 internalactions.add(verb)
673 elif len(verbs) > 1:
673 elif len(verbs) > 1:
674 secondaryactions.add(verb)
674 secondaryactions.add(verb)
675 else:
675 else:
676 tertiaryactions.add(verb)
676 tertiaryactions.add(verb)
677
677
678 cls.verb = verb
678 cls.verb = verb
679 cls.verbs = verbs
679 cls.verbs = verbs
680 cls.message = message
680 cls.message = message
681 for verb in verbs:
681 for verb in verbs:
682 actiontable[verb] = cls
682 actiontable[verb] = cls
683 return cls
683 return cls
684 return wrap
684 return wrap
685
685
686 @action(['pick', 'p'],
686 @action(['pick', 'p'],
687 _('use commit'),
687 _('use commit'),
688 priority=True)
688 priority=True)
689 class pick(histeditaction):
689 class pick(histeditaction):
690 def run(self):
690 def run(self):
691 rulectx = self.repo[self.node]
691 rulectx = self.repo[self.node]
692 if rulectx.parents()[0].node() == self.state.parentctxnode:
692 if rulectx.parents()[0].node() == self.state.parentctxnode:
693 self.repo.ui.debug('node %s unchanged\n' % node.short(self.node))
693 self.repo.ui.debug('node %s unchanged\n' % node.short(self.node))
694 return rulectx, []
694 return rulectx, []
695
695
696 return super(pick, self).run()
696 return super(pick, self).run()
697
697
698 @action(['edit', 'e'],
698 @action(['edit', 'e'],
699 _('use commit, but stop for amending'),
699 _('use commit, but stop for amending'),
700 priority=True)
700 priority=True)
701 class edit(histeditaction):
701 class edit(histeditaction):
702 def run(self):
702 def run(self):
703 repo = self.repo
703 repo = self.repo
704 rulectx = repo[self.node]
704 rulectx = repo[self.node]
705 hg.update(repo, self.state.parentctxnode, quietempty=True)
705 hg.update(repo, self.state.parentctxnode, quietempty=True)
706 applychanges(repo.ui, repo, rulectx, {})
706 applychanges(repo.ui, repo, rulectx, {})
707 raise error.InterventionRequired(
707 raise error.InterventionRequired(
708 _('Editing (%s), you may commit or record as needed now.')
708 _('Editing (%s), you may commit or record as needed now.')
709 % node.short(self.node),
709 % node.short(self.node),
710 hint=_('hg histedit --continue to resume'))
710 hint=_('hg histedit --continue to resume'))
711
711
712 def commiteditor(self):
712 def commiteditor(self):
713 return cmdutil.getcommiteditor(edit=True, editform='histedit.edit')
713 return cmdutil.getcommiteditor(edit=True, editform='histedit.edit')
714
714
715 @action(['fold', 'f'],
715 @action(['fold', 'f'],
716 _('use commit, but combine it with the one above'))
716 _('use commit, but combine it with the one above'))
717 class fold(histeditaction):
717 class fold(histeditaction):
718 def verify(self, prev, expected, seen):
718 def verify(self, prev, expected, seen):
719 """ Verifies semantic correctness of the fold rule"""
719 """ Verifies semantic correctness of the fold rule"""
720 super(fold, self).verify(prev, expected, seen)
720 super(fold, self).verify(prev, expected, seen)
721 repo = self.repo
721 repo = self.repo
722 if not prev:
722 if not prev:
723 c = repo[self.node].parents()[0]
723 c = repo[self.node].parents()[0]
724 elif not prev.verb in ('pick', 'base'):
724 elif not prev.verb in ('pick', 'base'):
725 return
725 return
726 else:
726 else:
727 c = repo[prev.node]
727 c = repo[prev.node]
728 if not c.mutable():
728 if not c.mutable():
729 raise error.ParseError(
729 raise error.ParseError(
730 _("cannot fold into public change %s") % node.short(c.node()))
730 _("cannot fold into public change %s") % node.short(c.node()))
731
731
732
732
733 def continuedirty(self):
733 def continuedirty(self):
734 repo = self.repo
734 repo = self.repo
735 rulectx = repo[self.node]
735 rulectx = repo[self.node]
736
736
737 commit = commitfuncfor(repo, rulectx)
737 commit = commitfuncfor(repo, rulectx)
738 commit(text='fold-temp-revision %s' % node.short(self.node),
738 commit(text='fold-temp-revision %s' % node.short(self.node),
739 user=rulectx.user(), date=rulectx.date(),
739 user=rulectx.user(), date=rulectx.date(),
740 extra=rulectx.extra())
740 extra=rulectx.extra())
741
741
742 def continueclean(self):
742 def continueclean(self):
743 repo = self.repo
743 repo = self.repo
744 ctx = repo['.']
744 ctx = repo['.']
745 rulectx = repo[self.node]
745 rulectx = repo[self.node]
746 parentctxnode = self.state.parentctxnode
746 parentctxnode = self.state.parentctxnode
747 if ctx.node() == parentctxnode:
747 if ctx.node() == parentctxnode:
748 repo.ui.warn(_('%s: empty changeset\n') %
748 repo.ui.warn(_('%s: empty changeset\n') %
749 node.short(self.node))
749 node.short(self.node))
750 return ctx, [(self.node, (parentctxnode,))]
750 return ctx, [(self.node, (parentctxnode,))]
751
751
752 parentctx = repo[parentctxnode]
752 parentctx = repo[parentctxnode]
753 newcommits = set(c.node() for c in repo.set('(%d::. - %d)',
753 newcommits = set(c.node() for c in repo.set('(%d::. - %d)',
754 parentctx.rev(),
754 parentctx.rev(),
755 parentctx.rev()))
755 parentctx.rev()))
756 if not newcommits:
756 if not newcommits:
757 repo.ui.warn(_('%s: cannot fold - working copy is not a '
757 repo.ui.warn(_('%s: cannot fold - working copy is not a '
758 'descendant of previous commit %s\n') %
758 'descendant of previous commit %s\n') %
759 (node.short(self.node), node.short(parentctxnode)))
759 (node.short(self.node), node.short(parentctxnode)))
760 return ctx, [(self.node, (ctx.node(),))]
760 return ctx, [(self.node, (ctx.node(),))]
761
761
762 middlecommits = newcommits.copy()
762 middlecommits = newcommits.copy()
763 middlecommits.discard(ctx.node())
763 middlecommits.discard(ctx.node())
764
764
765 return self.finishfold(repo.ui, repo, parentctx, rulectx, ctx.node(),
765 return self.finishfold(repo.ui, repo, parentctx, rulectx, ctx.node(),
766 middlecommits)
766 middlecommits)
767
767
768 def skipprompt(self):
768 def skipprompt(self):
769 """Returns true if the rule should skip the message editor.
769 """Returns true if the rule should skip the message editor.
770
770
771 For example, 'fold' wants to show an editor, but 'rollup'
771 For example, 'fold' wants to show an editor, but 'rollup'
772 doesn't want to.
772 doesn't want to.
773 """
773 """
774 return False
774 return False
775
775
776 def mergedescs(self):
776 def mergedescs(self):
777 """Returns true if the rule should merge messages of multiple changes.
777 """Returns true if the rule should merge messages of multiple changes.
778
778
779 This exists mainly so that 'rollup' rules can be a subclass of
779 This exists mainly so that 'rollup' rules can be a subclass of
780 'fold'.
780 'fold'.
781 """
781 """
782 return True
782 return True
783
783
784 def firstdate(self):
784 def firstdate(self):
785 """Returns true if the rule should preserve the date of the first
785 """Returns true if the rule should preserve the date of the first
786 change.
786 change.
787
787
788 This exists mainly so that 'rollup' rules can be a subclass of
788 This exists mainly so that 'rollup' rules can be a subclass of
789 'fold'.
789 'fold'.
790 """
790 """
791 return False
791 return False
792
792
793 def finishfold(self, ui, repo, ctx, oldctx, newnode, internalchanges):
793 def finishfold(self, ui, repo, ctx, oldctx, newnode, internalchanges):
794 parent = ctx.parents()[0].node()
794 parent = ctx.parents()[0].node()
795 hg.updaterepo(repo, parent, overwrite=False)
795 hg.updaterepo(repo, parent, overwrite=False)
796 ### prepare new commit data
796 ### prepare new commit data
797 commitopts = {}
797 commitopts = {}
798 commitopts['user'] = ctx.user()
798 commitopts['user'] = ctx.user()
799 # commit message
799 # commit message
800 if not self.mergedescs():
800 if not self.mergedescs():
801 newmessage = ctx.description()
801 newmessage = ctx.description()
802 else:
802 else:
803 newmessage = '\n***\n'.join(
803 newmessage = '\n***\n'.join(
804 [ctx.description()] +
804 [ctx.description()] +
805 [repo[r].description() for r in internalchanges] +
805 [repo[r].description() for r in internalchanges] +
806 [oldctx.description()]) + '\n'
806 [oldctx.description()]) + '\n'
807 commitopts['message'] = newmessage
807 commitopts['message'] = newmessage
808 # date
808 # date
809 if self.firstdate():
809 if self.firstdate():
810 commitopts['date'] = ctx.date()
810 commitopts['date'] = ctx.date()
811 else:
811 else:
812 commitopts['date'] = max(ctx.date(), oldctx.date())
812 commitopts['date'] = max(ctx.date(), oldctx.date())
813 extra = ctx.extra().copy()
813 extra = ctx.extra().copy()
814 # histedit_source
814 # histedit_source
815 # note: ctx is likely a temporary commit but that the best we can do
815 # note: ctx is likely a temporary commit but that the best we can do
816 # here. This is sufficient to solve issue3681 anyway.
816 # here. This is sufficient to solve issue3681 anyway.
817 extra['histedit_source'] = '%s,%s' % (ctx.hex(), oldctx.hex())
817 extra['histedit_source'] = '%s,%s' % (ctx.hex(), oldctx.hex())
818 commitopts['extra'] = extra
818 commitopts['extra'] = extra
819 phasemin = max(ctx.phase(), oldctx.phase())
819 phasemin = max(ctx.phase(), oldctx.phase())
820 overrides = {('phases', 'new-commit'): phasemin}
820 overrides = {('phases', 'new-commit'): phasemin}
821 with repo.ui.configoverride(overrides, 'histedit'):
821 with repo.ui.configoverride(overrides, 'histedit'):
822 n = collapse(repo, ctx, repo[newnode], commitopts,
822 n = collapse(repo, ctx, repo[newnode], commitopts,
823 skipprompt=self.skipprompt())
823 skipprompt=self.skipprompt())
824 if n is None:
824 if n is None:
825 return ctx, []
825 return ctx, []
826 hg.updaterepo(repo, n, overwrite=False)
826 hg.updaterepo(repo, n, overwrite=False)
827 replacements = [(oldctx.node(), (newnode,)),
827 replacements = [(oldctx.node(), (newnode,)),
828 (ctx.node(), (n,)),
828 (ctx.node(), (n,)),
829 (newnode, (n,)),
829 (newnode, (n,)),
830 ]
830 ]
831 for ich in internalchanges:
831 for ich in internalchanges:
832 replacements.append((ich, (n,)))
832 replacements.append((ich, (n,)))
833 return repo[n], replacements
833 return repo[n], replacements
834
834
835 @action(['base', 'b'],
835 @action(['base', 'b'],
836 _('checkout changeset and apply further changesets from there'))
836 _('checkout changeset and apply further changesets from there'))
837 class base(histeditaction):
837 class base(histeditaction):
838
838
839 def run(self):
839 def run(self):
840 if self.repo['.'].node() != self.node:
840 if self.repo['.'].node() != self.node:
841 mergemod.update(self.repo, self.node, branchmerge=False, force=True)
841 mergemod.update(self.repo, self.node, branchmerge=False, force=True)
842 return self.continueclean()
842 return self.continueclean()
843
843
844 def continuedirty(self):
844 def continuedirty(self):
845 abortdirty()
845 abortdirty()
846
846
847 def continueclean(self):
847 def continueclean(self):
848 basectx = self.repo['.']
848 basectx = self.repo['.']
849 return basectx, []
849 return basectx, []
850
850
851 def _verifynodeconstraints(self, prev, expected, seen):
851 def _verifynodeconstraints(self, prev, expected, seen):
852 # base can only be use with a node not in the edited set
852 # base can only be use with a node not in the edited set
853 if self.node in expected:
853 if self.node in expected:
854 msg = _('%s "%s" changeset was an edited list candidate')
854 msg = _('%s "%s" changeset was an edited list candidate')
855 raise error.ParseError(
855 raise error.ParseError(
856 msg % (self.verb, node.short(self.node)),
856 msg % (self.verb, node.short(self.node)),
857 hint=_('base must only use unlisted changesets'))
857 hint=_('base must only use unlisted changesets'))
858
858
859 @action(['_multifold'],
859 @action(['_multifold'],
860 _(
860 _(
861 """fold subclass used for when multiple folds happen in a row
861 """fold subclass used for when multiple folds happen in a row
862
862
863 We only want to fire the editor for the folded message once when
863 We only want to fire the editor for the folded message once when
864 (say) four changes are folded down into a single change. This is
864 (say) four changes are folded down into a single change. This is
865 similar to rollup, but we should preserve both messages so that
865 similar to rollup, but we should preserve both messages so that
866 when the last fold operation runs we can show the user all the
866 when the last fold operation runs we can show the user all the
867 commit messages in their editor.
867 commit messages in their editor.
868 """),
868 """),
869 internal=True)
869 internal=True)
870 class _multifold(fold):
870 class _multifold(fold):
871 def skipprompt(self):
871 def skipprompt(self):
872 return True
872 return True
873
873
874 @action(["roll", "r"],
874 @action(["roll", "r"],
875 _("like fold, but discard this commit's description and date"))
875 _("like fold, but discard this commit's description and date"))
876 class rollup(fold):
876 class rollup(fold):
877 def mergedescs(self):
877 def mergedescs(self):
878 return False
878 return False
879
879
880 def skipprompt(self):
880 def skipprompt(self):
881 return True
881 return True
882
882
883 def firstdate(self):
883 def firstdate(self):
884 return True
884 return True
885
885
886 @action(["drop", "d"],
886 @action(["drop", "d"],
887 _('remove commit from history'))
887 _('remove commit from history'))
888 class drop(histeditaction):
888 class drop(histeditaction):
889 def run(self):
889 def run(self):
890 parentctx = self.repo[self.state.parentctxnode]
890 parentctx = self.repo[self.state.parentctxnode]
891 return parentctx, [(self.node, tuple())]
891 return parentctx, [(self.node, tuple())]
892
892
893 @action(["mess", "m"],
893 @action(["mess", "m"],
894 _('edit commit message without changing commit content'),
894 _('edit commit message without changing commit content'),
895 priority=True)
895 priority=True)
896 class message(histeditaction):
896 class message(histeditaction):
897 def commiteditor(self):
897 def commiteditor(self):
898 return cmdutil.getcommiteditor(edit=True, editform='histedit.mess')
898 return cmdutil.getcommiteditor(edit=True, editform='histedit.mess')
899
899
900 def findoutgoing(ui, repo, remote=None, force=False, opts=None):
900 def findoutgoing(ui, repo, remote=None, force=False, opts=None):
901 """utility function to find the first outgoing changeset
901 """utility function to find the first outgoing changeset
902
902
903 Used by initialization code"""
903 Used by initialization code"""
904 if opts is None:
904 if opts is None:
905 opts = {}
905 opts = {}
906 dest = ui.expandpath(remote or 'default-push', remote or 'default')
906 dest = ui.expandpath(remote or 'default-push', remote or 'default')
907 dest, branches = hg.parseurl(dest, None)[:2]
907 dest, branches = hg.parseurl(dest, None)[:2]
908 ui.status(_('comparing with %s\n') % util.hidepassword(dest))
908 ui.status(_('comparing with %s\n') % util.hidepassword(dest))
909
909
910 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
910 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
911 other = hg.peer(repo, opts, dest)
911 other = hg.peer(repo, opts, dest)
912
912
913 if revs:
913 if revs:
914 revs = [repo.lookup(rev) for rev in revs]
914 revs = [repo.lookup(rev) for rev in revs]
915
915
916 outgoing = discovery.findcommonoutgoing(repo, other, revs, force=force)
916 outgoing = discovery.findcommonoutgoing(repo, other, revs, force=force)
917 if not outgoing.missing:
917 if not outgoing.missing:
918 raise error.Abort(_('no outgoing ancestors'))
918 raise error.Abort(_('no outgoing ancestors'))
919 roots = list(repo.revs("roots(%ln)", outgoing.missing))
919 roots = list(repo.revs("roots(%ln)", outgoing.missing))
920 if len(roots) > 1:
920 if len(roots) > 1:
921 msg = _('there are ambiguous outgoing revisions')
921 msg = _('there are ambiguous outgoing revisions')
922 hint = _("see 'hg help histedit' for more detail")
922 hint = _("see 'hg help histedit' for more detail")
923 raise error.Abort(msg, hint=hint)
923 raise error.Abort(msg, hint=hint)
924 return repo[roots[0]].node()
924 return repo[roots[0]].node()
925
925
926 # Curses Support
926 # Curses Support
927 try:
927 try:
928 import curses
928 import curses
929 except ImportError:
929 except ImportError:
930 curses = None
930 curses = None
931
931
932 KEY_LIST = ['pick', 'edit', 'fold', 'drop', 'mess', 'roll']
932 KEY_LIST = ['pick', 'edit', 'fold', 'drop', 'mess', 'roll']
933 ACTION_LABELS = {
933 ACTION_LABELS = {
934 'fold': '^fold',
934 'fold': '^fold',
935 'roll': '^roll',
935 'roll': '^roll',
936 }
936 }
937
937
938 COLOR_HELP, COLOR_SELECTED, COLOR_OK, COLOR_WARN = 1, 2, 3, 4
938 COLOR_HELP, COLOR_SELECTED, COLOR_OK, COLOR_WARN = 1, 2, 3, 4
939
939
940 E_QUIT, E_HISTEDIT = 1, 2
940 E_QUIT, E_HISTEDIT = 1, 2
941 E_PAGEDOWN, E_PAGEUP, E_LINEUP, E_LINEDOWN, E_RESIZE = 3, 4, 5, 6, 7
941 E_PAGEDOWN, E_PAGEUP, E_LINEUP, E_LINEDOWN, E_RESIZE = 3, 4, 5, 6, 7
942 MODE_INIT, MODE_PATCH, MODE_RULES, MODE_HELP = 0, 1, 2, 3
942 MODE_INIT, MODE_PATCH, MODE_RULES, MODE_HELP = 0, 1, 2, 3
943
943
944 KEYTABLE = {
944 KEYTABLE = {
945 'global': {
945 'global': {
946 'h': 'next-action',
946 'h': 'next-action',
947 'KEY_RIGHT': 'next-action',
947 'KEY_RIGHT': 'next-action',
948 'l': 'prev-action',
948 'l': 'prev-action',
949 'KEY_LEFT': 'prev-action',
949 'KEY_LEFT': 'prev-action',
950 'q': 'quit',
950 'q': 'quit',
951 'c': 'histedit',
951 'c': 'histedit',
952 'C': 'histedit',
952 'C': 'histedit',
953 'v': 'showpatch',
953 'v': 'showpatch',
954 '?': 'help',
954 '?': 'help',
955 },
955 },
956 MODE_RULES: {
956 MODE_RULES: {
957 'd': 'action-drop',
957 'd': 'action-drop',
958 'e': 'action-edit',
958 'e': 'action-edit',
959 'f': 'action-fold',
959 'f': 'action-fold',
960 'm': 'action-mess',
960 'm': 'action-mess',
961 'p': 'action-pick',
961 'p': 'action-pick',
962 'r': 'action-roll',
962 'r': 'action-roll',
963 ' ': 'select',
963 ' ': 'select',
964 'j': 'down',
964 'j': 'down',
965 'k': 'up',
965 'k': 'up',
966 'KEY_DOWN': 'down',
966 'KEY_DOWN': 'down',
967 'KEY_UP': 'up',
967 'KEY_UP': 'up',
968 'J': 'move-down',
968 'J': 'move-down',
969 'K': 'move-up',
969 'K': 'move-up',
970 'KEY_NPAGE': 'move-down',
970 'KEY_NPAGE': 'move-down',
971 'KEY_PPAGE': 'move-up',
971 'KEY_PPAGE': 'move-up',
972 '0': 'goto', # Used for 0..9
972 '0': 'goto', # Used for 0..9
973 },
973 },
974 MODE_PATCH: {
974 MODE_PATCH: {
975 ' ': 'page-down',
975 ' ': 'page-down',
976 'KEY_NPAGE': 'page-down',
976 'KEY_NPAGE': 'page-down',
977 'KEY_PPAGE': 'page-up',
977 'KEY_PPAGE': 'page-up',
978 'j': 'line-down',
978 'j': 'line-down',
979 'k': 'line-up',
979 'k': 'line-up',
980 'KEY_DOWN': 'line-down',
980 'KEY_DOWN': 'line-down',
981 'KEY_UP': 'line-up',
981 'KEY_UP': 'line-up',
982 'J': 'down',
982 'J': 'down',
983 'K': 'up',
983 'K': 'up',
984 },
984 },
985 MODE_HELP: {
985 MODE_HELP: {
986 },
986 },
987 }
987 }
988
988
989 def screen_size():
989 def screen_size():
990 return struct.unpack('hh', fcntl.ioctl(1, termios.TIOCGWINSZ, ' '))
990 return struct.unpack('hh', fcntl.ioctl(1, termios.TIOCGWINSZ, ' '))
991
991
992 class histeditrule(object):
992 class histeditrule(object):
993 def __init__(self, ctx, pos, action='pick'):
993 def __init__(self, ctx, pos, action='pick'):
994 self.ctx = ctx
994 self.ctx = ctx
995 self.action = action
995 self.action = action
996 self.origpos = pos
996 self.origpos = pos
997 self.pos = pos
997 self.pos = pos
998 self.conflicts = []
998 self.conflicts = []
999
999
1000 def __str__(self):
1000 def __str__(self):
1001 # Some actions ('fold' and 'roll') combine a patch with a previous one.
1001 # Some actions ('fold' and 'roll') combine a patch with a previous one.
1002 # Add a marker showing which patch they apply to, and also omit the
1002 # Add a marker showing which patch they apply to, and also omit the
1003 # description for 'roll' (since it will get discarded). Example display:
1003 # description for 'roll' (since it will get discarded). Example display:
1004 #
1004 #
1005 # #10 pick 316392:06a16c25c053 add option to skip tests
1005 # #10 pick 316392:06a16c25c053 add option to skip tests
1006 # #11 ^roll 316393:71313c964cc5
1006 # #11 ^roll 316393:71313c964cc5
1007 # #12 pick 316394:ab31f3973b0d include mfbt for mozilla-config.h
1007 # #12 pick 316394:ab31f3973b0d include mfbt for mozilla-config.h
1008 # #13 ^fold 316395:14ce5803f4c3 fix warnings
1008 # #13 ^fold 316395:14ce5803f4c3 fix warnings
1009 #
1009 #
1010 # The carets point to the changeset being folded into ("roll this
1010 # The carets point to the changeset being folded into ("roll this
1011 # changeset into the changeset above").
1011 # changeset into the changeset above").
1012 action = ACTION_LABELS.get(self.action, self.action)
1012 action = ACTION_LABELS.get(self.action, self.action)
1013 h = self.ctx.hex()[0:12]
1013 h = self.ctx.hex()[0:12]
1014 r = self.ctx.rev()
1014 r = self.ctx.rev()
1015 desc = self.ctx.description().splitlines()[0].strip()
1015 desc = self.ctx.description().splitlines()[0].strip()
1016 if self.action == 'roll':
1016 if self.action == 'roll':
1017 desc = ''
1017 desc = ''
1018 return "#{0:<2} {1:<6} {2}:{3} {4}".format(
1018 return "#{0:<2} {1:<6} {2}:{3} {4}".format(
1019 self.origpos, action, r, h, desc)
1019 self.origpos, action, r, h, desc)
1020
1020
1021 def checkconflicts(self, other):
1021 def checkconflicts(self, other):
1022 if other.pos > self.pos and other.origpos <= self.origpos:
1022 if other.pos > self.pos and other.origpos <= self.origpos:
1023 if set(other.ctx.files()) & set(self.ctx.files()) != set():
1023 if set(other.ctx.files()) & set(self.ctx.files()) != set():
1024 self.conflicts.append(other)
1024 self.conflicts.append(other)
1025 return self.conflicts
1025 return self.conflicts
1026
1026
1027 if other in self.conflicts:
1027 if other in self.conflicts:
1028 self.conflicts.remove(other)
1028 self.conflicts.remove(other)
1029 return self.conflicts
1029 return self.conflicts
1030
1030
1031 # ============ EVENTS ===============
1031 # ============ EVENTS ===============
1032 def movecursor(state, oldpos, newpos):
1032 def movecursor(state, oldpos, newpos):
1033 '''Change the rule/changeset that the cursor is pointing to, regardless of
1033 '''Change the rule/changeset that the cursor is pointing to, regardless of
1034 current mode (you can switch between patches from the view patch window).'''
1034 current mode (you can switch between patches from the view patch window).'''
1035 state['pos'] = newpos
1035 state['pos'] = newpos
1036
1036
1037 mode, _ = state['mode']
1037 mode, _ = state['mode']
1038 if mode == MODE_RULES:
1038 if mode == MODE_RULES:
1039 # Scroll through the list by updating the view for MODE_RULES, so that
1039 # Scroll through the list by updating the view for MODE_RULES, so that
1040 # even if we are not currently viewing the rules, switching back will
1040 # even if we are not currently viewing the rules, switching back will
1041 # result in the cursor's rule being visible.
1041 # result in the cursor's rule being visible.
1042 modestate = state['modes'][MODE_RULES]
1042 modestate = state['modes'][MODE_RULES]
1043 if newpos < modestate['line_offset']:
1043 if newpos < modestate['line_offset']:
1044 modestate['line_offset'] = newpos
1044 modestate['line_offset'] = newpos
1045 elif newpos > modestate['line_offset'] + state['page_height'] - 1:
1045 elif newpos > modestate['line_offset'] + state['page_height'] - 1:
1046 modestate['line_offset'] = newpos - state['page_height'] + 1
1046 modestate['line_offset'] = newpos - state['page_height'] + 1
1047
1047
1048 # Reset the patch view region to the top of the new patch.
1048 # Reset the patch view region to the top of the new patch.
1049 state['modes'][MODE_PATCH]['line_offset'] = 0
1049 state['modes'][MODE_PATCH]['line_offset'] = 0
1050
1050
1051 def changemode(state, mode):
1051 def changemode(state, mode):
1052 curmode, _ = state['mode']
1052 curmode, _ = state['mode']
1053 state['mode'] = (mode, curmode)
1053 state['mode'] = (mode, curmode)
1054
1054
1055 def makeselection(state, pos):
1055 def makeselection(state, pos):
1056 state['selected'] = pos
1056 state['selected'] = pos
1057
1057
1058 def swap(state, oldpos, newpos):
1058 def swap(state, oldpos, newpos):
1059 """Swap two positions and calculate necessary conflicts in
1059 """Swap two positions and calculate necessary conflicts in
1060 O(|newpos-oldpos|) time"""
1060 O(|newpos-oldpos|) time"""
1061
1061
1062 rules = state['rules']
1062 rules = state['rules']
1063 assert 0 <= oldpos < len(rules) and 0 <= newpos < len(rules)
1063 assert 0 <= oldpos < len(rules) and 0 <= newpos < len(rules)
1064
1064
1065 rules[oldpos], rules[newpos] = rules[newpos], rules[oldpos]
1065 rules[oldpos], rules[newpos] = rules[newpos], rules[oldpos]
1066
1066
1067 # TODO: swap should not know about histeditrule's internals
1067 # TODO: swap should not know about histeditrule's internals
1068 rules[newpos].pos = newpos
1068 rules[newpos].pos = newpos
1069 rules[oldpos].pos = oldpos
1069 rules[oldpos].pos = oldpos
1070
1070
1071 start = min(oldpos, newpos)
1071 start = min(oldpos, newpos)
1072 end = max(oldpos, newpos)
1072 end = max(oldpos, newpos)
1073 for r in pycompat.xrange(start, end + 1):
1073 for r in pycompat.xrange(start, end + 1):
1074 rules[newpos].checkconflicts(rules[r])
1074 rules[newpos].checkconflicts(rules[r])
1075 rules[oldpos].checkconflicts(rules[r])
1075 rules[oldpos].checkconflicts(rules[r])
1076
1076
1077 if state['selected']:
1077 if state['selected']:
1078 makeselection(state, newpos)
1078 makeselection(state, newpos)
1079
1079
1080 def changeaction(state, pos, action):
1080 def changeaction(state, pos, action):
1081 """Change the action state on the given position to the new action"""
1081 """Change the action state on the given position to the new action"""
1082 rules = state['rules']
1082 rules = state['rules']
1083 assert 0 <= pos < len(rules)
1083 assert 0 <= pos < len(rules)
1084 rules[pos].action = action
1084 rules[pos].action = action
1085
1085
1086 def cycleaction(state, pos, next=False):
1086 def cycleaction(state, pos, next=False):
1087 """Changes the action state the next or the previous action from
1087 """Changes the action state the next or the previous action from
1088 the action list"""
1088 the action list"""
1089 rules = state['rules']
1089 rules = state['rules']
1090 assert 0 <= pos < len(rules)
1090 assert 0 <= pos < len(rules)
1091 current = rules[pos].action
1091 current = rules[pos].action
1092
1092
1093 assert current in KEY_LIST
1093 assert current in KEY_LIST
1094
1094
1095 index = KEY_LIST.index(current)
1095 index = KEY_LIST.index(current)
1096 if next:
1096 if next:
1097 index += 1
1097 index += 1
1098 else:
1098 else:
1099 index -= 1
1099 index -= 1
1100 changeaction(state, pos, KEY_LIST[index % len(KEY_LIST)])
1100 changeaction(state, pos, KEY_LIST[index % len(KEY_LIST)])
1101
1101
1102 def changeview(state, delta, unit):
1102 def changeview(state, delta, unit):
1103 '''Change the region of whatever is being viewed (a patch or the list of
1103 '''Change the region of whatever is being viewed (a patch or the list of
1104 changesets). 'delta' is an amount (+/- 1) and 'unit' is 'page' or 'line'.'''
1104 changesets). 'delta' is an amount (+/- 1) and 'unit' is 'page' or 'line'.'''
1105 mode, _ = state['mode']
1105 mode, _ = state['mode']
1106 if mode != MODE_PATCH:
1106 if mode != MODE_PATCH:
1107 return
1107 return
1108 mode_state = state['modes'][mode]
1108 mode_state = state['modes'][mode]
1109 num_lines = len(patchcontents(state))
1109 num_lines = len(patchcontents(state))
1110 page_height = state['page_height']
1110 page_height = state['page_height']
1111 unit = page_height if unit == 'page' else 1
1111 unit = page_height if unit == 'page' else 1
1112 num_pages = 1 + (num_lines - 1) / page_height
1112 num_pages = 1 + (num_lines - 1) / page_height
1113 max_offset = (num_pages - 1) * page_height
1113 max_offset = (num_pages - 1) * page_height
1114 newline = mode_state['line_offset'] + delta * unit
1114 newline = mode_state['line_offset'] + delta * unit
1115 mode_state['line_offset'] = max(0, min(max_offset, newline))
1115 mode_state['line_offset'] = max(0, min(max_offset, newline))
1116
1116
1117 def event(state, ch):
1117 def event(state, ch):
1118 """Change state based on the current character input
1118 """Change state based on the current character input
1119
1119
1120 This takes the current state and based on the current character input from
1120 This takes the current state and based on the current character input from
1121 the user we change the state.
1121 the user we change the state.
1122 """
1122 """
1123 selected = state['selected']
1123 selected = state['selected']
1124 oldpos = state['pos']
1124 oldpos = state['pos']
1125 rules = state['rules']
1125 rules = state['rules']
1126
1126
1127 if ch in (curses.KEY_RESIZE, "KEY_RESIZE"):
1127 if ch in (curses.KEY_RESIZE, "KEY_RESIZE"):
1128 return E_RESIZE
1128 return E_RESIZE
1129
1129
1130 lookup_ch = ch
1130 lookup_ch = ch
1131 if '0' <= ch <= '9':
1131 if '0' <= ch <= '9':
1132 lookup_ch = '0'
1132 lookup_ch = '0'
1133
1133
1134 curmode, prevmode = state['mode']
1134 curmode, prevmode = state['mode']
1135 action = KEYTABLE[curmode].get(lookup_ch, KEYTABLE['global'].get(lookup_ch))
1135 action = KEYTABLE[curmode].get(lookup_ch, KEYTABLE['global'].get(lookup_ch))
1136 if action is None:
1136 if action is None:
1137 return
1137 return
1138 if action in ('down', 'move-down'):
1138 if action in ('down', 'move-down'):
1139 newpos = min(oldpos + 1, len(rules) - 1)
1139 newpos = min(oldpos + 1, len(rules) - 1)
1140 movecursor(state, oldpos, newpos)
1140 movecursor(state, oldpos, newpos)
1141 if selected is not None or action == 'move-down':
1141 if selected is not None or action == 'move-down':
1142 swap(state, oldpos, newpos)
1142 swap(state, oldpos, newpos)
1143 elif action in ('up', 'move-up'):
1143 elif action in ('up', 'move-up'):
1144 newpos = max(0, oldpos - 1)
1144 newpos = max(0, oldpos - 1)
1145 movecursor(state, oldpos, newpos)
1145 movecursor(state, oldpos, newpos)
1146 if selected is not None or action == 'move-up':
1146 if selected is not None or action == 'move-up':
1147 swap(state, oldpos, newpos)
1147 swap(state, oldpos, newpos)
1148 elif action == 'next-action':
1148 elif action == 'next-action':
1149 cycleaction(state, oldpos, next=True)
1149 cycleaction(state, oldpos, next=True)
1150 elif action == 'prev-action':
1150 elif action == 'prev-action':
1151 cycleaction(state, oldpos, next=False)
1151 cycleaction(state, oldpos, next=False)
1152 elif action == 'select':
1152 elif action == 'select':
1153 selected = oldpos if selected is None else None
1153 selected = oldpos if selected is None else None
1154 makeselection(state, selected)
1154 makeselection(state, selected)
1155 elif action == 'goto' and int(ch) < len(rules) and len(rules) <= 10:
1155 elif action == 'goto' and int(ch) < len(rules) and len(rules) <= 10:
1156 newrule = next((r for r in rules if r.origpos == int(ch)))
1156 newrule = next((r for r in rules if r.origpos == int(ch)))
1157 movecursor(state, oldpos, newrule.pos)
1157 movecursor(state, oldpos, newrule.pos)
1158 if selected is not None:
1158 if selected is not None:
1159 swap(state, oldpos, newrule.pos)
1159 swap(state, oldpos, newrule.pos)
1160 elif action.startswith('action-'):
1160 elif action.startswith('action-'):
1161 changeaction(state, oldpos, action[7:])
1161 changeaction(state, oldpos, action[7:])
1162 elif action == 'showpatch':
1162 elif action == 'showpatch':
1163 changemode(state, MODE_PATCH if curmode != MODE_PATCH else prevmode)
1163 changemode(state, MODE_PATCH if curmode != MODE_PATCH else prevmode)
1164 elif action == 'help':
1164 elif action == 'help':
1165 changemode(state, MODE_HELP if curmode != MODE_HELP else prevmode)
1165 changemode(state, MODE_HELP if curmode != MODE_HELP else prevmode)
1166 elif action == 'quit':
1166 elif action == 'quit':
1167 return E_QUIT
1167 return E_QUIT
1168 elif action == 'histedit':
1168 elif action == 'histedit':
1169 return E_HISTEDIT
1169 return E_HISTEDIT
1170 elif action == 'page-down':
1170 elif action == 'page-down':
1171 return E_PAGEDOWN
1171 return E_PAGEDOWN
1172 elif action == 'page-up':
1172 elif action == 'page-up':
1173 return E_PAGEUP
1173 return E_PAGEUP
1174 elif action == 'line-down':
1174 elif action == 'line-down':
1175 return E_LINEDOWN
1175 return E_LINEDOWN
1176 elif action == 'line-up':
1176 elif action == 'line-up':
1177 return E_LINEUP
1177 return E_LINEUP
1178
1178
1179 def makecommands(rules):
1179 def makecommands(rules):
1180 """Returns a list of commands consumable by histedit --commands based on
1180 """Returns a list of commands consumable by histedit --commands based on
1181 our list of rules"""
1181 our list of rules"""
1182 commands = []
1182 commands = []
1183 for rules in rules:
1183 for rules in rules:
1184 commands.append("{0} {1}\n".format(rules.action, rules.ctx))
1184 commands.append("{0} {1}\n".format(rules.action, rules.ctx))
1185 return commands
1185 return commands
1186
1186
1187 def addln(win, y, x, line, color=None):
1187 def addln(win, y, x, line, color=None):
1188 """Add a line to the given window left padding but 100% filled with
1188 """Add a line to the given window left padding but 100% filled with
1189 whitespace characters, so that the color appears on the whole line"""
1189 whitespace characters, so that the color appears on the whole line"""
1190 maxy, maxx = win.getmaxyx()
1190 maxy, maxx = win.getmaxyx()
1191 length = maxx - 1 - x
1191 length = maxx - 1 - x
1192 line = ("{0:<%d}" % length).format(str(line).strip())[:length]
1192 line = ("{0:<%d}" % length).format(str(line).strip())[:length]
1193 if y < 0:
1193 if y < 0:
1194 y = maxy + y
1194 y = maxy + y
1195 if x < 0:
1195 if x < 0:
1196 x = maxx + x
1196 x = maxx + x
1197 if color:
1197 if color:
1198 win.addstr(y, x, line, color)
1198 win.addstr(y, x, line, color)
1199 else:
1199 else:
1200 win.addstr(y, x, line)
1200 win.addstr(y, x, line)
1201
1201
1202 def patchcontents(state):
1202 def patchcontents(state):
1203 repo = state['repo']
1203 repo = state['repo']
1204 rule = state['rules'][state['pos']]
1204 rule = state['rules'][state['pos']]
1205 displayer = logcmdutil.changesetdisplayer(repo.ui, repo, {
1205 displayer = logcmdutil.changesetdisplayer(repo.ui, repo, {
1206 'patch': True, 'verbose': True
1206 'patch': True, 'verbose': True
1207 }, buffered=True)
1207 }, buffered=True)
1208 displayer.show(rule.ctx)
1208 displayer.show(rule.ctx)
1209 displayer.close()
1209 displayer.close()
1210 return displayer.hunk[rule.ctx.rev()].splitlines()
1210 return displayer.hunk[rule.ctx.rev()].splitlines()
1211
1211
1212 def _chisteditmain(repo, rules, stdscr):
1212 def _chisteditmain(repo, rules, stdscr):
1213 # initialize color pattern
1213 # initialize color pattern
1214 curses.init_pair(COLOR_HELP, curses.COLOR_WHITE, curses.COLOR_BLUE)
1214 curses.init_pair(COLOR_HELP, curses.COLOR_WHITE, curses.COLOR_BLUE)
1215 curses.init_pair(COLOR_SELECTED, curses.COLOR_BLACK, curses.COLOR_WHITE)
1215 curses.init_pair(COLOR_SELECTED, curses.COLOR_BLACK, curses.COLOR_WHITE)
1216 curses.init_pair(COLOR_WARN, curses.COLOR_BLACK, curses.COLOR_YELLOW)
1216 curses.init_pair(COLOR_WARN, curses.COLOR_BLACK, curses.COLOR_YELLOW)
1217 curses.init_pair(COLOR_OK, curses.COLOR_BLACK, curses.COLOR_GREEN)
1217 curses.init_pair(COLOR_OK, curses.COLOR_BLACK, curses.COLOR_GREEN)
1218
1218
1219 # don't display the cursor
1219 # don't display the cursor
1220 try:
1220 try:
1221 curses.curs_set(0)
1221 curses.curs_set(0)
1222 except curses.error:
1222 except curses.error:
1223 pass
1223 pass
1224
1224
1225 def rendercommit(win, state):
1225 def rendercommit(win, state):
1226 """Renders the commit window that shows the log of the current selected
1226 """Renders the commit window that shows the log of the current selected
1227 commit"""
1227 commit"""
1228 pos = state['pos']
1228 pos = state['pos']
1229 rules = state['rules']
1229 rules = state['rules']
1230 rule = rules[pos]
1230 rule = rules[pos]
1231
1231
1232 ctx = rule.ctx
1232 ctx = rule.ctx
1233 win.box()
1233 win.box()
1234
1234
1235 maxy, maxx = win.getmaxyx()
1235 maxy, maxx = win.getmaxyx()
1236 length = maxx - 3
1236 length = maxx - 3
1237
1237
1238 line = "changeset: {0}:{1:<12}".format(ctx.rev(), ctx)
1238 line = "changeset: {0}:{1:<12}".format(ctx.rev(), ctx)
1239 win.addstr(1, 1, line[:length])
1239 win.addstr(1, 1, line[:length])
1240
1240
1241 line = "user: {0}".format(stringutil.shortuser(ctx.user()))
1241 line = "user: {0}".format(stringutil.shortuser(ctx.user()))
1242 win.addstr(2, 1, line[:length])
1242 win.addstr(2, 1, line[:length])
1243
1243
1244 bms = repo.nodebookmarks(ctx.node())
1244 bms = repo.nodebookmarks(ctx.node())
1245 line = "bookmark: {0}".format(' '.join(bms))
1245 line = "bookmark: {0}".format(' '.join(bms))
1246 win.addstr(3, 1, line[:length])
1246 win.addstr(3, 1, line[:length])
1247
1247
1248 line = "files: {0}".format(','.join(ctx.files()))
1248 line = "files: {0}".format(','.join(ctx.files()))
1249 win.addstr(4, 1, line[:length])
1249 win.addstr(4, 1, line[:length])
1250
1250
1251 line = "summary: {0}".format(ctx.description().splitlines()[0])
1251 line = "summary: {0}".format(ctx.description().splitlines()[0])
1252 win.addstr(5, 1, line[:length])
1252 win.addstr(5, 1, line[:length])
1253
1253
1254 conflicts = rule.conflicts
1254 conflicts = rule.conflicts
1255 if len(conflicts) > 0:
1255 if len(conflicts) > 0:
1256 conflictstr = ','.join(map(lambda r: str(r.ctx), conflicts))
1256 conflictstr = ','.join(map(lambda r: str(r.ctx), conflicts))
1257 conflictstr = "changed files overlap with {0}".format(conflictstr)
1257 conflictstr = "changed files overlap with {0}".format(conflictstr)
1258 else:
1258 else:
1259 conflictstr = 'no overlap'
1259 conflictstr = 'no overlap'
1260
1260
1261 win.addstr(6, 1, conflictstr[:length])
1261 win.addstr(6, 1, conflictstr[:length])
1262 win.noutrefresh()
1262 win.noutrefresh()
1263
1263
1264 def helplines(mode):
1264 def helplines(mode):
1265 if mode == MODE_PATCH:
1265 if mode == MODE_PATCH:
1266 help = """\
1266 help = """\
1267 ?: help, k/up: line up, j/down: line down, v: stop viewing patch
1267 ?: help, k/up: line up, j/down: line down, v: stop viewing patch
1268 pgup: prev page, space/pgdn: next page, c: commit, q: abort
1268 pgup: prev page, space/pgdn: next page, c: commit, q: abort
1269 """
1269 """
1270 else:
1270 else:
1271 help = """\
1271 help = """\
1272 ?: help, k/up: move up, j/down: move down, space: select, v: view patch
1272 ?: help, k/up: move up, j/down: move down, space: select, v: view patch
1273 d: drop, e: edit, f: fold, m: mess, p: pick, r: roll
1273 d: drop, e: edit, f: fold, m: mess, p: pick, r: roll
1274 pgup/K: move patch up, pgdn/J: move patch down, c: commit, q: abort
1274 pgup/K: move patch up, pgdn/J: move patch down, c: commit, q: abort
1275 """
1275 """
1276 return help.splitlines()
1276 return help.splitlines()
1277
1277
1278 def renderhelp(win, state):
1278 def renderhelp(win, state):
1279 maxy, maxx = win.getmaxyx()
1279 maxy, maxx = win.getmaxyx()
1280 mode, _ = state['mode']
1280 mode, _ = state['mode']
1281 for y, line in enumerate(helplines(mode)):
1281 for y, line in enumerate(helplines(mode)):
1282 if y >= maxy:
1282 if y >= maxy:
1283 break
1283 break
1284 addln(win, y, 0, line, curses.color_pair(COLOR_HELP))
1284 addln(win, y, 0, line, curses.color_pair(COLOR_HELP))
1285 win.noutrefresh()
1285 win.noutrefresh()
1286
1286
1287 def renderrules(rulesscr, state):
1287 def renderrules(rulesscr, state):
1288 rules = state['rules']
1288 rules = state['rules']
1289 pos = state['pos']
1289 pos = state['pos']
1290 selected = state['selected']
1290 selected = state['selected']
1291 start = state['modes'][MODE_RULES]['line_offset']
1291 start = state['modes'][MODE_RULES]['line_offset']
1292
1292
1293 conflicts = [r.ctx for r in rules if r.conflicts]
1293 conflicts = [r.ctx for r in rules if r.conflicts]
1294 if len(conflicts) > 0:
1294 if len(conflicts) > 0:
1295 line = "potential conflict in %s" % ','.join(map(str, conflicts))
1295 line = "potential conflict in %s" % ','.join(map(str, conflicts))
1296 addln(rulesscr, -1, 0, line, curses.color_pair(COLOR_WARN))
1296 addln(rulesscr, -1, 0, line, curses.color_pair(COLOR_WARN))
1297
1297
1298 for y, rule in enumerate(rules[start:]):
1298 for y, rule in enumerate(rules[start:]):
1299 if y >= state['page_height']:
1299 if y >= state['page_height']:
1300 break
1300 break
1301 if len(rule.conflicts) > 0:
1301 if len(rule.conflicts) > 0:
1302 rulesscr.addstr(y, 0, " ", curses.color_pair(COLOR_WARN))
1302 rulesscr.addstr(y, 0, " ", curses.color_pair(COLOR_WARN))
1303 else:
1303 else:
1304 rulesscr.addstr(y, 0, " ", curses.COLOR_BLACK)
1304 rulesscr.addstr(y, 0, " ", curses.COLOR_BLACK)
1305 if y + start == selected:
1305 if y + start == selected:
1306 addln(rulesscr, y, 2, rule, curses.color_pair(COLOR_SELECTED))
1306 addln(rulesscr, y, 2, rule, curses.color_pair(COLOR_SELECTED))
1307 elif y + start == pos:
1307 elif y + start == pos:
1308 addln(rulesscr, y, 2, rule, curses.A_BOLD)
1308 addln(rulesscr, y, 2, rule, curses.A_BOLD)
1309 else:
1309 else:
1310 addln(rulesscr, y, 2, rule)
1310 addln(rulesscr, y, 2, rule)
1311 rulesscr.noutrefresh()
1311 rulesscr.noutrefresh()
1312
1312
1313 def renderstring(win, state, output):
1313 def renderstring(win, state, output):
1314 maxy, maxx = win.getmaxyx()
1314 maxy, maxx = win.getmaxyx()
1315 length = min(maxy - 1, len(output))
1315 length = min(maxy - 1, len(output))
1316 for y in range(0, length):
1316 for y in range(0, length):
1317 win.addstr(y, 0, output[y])
1317 win.addstr(y, 0, output[y])
1318 win.noutrefresh()
1318 win.noutrefresh()
1319
1319
1320 def renderpatch(win, state):
1320 def renderpatch(win, state):
1321 start = state['modes'][MODE_PATCH]['line_offset']
1321 start = state['modes'][MODE_PATCH]['line_offset']
1322 renderstring(win, state, patchcontents(state)[start:])
1322 renderstring(win, state, patchcontents(state)[start:])
1323
1323
1324 def layout(mode):
1324 def layout(mode):
1325 maxy, maxx = stdscr.getmaxyx()
1325 maxy, maxx = stdscr.getmaxyx()
1326 helplen = len(helplines(mode))
1326 helplen = len(helplines(mode))
1327 return {
1327 return {
1328 'commit': (8, maxx),
1328 'commit': (8, maxx),
1329 'help': (helplen, maxx),
1329 'help': (helplen, maxx),
1330 'main': (maxy - helplen - 8, maxx),
1330 'main': (maxy - helplen - 8, maxx),
1331 }
1331 }
1332
1332
1333 def drawvertwin(size, y, x):
1333 def drawvertwin(size, y, x):
1334 win = curses.newwin(size[0], size[1], y, x)
1334 win = curses.newwin(size[0], size[1], y, x)
1335 y += size[0]
1335 y += size[0]
1336 return win, y, x
1336 return win, y, x
1337
1337
1338 state = {
1338 state = {
1339 'pos': 0,
1339 'pos': 0,
1340 'rules': rules,
1340 'rules': rules,
1341 'selected': None,
1341 'selected': None,
1342 'mode': (MODE_INIT, MODE_INIT),
1342 'mode': (MODE_INIT, MODE_INIT),
1343 'page_height': None,
1343 'page_height': None,
1344 'modes': {
1344 'modes': {
1345 MODE_RULES: {
1345 MODE_RULES: {
1346 'line_offset': 0,
1346 'line_offset': 0,
1347 },
1347 },
1348 MODE_PATCH: {
1348 MODE_PATCH: {
1349 'line_offset': 0,
1349 'line_offset': 0,
1350 }
1350 }
1351 },
1351 },
1352 'repo': repo,
1352 'repo': repo,
1353 }
1353 }
1354
1354
1355 # eventloop
1355 # eventloop
1356 ch = None
1356 ch = None
1357 stdscr.clear()
1357 stdscr.clear()
1358 stdscr.refresh()
1358 stdscr.refresh()
1359 while True:
1359 while True:
1360 try:
1360 try:
1361 oldmode, _ = state['mode']
1361 oldmode, _ = state['mode']
1362 if oldmode == MODE_INIT:
1362 if oldmode == MODE_INIT:
1363 changemode(state, MODE_RULES)
1363 changemode(state, MODE_RULES)
1364 e = event(state, ch)
1364 e = event(state, ch)
1365
1365
1366 if e == E_QUIT:
1366 if e == E_QUIT:
1367 return False
1367 return False
1368 if e == E_HISTEDIT:
1368 if e == E_HISTEDIT:
1369 return state['rules']
1369 return state['rules']
1370 else:
1370 else:
1371 if e == E_RESIZE:
1371 if e == E_RESIZE:
1372 size = screen_size()
1372 size = screen_size()
1373 if size != stdscr.getmaxyx():
1373 if size != stdscr.getmaxyx():
1374 curses.resizeterm(*size)
1374 curses.resizeterm(*size)
1375
1375
1376 curmode, _ = state['mode']
1376 curmode, _ = state['mode']
1377 sizes = layout(curmode)
1377 sizes = layout(curmode)
1378 if curmode != oldmode:
1378 if curmode != oldmode:
1379 state['page_height'] = sizes['main'][0]
1379 state['page_height'] = sizes['main'][0]
1380 # Adjust the view to fit the current screen size.
1380 # Adjust the view to fit the current screen size.
1381 movecursor(state, state['pos'], state['pos'])
1381 movecursor(state, state['pos'], state['pos'])
1382
1382
1383 # Pack the windows against the top, each pane spread across the
1383 # Pack the windows against the top, each pane spread across the
1384 # full width of the screen.
1384 # full width of the screen.
1385 y, x = (0, 0)
1385 y, x = (0, 0)
1386 helpwin, y, x = drawvertwin(sizes['help'], y, x)
1386 helpwin, y, x = drawvertwin(sizes['help'], y, x)
1387 mainwin, y, x = drawvertwin(sizes['main'], y, x)
1387 mainwin, y, x = drawvertwin(sizes['main'], y, x)
1388 commitwin, y, x = drawvertwin(sizes['commit'], y, x)
1388 commitwin, y, x = drawvertwin(sizes['commit'], y, x)
1389
1389
1390 if e in (E_PAGEDOWN, E_PAGEUP, E_LINEDOWN, E_LINEUP):
1390 if e in (E_PAGEDOWN, E_PAGEUP, E_LINEDOWN, E_LINEUP):
1391 if e == E_PAGEDOWN:
1391 if e == E_PAGEDOWN:
1392 changeview(state, +1, 'page')
1392 changeview(state, +1, 'page')
1393 elif e == E_PAGEUP:
1393 elif e == E_PAGEUP:
1394 changeview(state, -1, 'page')
1394 changeview(state, -1, 'page')
1395 elif e == E_LINEDOWN:
1395 elif e == E_LINEDOWN:
1396 changeview(state, +1, 'line')
1396 changeview(state, +1, 'line')
1397 elif e == E_LINEUP:
1397 elif e == E_LINEUP:
1398 changeview(state, -1, 'line')
1398 changeview(state, -1, 'line')
1399
1399
1400 # start rendering
1400 # start rendering
1401 commitwin.erase()
1401 commitwin.erase()
1402 helpwin.erase()
1402 helpwin.erase()
1403 mainwin.erase()
1403 mainwin.erase()
1404 if curmode == MODE_PATCH:
1404 if curmode == MODE_PATCH:
1405 renderpatch(mainwin, state)
1405 renderpatch(mainwin, state)
1406 elif curmode == MODE_HELP:
1406 elif curmode == MODE_HELP:
1407 renderstring(mainwin, state, __doc__.strip().splitlines())
1407 renderstring(mainwin, state, __doc__.strip().splitlines())
1408 else:
1408 else:
1409 renderrules(mainwin, state)
1409 renderrules(mainwin, state)
1410 rendercommit(commitwin, state)
1410 rendercommit(commitwin, state)
1411 renderhelp(helpwin, state)
1411 renderhelp(helpwin, state)
1412 curses.doupdate()
1412 curses.doupdate()
1413 # done rendering
1413 # done rendering
1414 ch = stdscr.getkey()
1414 ch = stdscr.getkey()
1415 except curses.error:
1415 except curses.error:
1416 pass
1416 pass
1417
1417
1418 def _chistedit(ui, repo, *freeargs, **opts):
1418 def _chistedit(ui, repo, *freeargs, **opts):
1419 """interactively edit changeset history via a curses interface
1419 """interactively edit changeset history via a curses interface
1420
1420
1421 Provides a ncurses interface to histedit. Press ? in chistedit mode
1421 Provides a ncurses interface to histedit. Press ? in chistedit mode
1422 to see an extensive help. Requires python-curses to be installed."""
1422 to see an extensive help. Requires python-curses to be installed."""
1423
1423
1424 if curses is None:
1424 if curses is None:
1425 raise error.Abort(_("Python curses library required"))
1425 raise error.Abort(_("Python curses library required"))
1426
1426
1427 # disable color
1427 # disable color
1428 ui._colormode = None
1428 ui._colormode = None
1429
1429
1430 try:
1430 try:
1431 keep = opts.get('keep')
1431 keep = opts.get('keep')
1432 revs = opts.get('rev', [])[:]
1432 revs = opts.get('rev', [])[:]
1433 cmdutil.checkunfinished(repo)
1433 cmdutil.checkunfinished(repo)
1434 cmdutil.bailifchanged(repo)
1434 cmdutil.bailifchanged(repo)
1435
1435
1436 if os.path.exists(os.path.join(repo.path, 'histedit-state')):
1436 if os.path.exists(os.path.join(repo.path, 'histedit-state')):
1437 raise error.Abort(_('history edit already in progress, try '
1437 raise error.Abort(_('history edit already in progress, try '
1438 '--continue or --abort'))
1438 '--continue or --abort'))
1439 revs.extend(freeargs)
1439 revs.extend(freeargs)
1440 if not revs:
1440 if not revs:
1441 defaultrev = destutil.desthistedit(ui, repo)
1441 defaultrev = destutil.desthistedit(ui, repo)
1442 if defaultrev is not None:
1442 if defaultrev is not None:
1443 revs.append(defaultrev)
1443 revs.append(defaultrev)
1444 if len(revs) != 1:
1444 if len(revs) != 1:
1445 raise error.Abort(
1445 raise error.Abort(
1446 _('histedit requires exactly one ancestor revision'))
1446 _('histedit requires exactly one ancestor revision'))
1447
1447
1448 rr = list(repo.set('roots(%ld)', scmutil.revrange(repo, revs)))
1448 rr = list(repo.set('roots(%ld)', scmutil.revrange(repo, revs)))
1449 if len(rr) != 1:
1449 if len(rr) != 1:
1450 raise error.Abort(_('The specified revisions must have '
1450 raise error.Abort(_('The specified revisions must have '
1451 'exactly one common root'))
1451 'exactly one common root'))
1452 root = rr[0].node()
1452 root = rr[0].node()
1453
1453
1454 topmost, empty = repo.dirstate.parents()
1454 topmost, empty = repo.dirstate.parents()
1455 revs = between(repo, root, topmost, keep)
1455 revs = between(repo, root, topmost, keep)
1456 if not revs:
1456 if not revs:
1457 raise error.Abort(_('%s is not an ancestor of working directory') %
1457 raise error.Abort(_('%s is not an ancestor of working directory') %
1458 node.short(root))
1458 node.short(root))
1459
1459
1460 ctxs = []
1460 ctxs = []
1461 for i, r in enumerate(revs):
1461 for i, r in enumerate(revs):
1462 ctxs.append(histeditrule(repo[r], i))
1462 ctxs.append(histeditrule(repo[r], i))
1463 rc = curses.wrapper(functools.partial(_chisteditmain, repo, ctxs))
1463 rc = curses.wrapper(functools.partial(_chisteditmain, repo, ctxs))
1464 curses.echo()
1464 curses.echo()
1465 curses.endwin()
1465 curses.endwin()
1466 if rc is False:
1466 if rc is False:
1467 ui.write(_("chistedit aborted\n"))
1467 ui.write(_("chistedit aborted\n"))
1468 return 0
1468 return 0
1469 if type(rc) is list:
1469 if type(rc) is list:
1470 ui.status(_("running histedit\n"))
1470 ui.status(_("running histedit\n"))
1471 rules = makecommands(rc)
1471 rules = makecommands(rc)
1472 filename = repo.vfs.join('chistedit')
1472 filename = repo.vfs.join('chistedit')
1473 with open(filename, 'w+') as fp:
1473 with open(filename, 'w+') as fp:
1474 for r in rules:
1474 for r in rules:
1475 fp.write(r)
1475 fp.write(r)
1476 opts['commands'] = filename
1476 opts['commands'] = filename
1477 return _texthistedit(ui, repo, *freeargs, **opts)
1477 return _texthistedit(ui, repo, *freeargs, **opts)
1478 except KeyboardInterrupt:
1478 except KeyboardInterrupt:
1479 pass
1479 pass
1480 return -1
1480 return -1
1481
1481
1482 @command('histedit',
1482 @command('histedit',
1483 [('', 'commands', '',
1483 [('', 'commands', '',
1484 _('read history edits from the specified file'), _('FILE')),
1484 _('read history edits from the specified file'), _('FILE')),
1485 ('c', 'continue', False, _('continue an edit already in progress')),
1485 ('c', 'continue', False, _('continue an edit already in progress')),
1486 ('', 'edit-plan', False, _('edit remaining actions list')),
1486 ('', 'edit-plan', False, _('edit remaining actions list')),
1487 ('k', 'keep', False,
1487 ('k', 'keep', False,
1488 _("don't strip old nodes after edit is complete")),
1488 _("don't strip old nodes after edit is complete")),
1489 ('', 'abort', False, _('abort an edit in progress')),
1489 ('', 'abort', False, _('abort an edit in progress')),
1490 ('o', 'outgoing', False, _('changesets not found in destination')),
1490 ('o', 'outgoing', False, _('changesets not found in destination')),
1491 ('f', 'force', False,
1491 ('f', 'force', False,
1492 _('force outgoing even for unrelated repositories')),
1492 _('force outgoing even for unrelated repositories')),
1493 ('r', 'rev', [], _('first revision to be edited'), _('REV'))] +
1493 ('r', 'rev', [], _('first revision to be edited'), _('REV'))] +
1494 cmdutil.formatteropts,
1494 cmdutil.formatteropts,
1495 _("[OPTIONS] ([ANCESTOR] | --outgoing [URL])"),
1495 _("[OPTIONS] ([ANCESTOR] | --outgoing [URL])"),
1496 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT)
1496 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT)
1497 def histedit(ui, repo, *freeargs, **opts):
1497 def histedit(ui, repo, *freeargs, **opts):
1498 """interactively edit changeset history
1498 """interactively edit changeset history
1499
1499
1500 This command lets you edit a linear series of changesets (up to
1500 This command lets you edit a linear series of changesets (up to
1501 and including the working directory, which should be clean).
1501 and including the working directory, which should be clean).
1502 You can:
1502 You can:
1503
1503
1504 - `pick` to [re]order a changeset
1504 - `pick` to [re]order a changeset
1505
1505
1506 - `drop` to omit changeset
1506 - `drop` to omit changeset
1507
1507
1508 - `mess` to reword the changeset commit message
1508 - `mess` to reword the changeset commit message
1509
1509
1510 - `fold` to combine it with the preceding changeset (using the later date)
1510 - `fold` to combine it with the preceding changeset (using the later date)
1511
1511
1512 - `roll` like fold, but discarding this commit's description and date
1512 - `roll` like fold, but discarding this commit's description and date
1513
1513
1514 - `edit` to edit this changeset (preserving date)
1514 - `edit` to edit this changeset (preserving date)
1515
1515
1516 - `base` to checkout changeset and apply further changesets from there
1516 - `base` to checkout changeset and apply further changesets from there
1517
1517
1518 There are a number of ways to select the root changeset:
1518 There are a number of ways to select the root changeset:
1519
1519
1520 - Specify ANCESTOR directly
1520 - Specify ANCESTOR directly
1521
1521
1522 - Use --outgoing -- it will be the first linear changeset not
1522 - Use --outgoing -- it will be the first linear changeset not
1523 included in destination. (See :hg:`help config.paths.default-push`)
1523 included in destination. (See :hg:`help config.paths.default-push`)
1524
1524
1525 - Otherwise, the value from the "histedit.defaultrev" config option
1525 - Otherwise, the value from the "histedit.defaultrev" config option
1526 is used as a revset to select the base revision when ANCESTOR is not
1526 is used as a revset to select the base revision when ANCESTOR is not
1527 specified. The first revision returned by the revset is used. By
1527 specified. The first revision returned by the revset is used. By
1528 default, this selects the editable history that is unique to the
1528 default, this selects the editable history that is unique to the
1529 ancestry of the working directory.
1529 ancestry of the working directory.
1530
1530
1531 .. container:: verbose
1531 .. container:: verbose
1532
1532
1533 If you use --outgoing, this command will abort if there are ambiguous
1533 If you use --outgoing, this command will abort if there are ambiguous
1534 outgoing revisions. For example, if there are multiple branches
1534 outgoing revisions. For example, if there are multiple branches
1535 containing outgoing revisions.
1535 containing outgoing revisions.
1536
1536
1537 Use "min(outgoing() and ::.)" or similar revset specification
1537 Use "min(outgoing() and ::.)" or similar revset specification
1538 instead of --outgoing to specify edit target revision exactly in
1538 instead of --outgoing to specify edit target revision exactly in
1539 such ambiguous situation. See :hg:`help revsets` for detail about
1539 such ambiguous situation. See :hg:`help revsets` for detail about
1540 selecting revisions.
1540 selecting revisions.
1541
1541
1542 .. container:: verbose
1542 .. container:: verbose
1543
1543
1544 Examples:
1544 Examples:
1545
1545
1546 - A number of changes have been made.
1546 - A number of changes have been made.
1547 Revision 3 is no longer needed.
1547 Revision 3 is no longer needed.
1548
1548
1549 Start history editing from revision 3::
1549 Start history editing from revision 3::
1550
1550
1551 hg histedit -r 3
1551 hg histedit -r 3
1552
1552
1553 An editor opens, containing the list of revisions,
1553 An editor opens, containing the list of revisions,
1554 with specific actions specified::
1554 with specific actions specified::
1555
1555
1556 pick 5339bf82f0ca 3 Zworgle the foobar
1556 pick 5339bf82f0ca 3 Zworgle the foobar
1557 pick 8ef592ce7cc4 4 Bedazzle the zerlog
1557 pick 8ef592ce7cc4 4 Bedazzle the zerlog
1558 pick 0a9639fcda9d 5 Morgify the cromulancy
1558 pick 0a9639fcda9d 5 Morgify the cromulancy
1559
1559
1560 Additional information about the possible actions
1560 Additional information about the possible actions
1561 to take appears below the list of revisions.
1561 to take appears below the list of revisions.
1562
1562
1563 To remove revision 3 from the history,
1563 To remove revision 3 from the history,
1564 its action (at the beginning of the relevant line)
1564 its action (at the beginning of the relevant line)
1565 is changed to 'drop'::
1565 is changed to 'drop'::
1566
1566
1567 drop 5339bf82f0ca 3 Zworgle the foobar
1567 drop 5339bf82f0ca 3 Zworgle the foobar
1568 pick 8ef592ce7cc4 4 Bedazzle the zerlog
1568 pick 8ef592ce7cc4 4 Bedazzle the zerlog
1569 pick 0a9639fcda9d 5 Morgify the cromulancy
1569 pick 0a9639fcda9d 5 Morgify the cromulancy
1570
1570
1571 - A number of changes have been made.
1571 - A number of changes have been made.
1572 Revision 2 and 4 need to be swapped.
1572 Revision 2 and 4 need to be swapped.
1573
1573
1574 Start history editing from revision 2::
1574 Start history editing from revision 2::
1575
1575
1576 hg histedit -r 2
1576 hg histedit -r 2
1577
1577
1578 An editor opens, containing the list of revisions,
1578 An editor opens, containing the list of revisions,
1579 with specific actions specified::
1579 with specific actions specified::
1580
1580
1581 pick 252a1af424ad 2 Blorb a morgwazzle
1581 pick 252a1af424ad 2 Blorb a morgwazzle
1582 pick 5339bf82f0ca 3 Zworgle the foobar
1582 pick 5339bf82f0ca 3 Zworgle the foobar
1583 pick 8ef592ce7cc4 4 Bedazzle the zerlog
1583 pick 8ef592ce7cc4 4 Bedazzle the zerlog
1584
1584
1585 To swap revision 2 and 4, its lines are swapped
1585 To swap revision 2 and 4, its lines are swapped
1586 in the editor::
1586 in the editor::
1587
1587
1588 pick 8ef592ce7cc4 4 Bedazzle the zerlog
1588 pick 8ef592ce7cc4 4 Bedazzle the zerlog
1589 pick 5339bf82f0ca 3 Zworgle the foobar
1589 pick 5339bf82f0ca 3 Zworgle the foobar
1590 pick 252a1af424ad 2 Blorb a morgwazzle
1590 pick 252a1af424ad 2 Blorb a morgwazzle
1591
1591
1592 Returns 0 on success, 1 if user intervention is required (not only
1592 Returns 0 on success, 1 if user intervention is required (not only
1593 for intentional "edit" command, but also for resolving unexpected
1593 for intentional "edit" command, but also for resolving unexpected
1594 conflicts).
1594 conflicts).
1595 """
1595 """
1596 # kludge: _chistedit only works for starting an edit, not aborting
1596 # kludge: _chistedit only works for starting an edit, not aborting
1597 # or continuing, so fall back to regular _texthistedit for those
1597 # or continuing, so fall back to regular _texthistedit for those
1598 # operations.
1598 # operations.
1599 if ui.interface('histedit') == 'curses' and _getgoal(opts) == goalnew:
1599 if ui.interface('histedit') == 'curses' and _getgoal(opts) == goalnew:
1600 return _chistedit(ui, repo, *freeargs, **opts)
1600 return _chistedit(ui, repo, *freeargs, **opts)
1601 return _texthistedit(ui, repo, *freeargs, **opts)
1601 return _texthistedit(ui, repo, *freeargs, **opts)
1602
1602
1603 def _texthistedit(ui, repo, *freeargs, **opts):
1603 def _texthistedit(ui, repo, *freeargs, **opts):
1604 state = histeditstate(repo)
1604 state = histeditstate(repo)
1605 with repo.wlock() as wlock, repo.lock() as lock:
1605 with repo.wlock() as wlock, repo.lock() as lock:
1606 state.wlock = wlock
1606 state.wlock = wlock
1607 state.lock = lock
1607 state.lock = lock
1608 _histedit(ui, repo, state, *freeargs, **opts)
1608 _histedit(ui, repo, state, *freeargs, **opts)
1609
1609
1610 goalcontinue = 'continue'
1610 goalcontinue = 'continue'
1611 goalabort = 'abort'
1611 goalabort = 'abort'
1612 goaleditplan = 'edit-plan'
1612 goaleditplan = 'edit-plan'
1613 goalnew = 'new'
1613 goalnew = 'new'
1614
1614
1615 def _getgoal(opts):
1615 def _getgoal(opts):
1616 if opts.get('continue'):
1616 if opts.get('continue'):
1617 return goalcontinue
1617 return goalcontinue
1618 if opts.get('abort'):
1618 if opts.get('abort'):
1619 return goalabort
1619 return goalabort
1620 if opts.get('edit_plan'):
1620 if opts.get('edit_plan'):
1621 return goaleditplan
1621 return goaleditplan
1622 return goalnew
1622 return goalnew
1623
1623
1624 def _readfile(ui, path):
1624 def _readfile(ui, path):
1625 if path == '-':
1625 if path == '-':
1626 with ui.timeblockedsection('histedit'):
1626 with ui.timeblockedsection('histedit'):
1627 return ui.fin.read()
1627 return ui.fin.read()
1628 else:
1628 else:
1629 with open(path, 'rb') as f:
1629 with open(path, 'rb') as f:
1630 return f.read()
1630 return f.read()
1631
1631
1632 def _validateargs(ui, repo, state, freeargs, opts, goal, rules, revs):
1632 def _validateargs(ui, repo, state, freeargs, opts, goal, rules, revs):
1633 # TODO only abort if we try to histedit mq patches, not just
1633 # TODO only abort if we try to histedit mq patches, not just
1634 # blanket if mq patches are applied somewhere
1634 # blanket if mq patches are applied somewhere
1635 mq = getattr(repo, 'mq', None)
1635 mq = getattr(repo, 'mq', None)
1636 if mq and mq.applied:
1636 if mq and mq.applied:
1637 raise error.Abort(_('source has mq patches applied'))
1637 raise error.Abort(_('source has mq patches applied'))
1638
1638
1639 # basic argument incompatibility processing
1639 # basic argument incompatibility processing
1640 outg = opts.get('outgoing')
1640 outg = opts.get('outgoing')
1641 editplan = opts.get('edit_plan')
1641 editplan = opts.get('edit_plan')
1642 abort = opts.get('abort')
1642 abort = opts.get('abort')
1643 force = opts.get('force')
1643 force = opts.get('force')
1644 if force and not outg:
1644 if force and not outg:
1645 raise error.Abort(_('--force only allowed with --outgoing'))
1645 raise error.Abort(_('--force only allowed with --outgoing'))
1646 if goal == 'continue':
1646 if goal == 'continue':
1647 if any((outg, abort, revs, freeargs, rules, editplan)):
1647 if any((outg, abort, revs, freeargs, rules, editplan)):
1648 raise error.Abort(_('no arguments allowed with --continue'))
1648 raise error.Abort(_('no arguments allowed with --continue'))
1649 elif goal == 'abort':
1649 elif goal == 'abort':
1650 if any((outg, revs, freeargs, rules, editplan)):
1650 if any((outg, revs, freeargs, rules, editplan)):
1651 raise error.Abort(_('no arguments allowed with --abort'))
1651 raise error.Abort(_('no arguments allowed with --abort'))
1652 elif goal == 'edit-plan':
1652 elif goal == 'edit-plan':
1653 if any((outg, revs, freeargs)):
1653 if any((outg, revs, freeargs)):
1654 raise error.Abort(_('only --commands argument allowed with '
1654 raise error.Abort(_('only --commands argument allowed with '
1655 '--edit-plan'))
1655 '--edit-plan'))
1656 else:
1656 else:
1657 if state.inprogress():
1657 if state.inprogress():
1658 raise error.Abort(_('history edit already in progress, try '
1658 raise error.Abort(_('history edit already in progress, try '
1659 '--continue or --abort'))
1659 '--continue or --abort'))
1660 if outg:
1660 if outg:
1661 if revs:
1661 if revs:
1662 raise error.Abort(_('no revisions allowed with --outgoing'))
1662 raise error.Abort(_('no revisions allowed with --outgoing'))
1663 if len(freeargs) > 1:
1663 if len(freeargs) > 1:
1664 raise error.Abort(
1664 raise error.Abort(
1665 _('only one repo argument allowed with --outgoing'))
1665 _('only one repo argument allowed with --outgoing'))
1666 else:
1666 else:
1667 revs.extend(freeargs)
1667 revs.extend(freeargs)
1668 if len(revs) == 0:
1668 if len(revs) == 0:
1669 defaultrev = destutil.desthistedit(ui, repo)
1669 defaultrev = destutil.desthistedit(ui, repo)
1670 if defaultrev is not None:
1670 if defaultrev is not None:
1671 revs.append(defaultrev)
1671 revs.append(defaultrev)
1672
1672
1673 if len(revs) != 1:
1673 if len(revs) != 1:
1674 raise error.Abort(
1674 raise error.Abort(
1675 _('histedit requires exactly one ancestor revision'))
1675 _('histedit requires exactly one ancestor revision'))
1676
1676
1677 def _histedit(ui, repo, state, *freeargs, **opts):
1677 def _histedit(ui, repo, state, *freeargs, **opts):
1678 opts = pycompat.byteskwargs(opts)
1678 opts = pycompat.byteskwargs(opts)
1679 fm = ui.formatter('histedit', opts)
1679 fm = ui.formatter('histedit', opts)
1680 fm.startitem()
1680 fm.startitem()
1681 goal = _getgoal(opts)
1681 goal = _getgoal(opts)
1682 revs = opts.get('rev', [])
1682 revs = opts.get('rev', [])
1683 # experimental config: rewrite.backup-bundle
1684 nobackup = not ui.configbool('rewrite', 'backup-bundle')
1683 nobackup = not ui.configbool('rewrite', 'backup-bundle')
1685 rules = opts.get('commands', '')
1684 rules = opts.get('commands', '')
1686 state.keep = opts.get('keep', False)
1685 state.keep = opts.get('keep', False)
1687
1686
1688 _validateargs(ui, repo, state, freeargs, opts, goal, rules, revs)
1687 _validateargs(ui, repo, state, freeargs, opts, goal, rules, revs)
1689
1688
1690 hastags = False
1689 hastags = False
1691 if revs:
1690 if revs:
1692 revs = scmutil.revrange(repo, revs)
1691 revs = scmutil.revrange(repo, revs)
1693 ctxs = [repo[rev] for rev in revs]
1692 ctxs = [repo[rev] for rev in revs]
1694 for ctx in ctxs:
1693 for ctx in ctxs:
1695 tags = [tag for tag in ctx.tags() if tag != 'tip']
1694 tags = [tag for tag in ctx.tags() if tag != 'tip']
1696 if not hastags:
1695 if not hastags:
1697 hastags = len(tags)
1696 hastags = len(tags)
1698 if hastags:
1697 if hastags:
1699 if ui.promptchoice(_('warning: tags associated with the given'
1698 if ui.promptchoice(_('warning: tags associated with the given'
1700 ' changeset will be lost after histedit. \n'
1699 ' changeset will be lost after histedit. \n'
1701 'do you want to continue (yN)? $$ &Yes $$ &No'), default=1):
1700 'do you want to continue (yN)? $$ &Yes $$ &No'), default=1):
1702 raise error.Abort(_('histedit cancelled\n'))
1701 raise error.Abort(_('histedit cancelled\n'))
1703 # rebuild state
1702 # rebuild state
1704 if goal == goalcontinue:
1703 if goal == goalcontinue:
1705 state.read()
1704 state.read()
1706 state = bootstrapcontinue(ui, state, opts)
1705 state = bootstrapcontinue(ui, state, opts)
1707 elif goal == goaleditplan:
1706 elif goal == goaleditplan:
1708 _edithisteditplan(ui, repo, state, rules)
1707 _edithisteditplan(ui, repo, state, rules)
1709 return
1708 return
1710 elif goal == goalabort:
1709 elif goal == goalabort:
1711 _aborthistedit(ui, repo, state, nobackup=nobackup)
1710 _aborthistedit(ui, repo, state, nobackup=nobackup)
1712 return
1711 return
1713 else:
1712 else:
1714 # goal == goalnew
1713 # goal == goalnew
1715 _newhistedit(ui, repo, state, revs, freeargs, opts)
1714 _newhistedit(ui, repo, state, revs, freeargs, opts)
1716
1715
1717 _continuehistedit(ui, repo, state)
1716 _continuehistedit(ui, repo, state)
1718 _finishhistedit(ui, repo, state, fm)
1717 _finishhistedit(ui, repo, state, fm)
1719 fm.end()
1718 fm.end()
1720
1719
1721 def _continuehistedit(ui, repo, state):
1720 def _continuehistedit(ui, repo, state):
1722 """This function runs after either:
1721 """This function runs after either:
1723 - bootstrapcontinue (if the goal is 'continue')
1722 - bootstrapcontinue (if the goal is 'continue')
1724 - _newhistedit (if the goal is 'new')
1723 - _newhistedit (if the goal is 'new')
1725 """
1724 """
1726 # preprocess rules so that we can hide inner folds from the user
1725 # preprocess rules so that we can hide inner folds from the user
1727 # and only show one editor
1726 # and only show one editor
1728 actions = state.actions[:]
1727 actions = state.actions[:]
1729 for idx, (action, nextact) in enumerate(
1728 for idx, (action, nextact) in enumerate(
1730 zip(actions, actions[1:] + [None])):
1729 zip(actions, actions[1:] + [None])):
1731 if action.verb == 'fold' and nextact and nextact.verb == 'fold':
1730 if action.verb == 'fold' and nextact and nextact.verb == 'fold':
1732 state.actions[idx].__class__ = _multifold
1731 state.actions[idx].__class__ = _multifold
1733
1732
1734 # Force an initial state file write, so the user can run --abort/continue
1733 # Force an initial state file write, so the user can run --abort/continue
1735 # even if there's an exception before the first transaction serialize.
1734 # even if there's an exception before the first transaction serialize.
1736 state.write()
1735 state.write()
1737
1736
1738 tr = None
1737 tr = None
1739 # Don't use singletransaction by default since it rolls the entire
1738 # Don't use singletransaction by default since it rolls the entire
1740 # transaction back if an unexpected exception happens (like a
1739 # transaction back if an unexpected exception happens (like a
1741 # pretxncommit hook throws, or the user aborts the commit msg editor).
1740 # pretxncommit hook throws, or the user aborts the commit msg editor).
1742 if ui.configbool("histedit", "singletransaction"):
1741 if ui.configbool("histedit", "singletransaction"):
1743 # Don't use a 'with' for the transaction, since actions may close
1742 # Don't use a 'with' for the transaction, since actions may close
1744 # and reopen a transaction. For example, if the action executes an
1743 # and reopen a transaction. For example, if the action executes an
1745 # external process it may choose to commit the transaction first.
1744 # external process it may choose to commit the transaction first.
1746 tr = repo.transaction('histedit')
1745 tr = repo.transaction('histedit')
1747 progress = ui.makeprogress(_("editing"), unit=_('changes'),
1746 progress = ui.makeprogress(_("editing"), unit=_('changes'),
1748 total=len(state.actions))
1747 total=len(state.actions))
1749 with progress, util.acceptintervention(tr):
1748 with progress, util.acceptintervention(tr):
1750 while state.actions:
1749 while state.actions:
1751 state.write(tr=tr)
1750 state.write(tr=tr)
1752 actobj = state.actions[0]
1751 actobj = state.actions[0]
1753 progress.increment(item=actobj.torule())
1752 progress.increment(item=actobj.torule())
1754 ui.debug('histedit: processing %s %s\n' % (actobj.verb,\
1753 ui.debug('histedit: processing %s %s\n' % (actobj.verb,\
1755 actobj.torule()))
1754 actobj.torule()))
1756 parentctx, replacement_ = actobj.run()
1755 parentctx, replacement_ = actobj.run()
1757 state.parentctxnode = parentctx.node()
1756 state.parentctxnode = parentctx.node()
1758 state.replacements.extend(replacement_)
1757 state.replacements.extend(replacement_)
1759 state.actions.pop(0)
1758 state.actions.pop(0)
1760
1759
1761 state.write()
1760 state.write()
1762
1761
1763 def _finishhistedit(ui, repo, state, fm):
1762 def _finishhistedit(ui, repo, state, fm):
1764 """This action runs when histedit is finishing its session"""
1763 """This action runs when histedit is finishing its session"""
1765 hg.updaterepo(repo, state.parentctxnode, overwrite=False)
1764 hg.updaterepo(repo, state.parentctxnode, overwrite=False)
1766
1765
1767 mapping, tmpnodes, created, ntm = processreplacement(state)
1766 mapping, tmpnodes, created, ntm = processreplacement(state)
1768 if mapping:
1767 if mapping:
1769 for prec, succs in mapping.iteritems():
1768 for prec, succs in mapping.iteritems():
1770 if not succs:
1769 if not succs:
1771 ui.debug('histedit: %s is dropped\n' % node.short(prec))
1770 ui.debug('histedit: %s is dropped\n' % node.short(prec))
1772 else:
1771 else:
1773 ui.debug('histedit: %s is replaced by %s\n' % (
1772 ui.debug('histedit: %s is replaced by %s\n' % (
1774 node.short(prec), node.short(succs[0])))
1773 node.short(prec), node.short(succs[0])))
1775 if len(succs) > 1:
1774 if len(succs) > 1:
1776 m = 'histedit: %s'
1775 m = 'histedit: %s'
1777 for n in succs[1:]:
1776 for n in succs[1:]:
1778 ui.debug(m % node.short(n))
1777 ui.debug(m % node.short(n))
1779
1778
1780 if not state.keep:
1779 if not state.keep:
1781 if mapping:
1780 if mapping:
1782 movetopmostbookmarks(repo, state.topmost, ntm)
1781 movetopmostbookmarks(repo, state.topmost, ntm)
1783 # TODO update mq state
1782 # TODO update mq state
1784 else:
1783 else:
1785 mapping = {}
1784 mapping = {}
1786
1785
1787 for n in tmpnodes:
1786 for n in tmpnodes:
1788 if n in repo:
1787 if n in repo:
1789 mapping[n] = ()
1788 mapping[n] = ()
1790
1789
1791 # remove entries about unknown nodes
1790 # remove entries about unknown nodes
1792 nodemap = repo.unfiltered().changelog.nodemap
1791 nodemap = repo.unfiltered().changelog.nodemap
1793 mapping = {k: v for k, v in mapping.items()
1792 mapping = {k: v for k, v in mapping.items()
1794 if k in nodemap and all(n in nodemap for n in v)}
1793 if k in nodemap and all(n in nodemap for n in v)}
1795 scmutil.cleanupnodes(repo, mapping, 'histedit')
1794 scmutil.cleanupnodes(repo, mapping, 'histedit')
1796 hf = fm.hexfunc
1795 hf = fm.hexfunc
1797 fl = fm.formatlist
1796 fl = fm.formatlist
1798 fd = fm.formatdict
1797 fd = fm.formatdict
1799 nodechanges = fd({hf(oldn): fl([hf(n) for n in newn], name='node')
1798 nodechanges = fd({hf(oldn): fl([hf(n) for n in newn], name='node')
1800 for oldn, newn in mapping.iteritems()},
1799 for oldn, newn in mapping.iteritems()},
1801 key="oldnode", value="newnodes")
1800 key="oldnode", value="newnodes")
1802 fm.data(nodechanges=nodechanges)
1801 fm.data(nodechanges=nodechanges)
1803
1802
1804 state.clear()
1803 state.clear()
1805 if os.path.exists(repo.sjoin('undo')):
1804 if os.path.exists(repo.sjoin('undo')):
1806 os.unlink(repo.sjoin('undo'))
1805 os.unlink(repo.sjoin('undo'))
1807 if repo.vfs.exists('histedit-last-edit.txt'):
1806 if repo.vfs.exists('histedit-last-edit.txt'):
1808 repo.vfs.unlink('histedit-last-edit.txt')
1807 repo.vfs.unlink('histedit-last-edit.txt')
1809
1808
1810 def _aborthistedit(ui, repo, state, nobackup=False):
1809 def _aborthistedit(ui, repo, state, nobackup=False):
1811 try:
1810 try:
1812 state.read()
1811 state.read()
1813 __, leafs, tmpnodes, __ = processreplacement(state)
1812 __, leafs, tmpnodes, __ = processreplacement(state)
1814 ui.debug('restore wc to old parent %s\n'
1813 ui.debug('restore wc to old parent %s\n'
1815 % node.short(state.topmost))
1814 % node.short(state.topmost))
1816
1815
1817 # Recover our old commits if necessary
1816 # Recover our old commits if necessary
1818 if not state.topmost in repo and state.backupfile:
1817 if not state.topmost in repo and state.backupfile:
1819 backupfile = repo.vfs.join(state.backupfile)
1818 backupfile = repo.vfs.join(state.backupfile)
1820 f = hg.openpath(ui, backupfile)
1819 f = hg.openpath(ui, backupfile)
1821 gen = exchange.readbundle(ui, f, backupfile)
1820 gen = exchange.readbundle(ui, f, backupfile)
1822 with repo.transaction('histedit.abort') as tr:
1821 with repo.transaction('histedit.abort') as tr:
1823 bundle2.applybundle(repo, gen, tr, source='histedit',
1822 bundle2.applybundle(repo, gen, tr, source='histedit',
1824 url='bundle:' + backupfile)
1823 url='bundle:' + backupfile)
1825
1824
1826 os.remove(backupfile)
1825 os.remove(backupfile)
1827
1826
1828 # check whether we should update away
1827 # check whether we should update away
1829 if repo.unfiltered().revs('parents() and (%n or %ln::)',
1828 if repo.unfiltered().revs('parents() and (%n or %ln::)',
1830 state.parentctxnode, leafs | tmpnodes):
1829 state.parentctxnode, leafs | tmpnodes):
1831 hg.clean(repo, state.topmost, show_stats=True, quietempty=True)
1830 hg.clean(repo, state.topmost, show_stats=True, quietempty=True)
1832 cleanupnode(ui, repo, tmpnodes, nobackup=nobackup)
1831 cleanupnode(ui, repo, tmpnodes, nobackup=nobackup)
1833 cleanupnode(ui, repo, leafs, nobackup=nobackup)
1832 cleanupnode(ui, repo, leafs, nobackup=nobackup)
1834 except Exception:
1833 except Exception:
1835 if state.inprogress():
1834 if state.inprogress():
1836 ui.warn(_('warning: encountered an exception during histedit '
1835 ui.warn(_('warning: encountered an exception during histedit '
1837 '--abort; the repository may not have been completely '
1836 '--abort; the repository may not have been completely '
1838 'cleaned up\n'))
1837 'cleaned up\n'))
1839 raise
1838 raise
1840 finally:
1839 finally:
1841 state.clear()
1840 state.clear()
1842
1841
1843 def _edithisteditplan(ui, repo, state, rules):
1842 def _edithisteditplan(ui, repo, state, rules):
1844 state.read()
1843 state.read()
1845 if not rules:
1844 if not rules:
1846 comment = geteditcomment(ui,
1845 comment = geteditcomment(ui,
1847 node.short(state.parentctxnode),
1846 node.short(state.parentctxnode),
1848 node.short(state.topmost))
1847 node.short(state.topmost))
1849 rules = ruleeditor(repo, ui, state.actions, comment)
1848 rules = ruleeditor(repo, ui, state.actions, comment)
1850 else:
1849 else:
1851 rules = _readfile(ui, rules)
1850 rules = _readfile(ui, rules)
1852 actions = parserules(rules, state)
1851 actions = parserules(rules, state)
1853 ctxs = [repo[act.node] \
1852 ctxs = [repo[act.node] \
1854 for act in state.actions if act.node]
1853 for act in state.actions if act.node]
1855 warnverifyactions(ui, repo, actions, state, ctxs)
1854 warnverifyactions(ui, repo, actions, state, ctxs)
1856 state.actions = actions
1855 state.actions = actions
1857 state.write()
1856 state.write()
1858
1857
1859 def _newhistedit(ui, repo, state, revs, freeargs, opts):
1858 def _newhistedit(ui, repo, state, revs, freeargs, opts):
1860 outg = opts.get('outgoing')
1859 outg = opts.get('outgoing')
1861 rules = opts.get('commands', '')
1860 rules = opts.get('commands', '')
1862 force = opts.get('force')
1861 force = opts.get('force')
1863
1862
1864 cmdutil.checkunfinished(repo)
1863 cmdutil.checkunfinished(repo)
1865 cmdutil.bailifchanged(repo)
1864 cmdutil.bailifchanged(repo)
1866
1865
1867 topmost, empty = repo.dirstate.parents()
1866 topmost, empty = repo.dirstate.parents()
1868 if outg:
1867 if outg:
1869 if freeargs:
1868 if freeargs:
1870 remote = freeargs[0]
1869 remote = freeargs[0]
1871 else:
1870 else:
1872 remote = None
1871 remote = None
1873 root = findoutgoing(ui, repo, remote, force, opts)
1872 root = findoutgoing(ui, repo, remote, force, opts)
1874 else:
1873 else:
1875 rr = list(repo.set('roots(%ld)', scmutil.revrange(repo, revs)))
1874 rr = list(repo.set('roots(%ld)', scmutil.revrange(repo, revs)))
1876 if len(rr) != 1:
1875 if len(rr) != 1:
1877 raise error.Abort(_('The specified revisions must have '
1876 raise error.Abort(_('The specified revisions must have '
1878 'exactly one common root'))
1877 'exactly one common root'))
1879 root = rr[0].node()
1878 root = rr[0].node()
1880
1879
1881 revs = between(repo, root, topmost, state.keep)
1880 revs = between(repo, root, topmost, state.keep)
1882 if not revs:
1881 if not revs:
1883 raise error.Abort(_('%s is not an ancestor of working directory') %
1882 raise error.Abort(_('%s is not an ancestor of working directory') %
1884 node.short(root))
1883 node.short(root))
1885
1884
1886 ctxs = [repo[r] for r in revs]
1885 ctxs = [repo[r] for r in revs]
1887 if not rules:
1886 if not rules:
1888 comment = geteditcomment(ui, node.short(root), node.short(topmost))
1887 comment = geteditcomment(ui, node.short(root), node.short(topmost))
1889 actions = [pick(state, r) for r in revs]
1888 actions = [pick(state, r) for r in revs]
1890 rules = ruleeditor(repo, ui, actions, comment)
1889 rules = ruleeditor(repo, ui, actions, comment)
1891 else:
1890 else:
1892 rules = _readfile(ui, rules)
1891 rules = _readfile(ui, rules)
1893 actions = parserules(rules, state)
1892 actions = parserules(rules, state)
1894 warnverifyactions(ui, repo, actions, state, ctxs)
1893 warnverifyactions(ui, repo, actions, state, ctxs)
1895
1894
1896 parentctxnode = repo[root].parents()[0].node()
1895 parentctxnode = repo[root].parents()[0].node()
1897
1896
1898 state.parentctxnode = parentctxnode
1897 state.parentctxnode = parentctxnode
1899 state.actions = actions
1898 state.actions = actions
1900 state.topmost = topmost
1899 state.topmost = topmost
1901 state.replacements = []
1900 state.replacements = []
1902
1901
1903 ui.log("histedit", "%d actions to histedit\n", len(actions),
1902 ui.log("histedit", "%d actions to histedit\n", len(actions),
1904 histedit_num_actions=len(actions))
1903 histedit_num_actions=len(actions))
1905
1904
1906 # Create a backup so we can always abort completely.
1905 # Create a backup so we can always abort completely.
1907 backupfile = None
1906 backupfile = None
1908 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
1907 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
1909 backupfile = repair.backupbundle(repo, [parentctxnode],
1908 backupfile = repair.backupbundle(repo, [parentctxnode],
1910 [topmost], root, 'histedit')
1909 [topmost], root, 'histedit')
1911 state.backupfile = backupfile
1910 state.backupfile = backupfile
1912
1911
1913 def _getsummary(ctx):
1912 def _getsummary(ctx):
1914 # a common pattern is to extract the summary but default to the empty
1913 # a common pattern is to extract the summary but default to the empty
1915 # string
1914 # string
1916 summary = ctx.description() or ''
1915 summary = ctx.description() or ''
1917 if summary:
1916 if summary:
1918 summary = summary.splitlines()[0]
1917 summary = summary.splitlines()[0]
1919 return summary
1918 return summary
1920
1919
1921 def bootstrapcontinue(ui, state, opts):
1920 def bootstrapcontinue(ui, state, opts):
1922 repo = state.repo
1921 repo = state.repo
1923
1922
1924 ms = mergemod.mergestate.read(repo)
1923 ms = mergemod.mergestate.read(repo)
1925 mergeutil.checkunresolved(ms)
1924 mergeutil.checkunresolved(ms)
1926
1925
1927 if state.actions:
1926 if state.actions:
1928 actobj = state.actions.pop(0)
1927 actobj = state.actions.pop(0)
1929
1928
1930 if _isdirtywc(repo):
1929 if _isdirtywc(repo):
1931 actobj.continuedirty()
1930 actobj.continuedirty()
1932 if _isdirtywc(repo):
1931 if _isdirtywc(repo):
1933 abortdirty()
1932 abortdirty()
1934
1933
1935 parentctx, replacements = actobj.continueclean()
1934 parentctx, replacements = actobj.continueclean()
1936
1935
1937 state.parentctxnode = parentctx.node()
1936 state.parentctxnode = parentctx.node()
1938 state.replacements.extend(replacements)
1937 state.replacements.extend(replacements)
1939
1938
1940 return state
1939 return state
1941
1940
1942 def between(repo, old, new, keep):
1941 def between(repo, old, new, keep):
1943 """select and validate the set of revision to edit
1942 """select and validate the set of revision to edit
1944
1943
1945 When keep is false, the specified set can't have children."""
1944 When keep is false, the specified set can't have children."""
1946 revs = repo.revs('%n::%n', old, new)
1945 revs = repo.revs('%n::%n', old, new)
1947 if revs and not keep:
1946 if revs and not keep:
1948 if (not obsolete.isenabled(repo, obsolete.allowunstableopt) and
1947 if (not obsolete.isenabled(repo, obsolete.allowunstableopt) and
1949 repo.revs('(%ld::) - (%ld)', revs, revs)):
1948 repo.revs('(%ld::) - (%ld)', revs, revs)):
1950 raise error.Abort(_('can only histedit a changeset together '
1949 raise error.Abort(_('can only histedit a changeset together '
1951 'with all its descendants'))
1950 'with all its descendants'))
1952 if repo.revs('(%ld) and merge()', revs):
1951 if repo.revs('(%ld) and merge()', revs):
1953 raise error.Abort(_('cannot edit history that contains merges'))
1952 raise error.Abort(_('cannot edit history that contains merges'))
1954 root = repo[revs.first()] # list is already sorted by repo.revs()
1953 root = repo[revs.first()] # list is already sorted by repo.revs()
1955 if not root.mutable():
1954 if not root.mutable():
1956 raise error.Abort(_('cannot edit public changeset: %s') % root,
1955 raise error.Abort(_('cannot edit public changeset: %s') % root,
1957 hint=_("see 'hg help phases' for details"))
1956 hint=_("see 'hg help phases' for details"))
1958 return pycompat.maplist(repo.changelog.node, revs)
1957 return pycompat.maplist(repo.changelog.node, revs)
1959
1958
1960 def ruleeditor(repo, ui, actions, editcomment=""):
1959 def ruleeditor(repo, ui, actions, editcomment=""):
1961 """open an editor to edit rules
1960 """open an editor to edit rules
1962
1961
1963 rules are in the format [ [act, ctx], ...] like in state.rules
1962 rules are in the format [ [act, ctx], ...] like in state.rules
1964 """
1963 """
1965 if repo.ui.configbool("experimental", "histedit.autoverb"):
1964 if repo.ui.configbool("experimental", "histedit.autoverb"):
1966 newact = util.sortdict()
1965 newact = util.sortdict()
1967 for act in actions:
1966 for act in actions:
1968 ctx = repo[act.node]
1967 ctx = repo[act.node]
1969 summary = _getsummary(ctx)
1968 summary = _getsummary(ctx)
1970 fword = summary.split(' ', 1)[0].lower()
1969 fword = summary.split(' ', 1)[0].lower()
1971 added = False
1970 added = False
1972
1971
1973 # if it doesn't end with the special character '!' just skip this
1972 # if it doesn't end with the special character '!' just skip this
1974 if fword.endswith('!'):
1973 if fword.endswith('!'):
1975 fword = fword[:-1]
1974 fword = fword[:-1]
1976 if fword in primaryactions | secondaryactions | tertiaryactions:
1975 if fword in primaryactions | secondaryactions | tertiaryactions:
1977 act.verb = fword
1976 act.verb = fword
1978 # get the target summary
1977 # get the target summary
1979 tsum = summary[len(fword) + 1:].lstrip()
1978 tsum = summary[len(fword) + 1:].lstrip()
1980 # safe but slow: reverse iterate over the actions so we
1979 # safe but slow: reverse iterate over the actions so we
1981 # don't clash on two commits having the same summary
1980 # don't clash on two commits having the same summary
1982 for na, l in reversed(list(newact.iteritems())):
1981 for na, l in reversed(list(newact.iteritems())):
1983 actx = repo[na.node]
1982 actx = repo[na.node]
1984 asum = _getsummary(actx)
1983 asum = _getsummary(actx)
1985 if asum == tsum:
1984 if asum == tsum:
1986 added = True
1985 added = True
1987 l.append(act)
1986 l.append(act)
1988 break
1987 break
1989
1988
1990 if not added:
1989 if not added:
1991 newact[act] = []
1990 newact[act] = []
1992
1991
1993 # copy over and flatten the new list
1992 # copy over and flatten the new list
1994 actions = []
1993 actions = []
1995 for na, l in newact.iteritems():
1994 for na, l in newact.iteritems():
1996 actions.append(na)
1995 actions.append(na)
1997 actions += l
1996 actions += l
1998
1997
1999 rules = '\n'.join([act.torule() for act in actions])
1998 rules = '\n'.join([act.torule() for act in actions])
2000 rules += '\n\n'
1999 rules += '\n\n'
2001 rules += editcomment
2000 rules += editcomment
2002 rules = ui.edit(rules, ui.username(), {'prefix': 'histedit'},
2001 rules = ui.edit(rules, ui.username(), {'prefix': 'histedit'},
2003 repopath=repo.path, action='histedit')
2002 repopath=repo.path, action='histedit')
2004
2003
2005 # Save edit rules in .hg/histedit-last-edit.txt in case
2004 # Save edit rules in .hg/histedit-last-edit.txt in case
2006 # the user needs to ask for help after something
2005 # the user needs to ask for help after something
2007 # surprising happens.
2006 # surprising happens.
2008 with repo.vfs('histedit-last-edit.txt', 'wb') as f:
2007 with repo.vfs('histedit-last-edit.txt', 'wb') as f:
2009 f.write(rules)
2008 f.write(rules)
2010
2009
2011 return rules
2010 return rules
2012
2011
2013 def parserules(rules, state):
2012 def parserules(rules, state):
2014 """Read the histedit rules string and return list of action objects """
2013 """Read the histedit rules string and return list of action objects """
2015 rules = [l for l in (r.strip() for r in rules.splitlines())
2014 rules = [l for l in (r.strip() for r in rules.splitlines())
2016 if l and not l.startswith('#')]
2015 if l and not l.startswith('#')]
2017 actions = []
2016 actions = []
2018 for r in rules:
2017 for r in rules:
2019 if ' ' not in r:
2018 if ' ' not in r:
2020 raise error.ParseError(_('malformed line "%s"') % r)
2019 raise error.ParseError(_('malformed line "%s"') % r)
2021 verb, rest = r.split(' ', 1)
2020 verb, rest = r.split(' ', 1)
2022
2021
2023 if verb not in actiontable:
2022 if verb not in actiontable:
2024 raise error.ParseError(_('unknown action "%s"') % verb)
2023 raise error.ParseError(_('unknown action "%s"') % verb)
2025
2024
2026 action = actiontable[verb].fromrule(state, rest)
2025 action = actiontable[verb].fromrule(state, rest)
2027 actions.append(action)
2026 actions.append(action)
2028 return actions
2027 return actions
2029
2028
2030 def warnverifyactions(ui, repo, actions, state, ctxs):
2029 def warnverifyactions(ui, repo, actions, state, ctxs):
2031 try:
2030 try:
2032 verifyactions(actions, state, ctxs)
2031 verifyactions(actions, state, ctxs)
2033 except error.ParseError:
2032 except error.ParseError:
2034 if repo.vfs.exists('histedit-last-edit.txt'):
2033 if repo.vfs.exists('histedit-last-edit.txt'):
2035 ui.warn(_('warning: histedit rules saved '
2034 ui.warn(_('warning: histedit rules saved '
2036 'to: .hg/histedit-last-edit.txt\n'))
2035 'to: .hg/histedit-last-edit.txt\n'))
2037 raise
2036 raise
2038
2037
2039 def verifyactions(actions, state, ctxs):
2038 def verifyactions(actions, state, ctxs):
2040 """Verify that there exists exactly one action per given changeset and
2039 """Verify that there exists exactly one action per given changeset and
2041 other constraints.
2040 other constraints.
2042
2041
2043 Will abort if there are to many or too few rules, a malformed rule,
2042 Will abort if there are to many or too few rules, a malformed rule,
2044 or a rule on a changeset outside of the user-given range.
2043 or a rule on a changeset outside of the user-given range.
2045 """
2044 """
2046 expected = set(c.node() for c in ctxs)
2045 expected = set(c.node() for c in ctxs)
2047 seen = set()
2046 seen = set()
2048 prev = None
2047 prev = None
2049
2048
2050 if actions and actions[0].verb in ['roll', 'fold']:
2049 if actions and actions[0].verb in ['roll', 'fold']:
2051 raise error.ParseError(_('first changeset cannot use verb "%s"') %
2050 raise error.ParseError(_('first changeset cannot use verb "%s"') %
2052 actions[0].verb)
2051 actions[0].verb)
2053
2052
2054 for action in actions:
2053 for action in actions:
2055 action.verify(prev, expected, seen)
2054 action.verify(prev, expected, seen)
2056 prev = action
2055 prev = action
2057 if action.node is not None:
2056 if action.node is not None:
2058 seen.add(action.node)
2057 seen.add(action.node)
2059 missing = sorted(expected - seen) # sort to stabilize output
2058 missing = sorted(expected - seen) # sort to stabilize output
2060
2059
2061 if state.repo.ui.configbool('histedit', 'dropmissing'):
2060 if state.repo.ui.configbool('histedit', 'dropmissing'):
2062 if len(actions) == 0:
2061 if len(actions) == 0:
2063 raise error.ParseError(_('no rules provided'),
2062 raise error.ParseError(_('no rules provided'),
2064 hint=_('use strip extension to remove commits'))
2063 hint=_('use strip extension to remove commits'))
2065
2064
2066 drops = [drop(state, n) for n in missing]
2065 drops = [drop(state, n) for n in missing]
2067 # put the in the beginning so they execute immediately and
2066 # put the in the beginning so they execute immediately and
2068 # don't show in the edit-plan in the future
2067 # don't show in the edit-plan in the future
2069 actions[:0] = drops
2068 actions[:0] = drops
2070 elif missing:
2069 elif missing:
2071 raise error.ParseError(_('missing rules for changeset %s') %
2070 raise error.ParseError(_('missing rules for changeset %s') %
2072 node.short(missing[0]),
2071 node.short(missing[0]),
2073 hint=_('use "drop %s" to discard, see also: '
2072 hint=_('use "drop %s" to discard, see also: '
2074 "'hg help -e histedit.config'")
2073 "'hg help -e histedit.config'")
2075 % node.short(missing[0]))
2074 % node.short(missing[0]))
2076
2075
2077 def adjustreplacementsfrommarkers(repo, oldreplacements):
2076 def adjustreplacementsfrommarkers(repo, oldreplacements):
2078 """Adjust replacements from obsolescence markers
2077 """Adjust replacements from obsolescence markers
2079
2078
2080 Replacements structure is originally generated based on
2079 Replacements structure is originally generated based on
2081 histedit's state and does not account for changes that are
2080 histedit's state and does not account for changes that are
2082 not recorded there. This function fixes that by adding
2081 not recorded there. This function fixes that by adding
2083 data read from obsolescence markers"""
2082 data read from obsolescence markers"""
2084 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2083 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2085 return oldreplacements
2084 return oldreplacements
2086
2085
2087 unfi = repo.unfiltered()
2086 unfi = repo.unfiltered()
2088 nm = unfi.changelog.nodemap
2087 nm = unfi.changelog.nodemap
2089 obsstore = repo.obsstore
2088 obsstore = repo.obsstore
2090 newreplacements = list(oldreplacements)
2089 newreplacements = list(oldreplacements)
2091 oldsuccs = [r[1] for r in oldreplacements]
2090 oldsuccs = [r[1] for r in oldreplacements]
2092 # successors that have already been added to succstocheck once
2091 # successors that have already been added to succstocheck once
2093 seensuccs = set().union(*oldsuccs) # create a set from an iterable of tuples
2092 seensuccs = set().union(*oldsuccs) # create a set from an iterable of tuples
2094 succstocheck = list(seensuccs)
2093 succstocheck = list(seensuccs)
2095 while succstocheck:
2094 while succstocheck:
2096 n = succstocheck.pop()
2095 n = succstocheck.pop()
2097 missing = nm.get(n) is None
2096 missing = nm.get(n) is None
2098 markers = obsstore.successors.get(n, ())
2097 markers = obsstore.successors.get(n, ())
2099 if missing and not markers:
2098 if missing and not markers:
2100 # dead end, mark it as such
2099 # dead end, mark it as such
2101 newreplacements.append((n, ()))
2100 newreplacements.append((n, ()))
2102 for marker in markers:
2101 for marker in markers:
2103 nsuccs = marker[1]
2102 nsuccs = marker[1]
2104 newreplacements.append((n, nsuccs))
2103 newreplacements.append((n, nsuccs))
2105 for nsucc in nsuccs:
2104 for nsucc in nsuccs:
2106 if nsucc not in seensuccs:
2105 if nsucc not in seensuccs:
2107 seensuccs.add(nsucc)
2106 seensuccs.add(nsucc)
2108 succstocheck.append(nsucc)
2107 succstocheck.append(nsucc)
2109
2108
2110 return newreplacements
2109 return newreplacements
2111
2110
2112 def processreplacement(state):
2111 def processreplacement(state):
2113 """process the list of replacements to return
2112 """process the list of replacements to return
2114
2113
2115 1) the final mapping between original and created nodes
2114 1) the final mapping between original and created nodes
2116 2) the list of temporary node created by histedit
2115 2) the list of temporary node created by histedit
2117 3) the list of new commit created by histedit"""
2116 3) the list of new commit created by histedit"""
2118 replacements = adjustreplacementsfrommarkers(state.repo, state.replacements)
2117 replacements = adjustreplacementsfrommarkers(state.repo, state.replacements)
2119 allsuccs = set()
2118 allsuccs = set()
2120 replaced = set()
2119 replaced = set()
2121 fullmapping = {}
2120 fullmapping = {}
2122 # initialize basic set
2121 # initialize basic set
2123 # fullmapping records all operations recorded in replacement
2122 # fullmapping records all operations recorded in replacement
2124 for rep in replacements:
2123 for rep in replacements:
2125 allsuccs.update(rep[1])
2124 allsuccs.update(rep[1])
2126 replaced.add(rep[0])
2125 replaced.add(rep[0])
2127 fullmapping.setdefault(rep[0], set()).update(rep[1])
2126 fullmapping.setdefault(rep[0], set()).update(rep[1])
2128 new = allsuccs - replaced
2127 new = allsuccs - replaced
2129 tmpnodes = allsuccs & replaced
2128 tmpnodes = allsuccs & replaced
2130 # Reduce content fullmapping into direct relation between original nodes
2129 # Reduce content fullmapping into direct relation between original nodes
2131 # and final node created during history edition
2130 # and final node created during history edition
2132 # Dropped changeset are replaced by an empty list
2131 # Dropped changeset are replaced by an empty list
2133 toproceed = set(fullmapping)
2132 toproceed = set(fullmapping)
2134 final = {}
2133 final = {}
2135 while toproceed:
2134 while toproceed:
2136 for x in list(toproceed):
2135 for x in list(toproceed):
2137 succs = fullmapping[x]
2136 succs = fullmapping[x]
2138 for s in list(succs):
2137 for s in list(succs):
2139 if s in toproceed:
2138 if s in toproceed:
2140 # non final node with unknown closure
2139 # non final node with unknown closure
2141 # We can't process this now
2140 # We can't process this now
2142 break
2141 break
2143 elif s in final:
2142 elif s in final:
2144 # non final node, replace with closure
2143 # non final node, replace with closure
2145 succs.remove(s)
2144 succs.remove(s)
2146 succs.update(final[s])
2145 succs.update(final[s])
2147 else:
2146 else:
2148 final[x] = succs
2147 final[x] = succs
2149 toproceed.remove(x)
2148 toproceed.remove(x)
2150 # remove tmpnodes from final mapping
2149 # remove tmpnodes from final mapping
2151 for n in tmpnodes:
2150 for n in tmpnodes:
2152 del final[n]
2151 del final[n]
2153 # we expect all changes involved in final to exist in the repo
2152 # we expect all changes involved in final to exist in the repo
2154 # turn `final` into list (topologically sorted)
2153 # turn `final` into list (topologically sorted)
2155 nm = state.repo.changelog.nodemap
2154 nm = state.repo.changelog.nodemap
2156 for prec, succs in final.items():
2155 for prec, succs in final.items():
2157 final[prec] = sorted(succs, key=nm.get)
2156 final[prec] = sorted(succs, key=nm.get)
2158
2157
2159 # computed topmost element (necessary for bookmark)
2158 # computed topmost element (necessary for bookmark)
2160 if new:
2159 if new:
2161 newtopmost = sorted(new, key=state.repo.changelog.rev)[-1]
2160 newtopmost = sorted(new, key=state.repo.changelog.rev)[-1]
2162 elif not final:
2161 elif not final:
2163 # Nothing rewritten at all. we won't need `newtopmost`
2162 # Nothing rewritten at all. we won't need `newtopmost`
2164 # It is the same as `oldtopmost` and `processreplacement` know it
2163 # It is the same as `oldtopmost` and `processreplacement` know it
2165 newtopmost = None
2164 newtopmost = None
2166 else:
2165 else:
2167 # every body died. The newtopmost is the parent of the root.
2166 # every body died. The newtopmost is the parent of the root.
2168 r = state.repo.changelog.rev
2167 r = state.repo.changelog.rev
2169 newtopmost = state.repo[sorted(final, key=r)[0]].p1().node()
2168 newtopmost = state.repo[sorted(final, key=r)[0]].p1().node()
2170
2169
2171 return final, tmpnodes, new, newtopmost
2170 return final, tmpnodes, new, newtopmost
2172
2171
2173 def movetopmostbookmarks(repo, oldtopmost, newtopmost):
2172 def movetopmostbookmarks(repo, oldtopmost, newtopmost):
2174 """Move bookmark from oldtopmost to newly created topmost
2173 """Move bookmark from oldtopmost to newly created topmost
2175
2174
2176 This is arguably a feature and we may only want that for the active
2175 This is arguably a feature and we may only want that for the active
2177 bookmark. But the behavior is kept compatible with the old version for now.
2176 bookmark. But the behavior is kept compatible with the old version for now.
2178 """
2177 """
2179 if not oldtopmost or not newtopmost:
2178 if not oldtopmost or not newtopmost:
2180 return
2179 return
2181 oldbmarks = repo.nodebookmarks(oldtopmost)
2180 oldbmarks = repo.nodebookmarks(oldtopmost)
2182 if oldbmarks:
2181 if oldbmarks:
2183 with repo.lock(), repo.transaction('histedit') as tr:
2182 with repo.lock(), repo.transaction('histedit') as tr:
2184 marks = repo._bookmarks
2183 marks = repo._bookmarks
2185 changes = []
2184 changes = []
2186 for name in oldbmarks:
2185 for name in oldbmarks:
2187 changes.append((name, newtopmost))
2186 changes.append((name, newtopmost))
2188 marks.applychanges(repo, tr, changes)
2187 marks.applychanges(repo, tr, changes)
2189
2188
2190 def cleanupnode(ui, repo, nodes, nobackup=False):
2189 def cleanupnode(ui, repo, nodes, nobackup=False):
2191 """strip a group of nodes from the repository
2190 """strip a group of nodes from the repository
2192
2191
2193 The set of node to strip may contains unknown nodes."""
2192 The set of node to strip may contains unknown nodes."""
2194 with repo.lock():
2193 with repo.lock():
2195 # do not let filtering get in the way of the cleanse
2194 # do not let filtering get in the way of the cleanse
2196 # we should probably get rid of obsolescence marker created during the
2195 # we should probably get rid of obsolescence marker created during the
2197 # histedit, but we currently do not have such information.
2196 # histedit, but we currently do not have such information.
2198 repo = repo.unfiltered()
2197 repo = repo.unfiltered()
2199 # Find all nodes that need to be stripped
2198 # Find all nodes that need to be stripped
2200 # (we use %lr instead of %ln to silently ignore unknown items)
2199 # (we use %lr instead of %ln to silently ignore unknown items)
2201 nm = repo.changelog.nodemap
2200 nm = repo.changelog.nodemap
2202 nodes = sorted(n for n in nodes if n in nm)
2201 nodes = sorted(n for n in nodes if n in nm)
2203 roots = [c.node() for c in repo.set("roots(%ln)", nodes)]
2202 roots = [c.node() for c in repo.set("roots(%ln)", nodes)]
2204 if roots:
2203 if roots:
2205 backup = not nobackup
2204 backup = not nobackup
2206 repair.strip(ui, repo, roots, backup=backup)
2205 repair.strip(ui, repo, roots, backup=backup)
2207
2206
2208 def stripwrapper(orig, ui, repo, nodelist, *args, **kwargs):
2207 def stripwrapper(orig, ui, repo, nodelist, *args, **kwargs):
2209 if isinstance(nodelist, str):
2208 if isinstance(nodelist, str):
2210 nodelist = [nodelist]
2209 nodelist = [nodelist]
2211 state = histeditstate(repo)
2210 state = histeditstate(repo)
2212 if state.inprogress():
2211 if state.inprogress():
2213 state.read()
2212 state.read()
2214 histedit_nodes = {action.node for action
2213 histedit_nodes = {action.node for action
2215 in state.actions if action.node}
2214 in state.actions if action.node}
2216 common_nodes = histedit_nodes & set(nodelist)
2215 common_nodes = histedit_nodes & set(nodelist)
2217 if common_nodes:
2216 if common_nodes:
2218 raise error.Abort(_("histedit in progress, can't strip %s")
2217 raise error.Abort(_("histedit in progress, can't strip %s")
2219 % ', '.join(node.short(x) for x in common_nodes))
2218 % ', '.join(node.short(x) for x in common_nodes))
2220 return orig(ui, repo, nodelist, *args, **kwargs)
2219 return orig(ui, repo, nodelist, *args, **kwargs)
2221
2220
2222 extensions.wrapfunction(repair, 'strip', stripwrapper)
2221 extensions.wrapfunction(repair, 'strip', stripwrapper)
2223
2222
2224 def summaryhook(ui, repo):
2223 def summaryhook(ui, repo):
2225 state = histeditstate(repo)
2224 state = histeditstate(repo)
2226 if not state.inprogress():
2225 if not state.inprogress():
2227 return
2226 return
2228 state.read()
2227 state.read()
2229 if state.actions:
2228 if state.actions:
2230 # i18n: column positioning for "hg summary"
2229 # i18n: column positioning for "hg summary"
2231 ui.write(_('hist: %s (histedit --continue)\n') %
2230 ui.write(_('hist: %s (histedit --continue)\n') %
2232 (ui.label(_('%d remaining'), 'histedit.remaining') %
2231 (ui.label(_('%d remaining'), 'histedit.remaining') %
2233 len(state.actions)))
2232 len(state.actions)))
2234
2233
2235 def extsetup(ui):
2234 def extsetup(ui):
2236 cmdutil.summaryhooks.add('histedit', summaryhook)
2235 cmdutil.summaryhooks.add('histedit', summaryhook)
2237 cmdutil.unfinishedstates.append(
2236 cmdutil.unfinishedstates.append(
2238 ['histedit-state', False, True, _('histedit in progress'),
2237 ['histedit-state', False, True, _('histedit in progress'),
2239 _("use 'hg histedit --continue' or 'hg histedit --abort'")])
2238 _("use 'hg histedit --continue' or 'hg histedit --abort'")])
2240 cmdutil.afterresolvedstates.append(
2239 cmdutil.afterresolvedstates.append(
2241 ['histedit-state', _('hg histedit --continue')])
2240 ['histedit-state', _('hg histedit --continue')])
@@ -1,2763 +1,2766 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 ``resolve.confirm``
441 ``resolve.confirm``
442 Confirm before performing action if no filename is passed.
442 Confirm before performing action if no filename is passed.
443 (default: False)
443 (default: False)
444
444
445 ``resolve.explicit-re-merge``
445 ``resolve.explicit-re-merge``
446 Require uses of ``hg resolve`` to specify which action it should perform,
446 Require uses of ``hg resolve`` to specify which action it should perform,
447 instead of re-merging files by default.
447 instead of re-merging files by default.
448 (default: False)
448 (default: False)
449
449
450 ``resolve.mark-check``
450 ``resolve.mark-check``
451 Determines what level of checking :hg:`resolve --mark` will perform before
451 Determines what level of checking :hg:`resolve --mark` will perform before
452 marking files as resolved. Valid values are ``none`, ``warn``, and
452 marking files as resolved. Valid values are ``none`, ``warn``, and
453 ``abort``. ``warn`` will output a warning listing the file(s) that still
453 ``abort``. ``warn`` will output a warning listing the file(s) that still
454 have conflict markers in them, but will still mark everything resolved.
454 have conflict markers in them, but will still mark everything resolved.
455 ``abort`` will output the same warning but will not mark things as resolved.
455 ``abort`` will output the same warning but will not mark things as resolved.
456 If --all is passed and this is set to ``abort``, only a warning will be
456 If --all is passed and this is set to ``abort``, only a warning will be
457 shown (an error will not be raised).
457 shown (an error will not be raised).
458 (default: ``none``)
458 (default: ``none``)
459
459
460 ``status.relative``
460 ``status.relative``
461 Make paths in :hg:`status` output relative to the current directory.
461 Make paths in :hg:`status` output relative to the current directory.
462 (default: False)
462 (default: False)
463
463
464 ``status.terse``
464 ``status.terse``
465 Default value for the --terse flag, which condenses status output.
465 Default value for the --terse flag, which condenses status output.
466 (default: empty)
466 (default: empty)
467
467
468 ``update.check``
468 ``update.check``
469 Determines what level of checking :hg:`update` will perform before moving
469 Determines what level of checking :hg:`update` will perform before moving
470 to a destination revision. Valid values are ``abort``, ``none``,
470 to a destination revision. Valid values are ``abort``, ``none``,
471 ``linear``, and ``noconflict``. ``abort`` always fails if the working
471 ``linear``, and ``noconflict``. ``abort`` always fails if the working
472 directory has uncommitted changes. ``none`` performs no checking, and may
472 directory has uncommitted changes. ``none`` performs no checking, and may
473 result in a merge with uncommitted changes. ``linear`` allows any update
473 result in a merge with uncommitted changes. ``linear`` allows any update
474 as long as it follows a straight line in the revision history, and may
474 as long as it follows a straight line in the revision history, and may
475 trigger a merge with uncommitted changes. ``noconflict`` will allow any
475 trigger a merge with uncommitted changes. ``noconflict`` will allow any
476 update which would not trigger a merge with uncommitted changes, if any
476 update which would not trigger a merge with uncommitted changes, if any
477 are present.
477 are present.
478 (default: ``linear``)
478 (default: ``linear``)
479
479
480 ``update.requiredest``
480 ``update.requiredest``
481 Require that the user pass a destination when running :hg:`update`.
481 Require that the user pass a destination when running :hg:`update`.
482 For example, :hg:`update .::` will be allowed, but a plain :hg:`update`
482 For example, :hg:`update .::` will be allowed, but a plain :hg:`update`
483 will be disallowed.
483 will be disallowed.
484 (default: False)
484 (default: False)
485
485
486 ``committemplate``
486 ``committemplate``
487 ------------------
487 ------------------
488
488
489 ``changeset``
489 ``changeset``
490 String: configuration in this section is used as the template to
490 String: configuration in this section is used as the template to
491 customize the text shown in the editor when committing.
491 customize the text shown in the editor when committing.
492
492
493 In addition to pre-defined template keywords, commit log specific one
493 In addition to pre-defined template keywords, commit log specific one
494 below can be used for customization:
494 below can be used for customization:
495
495
496 ``extramsg``
496 ``extramsg``
497 String: Extra message (typically 'Leave message empty to abort
497 String: Extra message (typically 'Leave message empty to abort
498 commit.'). This may be changed by some commands or extensions.
498 commit.'). This may be changed by some commands or extensions.
499
499
500 For example, the template configuration below shows as same text as
500 For example, the template configuration below shows as same text as
501 one shown by default::
501 one shown by default::
502
502
503 [committemplate]
503 [committemplate]
504 changeset = {desc}\n\n
504 changeset = {desc}\n\n
505 HG: Enter commit message. Lines beginning with 'HG:' are removed.
505 HG: Enter commit message. Lines beginning with 'HG:' are removed.
506 HG: {extramsg}
506 HG: {extramsg}
507 HG: --
507 HG: --
508 HG: user: {author}\n{ifeq(p2rev, "-1", "",
508 HG: user: {author}\n{ifeq(p2rev, "-1", "",
509 "HG: branch merge\n")
509 "HG: branch merge\n")
510 }HG: branch '{branch}'\n{if(activebookmark,
510 }HG: branch '{branch}'\n{if(activebookmark,
511 "HG: bookmark '{activebookmark}'\n") }{subrepos %
511 "HG: bookmark '{activebookmark}'\n") }{subrepos %
512 "HG: subrepo {subrepo}\n" }{file_adds %
512 "HG: subrepo {subrepo}\n" }{file_adds %
513 "HG: added {file}\n" }{file_mods %
513 "HG: added {file}\n" }{file_mods %
514 "HG: changed {file}\n" }{file_dels %
514 "HG: changed {file}\n" }{file_dels %
515 "HG: removed {file}\n" }{if(files, "",
515 "HG: removed {file}\n" }{if(files, "",
516 "HG: no files changed\n")}
516 "HG: no files changed\n")}
517
517
518 ``diff()``
518 ``diff()``
519 String: show the diff (see :hg:`help templates` for detail)
519 String: show the diff (see :hg:`help templates` for detail)
520
520
521 Sometimes it is helpful to show the diff of the changeset in the editor without
521 Sometimes it is helpful to show the diff of the changeset in the editor without
522 having to prefix 'HG: ' to each line so that highlighting works correctly. For
522 having to prefix 'HG: ' to each line so that highlighting works correctly. For
523 this, Mercurial provides a special string which will ignore everything below
523 this, Mercurial provides a special string which will ignore everything below
524 it::
524 it::
525
525
526 HG: ------------------------ >8 ------------------------
526 HG: ------------------------ >8 ------------------------
527
527
528 For example, the template configuration below will show the diff below the
528 For example, the template configuration below will show the diff below the
529 extra message::
529 extra message::
530
530
531 [committemplate]
531 [committemplate]
532 changeset = {desc}\n\n
532 changeset = {desc}\n\n
533 HG: Enter commit message. Lines beginning with 'HG:' are removed.
533 HG: Enter commit message. Lines beginning with 'HG:' are removed.
534 HG: {extramsg}
534 HG: {extramsg}
535 HG: ------------------------ >8 ------------------------
535 HG: ------------------------ >8 ------------------------
536 HG: Do not touch the line above.
536 HG: Do not touch the line above.
537 HG: Everything below will be removed.
537 HG: Everything below will be removed.
538 {diff()}
538 {diff()}
539
539
540 .. note::
540 .. note::
541
541
542 For some problematic encodings (see :hg:`help win32mbcs` for
542 For some problematic encodings (see :hg:`help win32mbcs` for
543 detail), this customization should be configured carefully, to
543 detail), this customization should be configured carefully, to
544 avoid showing broken characters.
544 avoid showing broken characters.
545
545
546 For example, if a multibyte character ending with backslash (0x5c) is
546 For example, if a multibyte character ending with backslash (0x5c) is
547 followed by the ASCII character 'n' in the customized template,
547 followed by the ASCII character 'n' in the customized template,
548 the sequence of backslash and 'n' is treated as line-feed unexpectedly
548 the sequence of backslash and 'n' is treated as line-feed unexpectedly
549 (and the multibyte character is broken, too).
549 (and the multibyte character is broken, too).
550
550
551 Customized template is used for commands below (``--edit`` may be
551 Customized template is used for commands below (``--edit`` may be
552 required):
552 required):
553
553
554 - :hg:`backout`
554 - :hg:`backout`
555 - :hg:`commit`
555 - :hg:`commit`
556 - :hg:`fetch` (for merge commit only)
556 - :hg:`fetch` (for merge commit only)
557 - :hg:`graft`
557 - :hg:`graft`
558 - :hg:`histedit`
558 - :hg:`histedit`
559 - :hg:`import`
559 - :hg:`import`
560 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
560 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
561 - :hg:`rebase`
561 - :hg:`rebase`
562 - :hg:`shelve`
562 - :hg:`shelve`
563 - :hg:`sign`
563 - :hg:`sign`
564 - :hg:`tag`
564 - :hg:`tag`
565 - :hg:`transplant`
565 - :hg:`transplant`
566
566
567 Configuring items below instead of ``changeset`` allows showing
567 Configuring items below instead of ``changeset`` allows showing
568 customized message only for specific actions, or showing different
568 customized message only for specific actions, or showing different
569 messages for each action.
569 messages for each action.
570
570
571 - ``changeset.backout`` for :hg:`backout`
571 - ``changeset.backout`` for :hg:`backout`
572 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
572 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
573 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
573 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
574 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
574 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
575 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
575 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
576 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
576 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
577 - ``changeset.gpg.sign`` for :hg:`sign`
577 - ``changeset.gpg.sign`` for :hg:`sign`
578 - ``changeset.graft`` for :hg:`graft`
578 - ``changeset.graft`` for :hg:`graft`
579 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
579 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
580 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
580 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
581 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
581 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
582 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
582 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
583 - ``changeset.import.bypass`` for :hg:`import --bypass`
583 - ``changeset.import.bypass`` for :hg:`import --bypass`
584 - ``changeset.import.normal.merge`` for :hg:`import` on merges
584 - ``changeset.import.normal.merge`` for :hg:`import` on merges
585 - ``changeset.import.normal.normal`` for :hg:`import` on other
585 - ``changeset.import.normal.normal`` for :hg:`import` on other
586 - ``changeset.mq.qnew`` for :hg:`qnew`
586 - ``changeset.mq.qnew`` for :hg:`qnew`
587 - ``changeset.mq.qfold`` for :hg:`qfold`
587 - ``changeset.mq.qfold`` for :hg:`qfold`
588 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
588 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
589 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
589 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
590 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
590 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
591 - ``changeset.rebase.normal`` for :hg:`rebase` on other
591 - ``changeset.rebase.normal`` for :hg:`rebase` on other
592 - ``changeset.shelve.shelve`` for :hg:`shelve`
592 - ``changeset.shelve.shelve`` for :hg:`shelve`
593 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
593 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
594 - ``changeset.tag.remove`` for :hg:`tag --remove`
594 - ``changeset.tag.remove`` for :hg:`tag --remove`
595 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
595 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
596 - ``changeset.transplant.normal`` for :hg:`transplant` on other
596 - ``changeset.transplant.normal`` for :hg:`transplant` on other
597
597
598 These dot-separated lists of names are treated as hierarchical ones.
598 These dot-separated lists of names are treated as hierarchical ones.
599 For example, ``changeset.tag.remove`` customizes the commit message
599 For example, ``changeset.tag.remove`` customizes the commit message
600 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
600 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
601 commit message for :hg:`tag` regardless of ``--remove`` option.
601 commit message for :hg:`tag` regardless of ``--remove`` option.
602
602
603 When the external editor is invoked for a commit, the corresponding
603 When the external editor is invoked for a commit, the corresponding
604 dot-separated list of names without the ``changeset.`` prefix
604 dot-separated list of names without the ``changeset.`` prefix
605 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
605 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
606 variable.
606 variable.
607
607
608 In this section, items other than ``changeset`` can be referred from
608 In this section, items other than ``changeset`` can be referred from
609 others. For example, the configuration to list committed files up
609 others. For example, the configuration to list committed files up
610 below can be referred as ``{listupfiles}``::
610 below can be referred as ``{listupfiles}``::
611
611
612 [committemplate]
612 [committemplate]
613 listupfiles = {file_adds %
613 listupfiles = {file_adds %
614 "HG: added {file}\n" }{file_mods %
614 "HG: added {file}\n" }{file_mods %
615 "HG: changed {file}\n" }{file_dels %
615 "HG: changed {file}\n" }{file_dels %
616 "HG: removed {file}\n" }{if(files, "",
616 "HG: removed {file}\n" }{if(files, "",
617 "HG: no files changed\n")}
617 "HG: no files changed\n")}
618
618
619 ``decode/encode``
619 ``decode/encode``
620 -----------------
620 -----------------
621
621
622 Filters for transforming files on checkout/checkin. This would
622 Filters for transforming files on checkout/checkin. This would
623 typically be used for newline processing or other
623 typically be used for newline processing or other
624 localization/canonicalization of files.
624 localization/canonicalization of files.
625
625
626 Filters consist of a filter pattern followed by a filter command.
626 Filters consist of a filter pattern followed by a filter command.
627 Filter patterns are globs by default, rooted at the repository root.
627 Filter patterns are globs by default, rooted at the repository root.
628 For example, to match any file ending in ``.txt`` in the root
628 For example, to match any file ending in ``.txt`` in the root
629 directory only, use the pattern ``*.txt``. To match any file ending
629 directory only, use the pattern ``*.txt``. To match any file ending
630 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
630 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
631 For each file only the first matching filter applies.
631 For each file only the first matching filter applies.
632
632
633 The filter command can start with a specifier, either ``pipe:`` or
633 The filter command can start with a specifier, either ``pipe:`` or
634 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
634 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
635
635
636 A ``pipe:`` command must accept data on stdin and return the transformed
636 A ``pipe:`` command must accept data on stdin and return the transformed
637 data on stdout.
637 data on stdout.
638
638
639 Pipe example::
639 Pipe example::
640
640
641 [encode]
641 [encode]
642 # uncompress gzip files on checkin to improve delta compression
642 # uncompress gzip files on checkin to improve delta compression
643 # note: not necessarily a good idea, just an example
643 # note: not necessarily a good idea, just an example
644 *.gz = pipe: gunzip
644 *.gz = pipe: gunzip
645
645
646 [decode]
646 [decode]
647 # recompress gzip files when writing them to the working dir (we
647 # recompress gzip files when writing them to the working dir (we
648 # can safely omit "pipe:", because it's the default)
648 # can safely omit "pipe:", because it's the default)
649 *.gz = gzip
649 *.gz = gzip
650
650
651 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
651 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
652 with the name of a temporary file that contains the data to be
652 with the name of a temporary file that contains the data to be
653 filtered by the command. The string ``OUTFILE`` is replaced with the name
653 filtered by the command. The string ``OUTFILE`` is replaced with the name
654 of an empty temporary file, where the filtered data must be written by
654 of an empty temporary file, where the filtered data must be written by
655 the command.
655 the command.
656
656
657 .. container:: windows
657 .. container:: windows
658
658
659 .. note::
659 .. note::
660
660
661 The tempfile mechanism is recommended for Windows systems,
661 The tempfile mechanism is recommended for Windows systems,
662 where the standard shell I/O redirection operators often have
662 where the standard shell I/O redirection operators often have
663 strange effects and may corrupt the contents of your files.
663 strange effects and may corrupt the contents of your files.
664
664
665 This filter mechanism is used internally by the ``eol`` extension to
665 This filter mechanism is used internally by the ``eol`` extension to
666 translate line ending characters between Windows (CRLF) and Unix (LF)
666 translate line ending characters between Windows (CRLF) and Unix (LF)
667 format. We suggest you use the ``eol`` extension for convenience.
667 format. We suggest you use the ``eol`` extension for convenience.
668
668
669
669
670 ``defaults``
670 ``defaults``
671 ------------
671 ------------
672
672
673 (defaults are deprecated. Don't use them. Use aliases instead.)
673 (defaults are deprecated. Don't use them. Use aliases instead.)
674
674
675 Use the ``[defaults]`` section to define command defaults, i.e. the
675 Use the ``[defaults]`` section to define command defaults, i.e. the
676 default options/arguments to pass to the specified commands.
676 default options/arguments to pass to the specified commands.
677
677
678 The following example makes :hg:`log` run in verbose mode, and
678 The following example makes :hg:`log` run in verbose mode, and
679 :hg:`status` show only the modified files, by default::
679 :hg:`status` show only the modified files, by default::
680
680
681 [defaults]
681 [defaults]
682 log = -v
682 log = -v
683 status = -m
683 status = -m
684
684
685 The actual commands, instead of their aliases, must be used when
685 The actual commands, instead of their aliases, must be used when
686 defining command defaults. The command defaults will also be applied
686 defining command defaults. The command defaults will also be applied
687 to the aliases of the commands defined.
687 to the aliases of the commands defined.
688
688
689
689
690 ``diff``
690 ``diff``
691 --------
691 --------
692
692
693 Settings used when displaying diffs. Everything except for ``unified``
693 Settings used when displaying diffs. Everything except for ``unified``
694 is a Boolean and defaults to False. See :hg:`help config.annotate`
694 is a Boolean and defaults to False. See :hg:`help config.annotate`
695 for related options for the annotate command.
695 for related options for the annotate command.
696
696
697 ``git``
697 ``git``
698 Use git extended diff format.
698 Use git extended diff format.
699
699
700 ``nobinary``
700 ``nobinary``
701 Omit git binary patches.
701 Omit git binary patches.
702
702
703 ``nodates``
703 ``nodates``
704 Don't include dates in diff headers.
704 Don't include dates in diff headers.
705
705
706 ``noprefix``
706 ``noprefix``
707 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
707 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
708
708
709 ``showfunc``
709 ``showfunc``
710 Show which function each change is in.
710 Show which function each change is in.
711
711
712 ``ignorews``
712 ``ignorews``
713 Ignore white space when comparing lines.
713 Ignore white space when comparing lines.
714
714
715 ``ignorewsamount``
715 ``ignorewsamount``
716 Ignore changes in the amount of white space.
716 Ignore changes in the amount of white space.
717
717
718 ``ignoreblanklines``
718 ``ignoreblanklines``
719 Ignore changes whose lines are all blank.
719 Ignore changes whose lines are all blank.
720
720
721 ``unified``
721 ``unified``
722 Number of lines of context to show.
722 Number of lines of context to show.
723
723
724 ``word-diff``
724 ``word-diff``
725 Highlight changed words.
725 Highlight changed words.
726
726
727 ``email``
727 ``email``
728 ---------
728 ---------
729
729
730 Settings for extensions that send email messages.
730 Settings for extensions that send email messages.
731
731
732 ``from``
732 ``from``
733 Optional. Email address to use in "From" header and SMTP envelope
733 Optional. Email address to use in "From" header and SMTP envelope
734 of outgoing messages.
734 of outgoing messages.
735
735
736 ``to``
736 ``to``
737 Optional. Comma-separated list of recipients' email addresses.
737 Optional. Comma-separated list of recipients' email addresses.
738
738
739 ``cc``
739 ``cc``
740 Optional. Comma-separated list of carbon copy recipients'
740 Optional. Comma-separated list of carbon copy recipients'
741 email addresses.
741 email addresses.
742
742
743 ``bcc``
743 ``bcc``
744 Optional. Comma-separated list of blind carbon copy recipients'
744 Optional. Comma-separated list of blind carbon copy recipients'
745 email addresses.
745 email addresses.
746
746
747 ``method``
747 ``method``
748 Optional. Method to use to send email messages. If value is ``smtp``
748 Optional. Method to use to send email messages. If value is ``smtp``
749 (default), use SMTP (see the ``[smtp]`` section for configuration).
749 (default), use SMTP (see the ``[smtp]`` section for configuration).
750 Otherwise, use as name of program to run that acts like sendmail
750 Otherwise, use as name of program to run that acts like sendmail
751 (takes ``-f`` option for sender, list of recipients on command line,
751 (takes ``-f`` option for sender, list of recipients on command line,
752 message on stdin). Normally, setting this to ``sendmail`` or
752 message on stdin). Normally, setting this to ``sendmail`` or
753 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
753 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
754
754
755 ``charsets``
755 ``charsets``
756 Optional. Comma-separated list of character sets considered
756 Optional. Comma-separated list of character sets considered
757 convenient for recipients. Addresses, headers, and parts not
757 convenient for recipients. Addresses, headers, and parts not
758 containing patches of outgoing messages will be encoded in the
758 containing patches of outgoing messages will be encoded in the
759 first character set to which conversion from local encoding
759 first character set to which conversion from local encoding
760 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
760 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
761 conversion fails, the text in question is sent as is.
761 conversion fails, the text in question is sent as is.
762 (default: '')
762 (default: '')
763
763
764 Order of outgoing email character sets:
764 Order of outgoing email character sets:
765
765
766 1. ``us-ascii``: always first, regardless of settings
766 1. ``us-ascii``: always first, regardless of settings
767 2. ``email.charsets``: in order given by user
767 2. ``email.charsets``: in order given by user
768 3. ``ui.fallbackencoding``: if not in email.charsets
768 3. ``ui.fallbackencoding``: if not in email.charsets
769 4. ``$HGENCODING``: if not in email.charsets
769 4. ``$HGENCODING``: if not in email.charsets
770 5. ``utf-8``: always last, regardless of settings
770 5. ``utf-8``: always last, regardless of settings
771
771
772 Email example::
772 Email example::
773
773
774 [email]
774 [email]
775 from = Joseph User <joe.user@example.com>
775 from = Joseph User <joe.user@example.com>
776 method = /usr/sbin/sendmail
776 method = /usr/sbin/sendmail
777 # charsets for western Europeans
777 # charsets for western Europeans
778 # us-ascii, utf-8 omitted, as they are tried first and last
778 # us-ascii, utf-8 omitted, as they are tried first and last
779 charsets = iso-8859-1, iso-8859-15, windows-1252
779 charsets = iso-8859-1, iso-8859-15, windows-1252
780
780
781
781
782 ``extensions``
782 ``extensions``
783 --------------
783 --------------
784
784
785 Mercurial has an extension mechanism for adding new features. To
785 Mercurial has an extension mechanism for adding new features. To
786 enable an extension, create an entry for it in this section.
786 enable an extension, create an entry for it in this section.
787
787
788 If you know that the extension is already in Python's search path,
788 If you know that the extension is already in Python's search path,
789 you can give the name of the module, followed by ``=``, with nothing
789 you can give the name of the module, followed by ``=``, with nothing
790 after the ``=``.
790 after the ``=``.
791
791
792 Otherwise, give a name that you choose, followed by ``=``, followed by
792 Otherwise, give a name that you choose, followed by ``=``, followed by
793 the path to the ``.py`` file (including the file name extension) that
793 the path to the ``.py`` file (including the file name extension) that
794 defines the extension.
794 defines the extension.
795
795
796 To explicitly disable an extension that is enabled in an hgrc of
796 To explicitly disable an extension that is enabled in an hgrc of
797 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
797 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
798 or ``foo = !`` when path is not supplied.
798 or ``foo = !`` when path is not supplied.
799
799
800 Example for ``~/.hgrc``::
800 Example for ``~/.hgrc``::
801
801
802 [extensions]
802 [extensions]
803 # (the churn extension will get loaded from Mercurial's path)
803 # (the churn extension will get loaded from Mercurial's path)
804 churn =
804 churn =
805 # (this extension will get loaded from the file specified)
805 # (this extension will get loaded from the file specified)
806 myfeature = ~/.hgext/myfeature.py
806 myfeature = ~/.hgext/myfeature.py
807
807
808
808
809 ``format``
809 ``format``
810 ----------
810 ----------
811
811
812 Configuration that controls the repository format. Newer format options are more
812 Configuration that controls the repository format. Newer format options are more
813 powerful but incompatible with some older versions of Mercurial. Format options
813 powerful but incompatible with some older versions of Mercurial. Format options
814 are considered at repository initialization only. You need to make a new clone
814 are considered at repository initialization only. You need to make a new clone
815 for config change to be taken into account.
815 for config change to be taken into account.
816
816
817 For more details about repository format and version compatibility, see
817 For more details about repository format and version compatibility, see
818 https://www.mercurial-scm.org/wiki/MissingRequirement
818 https://www.mercurial-scm.org/wiki/MissingRequirement
819
819
820 ``usegeneraldelta``
820 ``usegeneraldelta``
821 Enable or disable the "generaldelta" repository format which improves
821 Enable or disable the "generaldelta" repository format which improves
822 repository compression by allowing "revlog" to store delta against arbitrary
822 repository compression by allowing "revlog" to store delta against arbitrary
823 revision instead of the previous stored one. This provides significant
823 revision instead of the previous stored one. This provides significant
824 improvement for repositories with branches.
824 improvement for repositories with branches.
825
825
826 Repositories with this on-disk format require Mercurial version 1.9.
826 Repositories with this on-disk format require Mercurial version 1.9.
827
827
828 Enabled by default.
828 Enabled by default.
829
829
830 ``dotencode``
830 ``dotencode``
831 Enable or disable the "dotencode" repository format which enhances
831 Enable or disable the "dotencode" repository format which enhances
832 the "fncache" repository format (which has to be enabled to use
832 the "fncache" repository format (which has to be enabled to use
833 dotencode) to avoid issues with filenames starting with ._ on
833 dotencode) to avoid issues with filenames starting with ._ on
834 Mac OS X and spaces on Windows.
834 Mac OS X and spaces on Windows.
835
835
836 Repositories with this on-disk format require Mercurial version 1.7.
836 Repositories with this on-disk format require Mercurial version 1.7.
837
837
838 Enabled by default.
838 Enabled by default.
839
839
840 ``usefncache``
840 ``usefncache``
841 Enable or disable the "fncache" repository format which enhances
841 Enable or disable the "fncache" repository format which enhances
842 the "store" repository format (which has to be enabled to use
842 the "store" repository format (which has to be enabled to use
843 fncache) to allow longer filenames and avoids using Windows
843 fncache) to allow longer filenames and avoids using Windows
844 reserved names, e.g. "nul".
844 reserved names, e.g. "nul".
845
845
846 Repositories with this on-disk format require Mercurial version 1.1.
846 Repositories with this on-disk format require Mercurial version 1.1.
847
847
848 Enabled by default.
848 Enabled by default.
849
849
850 ``usestore``
850 ``usestore``
851 Enable or disable the "store" repository format which improves
851 Enable or disable the "store" repository format which improves
852 compatibility with systems that fold case or otherwise mangle
852 compatibility with systems that fold case or otherwise mangle
853 filenames. Disabling this option will allow you to store longer filenames
853 filenames. Disabling this option will allow you to store longer filenames
854 in some situations at the expense of compatibility.
854 in some situations at the expense of compatibility.
855
855
856 Repositories with this on-disk format require Mercurial version 0.9.4.
856 Repositories with this on-disk format require Mercurial version 0.9.4.
857
857
858 Enabled by default.
858 Enabled by default.
859
859
860 ``graph``
860 ``graph``
861 ---------
861 ---------
862
862
863 Web graph view configuration. This section let you change graph
863 Web graph view configuration. This section let you change graph
864 elements display properties by branches, for instance to make the
864 elements display properties by branches, for instance to make the
865 ``default`` branch stand out.
865 ``default`` branch stand out.
866
866
867 Each line has the following format::
867 Each line has the following format::
868
868
869 <branch>.<argument> = <value>
869 <branch>.<argument> = <value>
870
870
871 where ``<branch>`` is the name of the branch being
871 where ``<branch>`` is the name of the branch being
872 customized. Example::
872 customized. Example::
873
873
874 [graph]
874 [graph]
875 # 2px width
875 # 2px width
876 default.width = 2
876 default.width = 2
877 # red color
877 # red color
878 default.color = FF0000
878 default.color = FF0000
879
879
880 Supported arguments:
880 Supported arguments:
881
881
882 ``width``
882 ``width``
883 Set branch edges width in pixels.
883 Set branch edges width in pixels.
884
884
885 ``color``
885 ``color``
886 Set branch edges color in hexadecimal RGB notation.
886 Set branch edges color in hexadecimal RGB notation.
887
887
888 ``hooks``
888 ``hooks``
889 ---------
889 ---------
890
890
891 Commands or Python functions that get automatically executed by
891 Commands or Python functions that get automatically executed by
892 various actions such as starting or finishing a commit. Multiple
892 various actions such as starting or finishing a commit. Multiple
893 hooks can be run for the same action by appending a suffix to the
893 hooks can be run for the same action by appending a suffix to the
894 action. Overriding a site-wide hook can be done by changing its
894 action. Overriding a site-wide hook can be done by changing its
895 value or setting it to an empty string. Hooks can be prioritized
895 value or setting it to an empty string. Hooks can be prioritized
896 by adding a prefix of ``priority.`` to the hook name on a new line
896 by adding a prefix of ``priority.`` to the hook name on a new line
897 and setting the priority. The default priority is 0.
897 and setting the priority. The default priority is 0.
898
898
899 Example ``.hg/hgrc``::
899 Example ``.hg/hgrc``::
900
900
901 [hooks]
901 [hooks]
902 # update working directory after adding changesets
902 # update working directory after adding changesets
903 changegroup.update = hg update
903 changegroup.update = hg update
904 # do not use the site-wide hook
904 # do not use the site-wide hook
905 incoming =
905 incoming =
906 incoming.email = /my/email/hook
906 incoming.email = /my/email/hook
907 incoming.autobuild = /my/build/hook
907 incoming.autobuild = /my/build/hook
908 # force autobuild hook to run before other incoming hooks
908 # force autobuild hook to run before other incoming hooks
909 priority.incoming.autobuild = 1
909 priority.incoming.autobuild = 1
910
910
911 Most hooks are run with environment variables set that give useful
911 Most hooks are run with environment variables set that give useful
912 additional information. For each hook below, the environment variables
912 additional information. For each hook below, the environment variables
913 it is passed are listed with names in the form ``$HG_foo``. The
913 it is passed are listed with names in the form ``$HG_foo``. The
914 ``$HG_HOOKTYPE`` and ``$HG_HOOKNAME`` variables are set for all hooks.
914 ``$HG_HOOKTYPE`` and ``$HG_HOOKNAME`` variables are set for all hooks.
915 They contain the type of hook which triggered the run and the full name
915 They contain the type of hook which triggered the run and the full name
916 of the hook in the config, respectively. In the example above, this will
916 of the hook in the config, respectively. In the example above, this will
917 be ``$HG_HOOKTYPE=incoming`` and ``$HG_HOOKNAME=incoming.email``.
917 be ``$HG_HOOKTYPE=incoming`` and ``$HG_HOOKNAME=incoming.email``.
918
918
919 .. container:: windows
919 .. container:: windows
920
920
921 Some basic Unix syntax can be enabled for portability, including ``$VAR``
921 Some basic Unix syntax can be enabled for portability, including ``$VAR``
922 and ``${VAR}`` style variables. A ``~`` followed by ``\`` or ``/`` will
922 and ``${VAR}`` style variables. A ``~`` followed by ``\`` or ``/`` will
923 be expanded to ``%USERPROFILE%`` to simulate a subset of tilde expansion
923 be expanded to ``%USERPROFILE%`` to simulate a subset of tilde expansion
924 on Unix. To use a literal ``$`` or ``~``, it must be escaped with a back
924 on Unix. To use a literal ``$`` or ``~``, it must be escaped with a back
925 slash or inside of a strong quote. Strong quotes will be replaced by
925 slash or inside of a strong quote. Strong quotes will be replaced by
926 double quotes after processing.
926 double quotes after processing.
927
927
928 This feature is enabled by adding a prefix of ``tonative.`` to the hook
928 This feature is enabled by adding a prefix of ``tonative.`` to the hook
929 name on a new line, and setting it to ``True``. For example::
929 name on a new line, and setting it to ``True``. For example::
930
930
931 [hooks]
931 [hooks]
932 incoming.autobuild = /my/build/hook
932 incoming.autobuild = /my/build/hook
933 # enable translation to cmd.exe syntax for autobuild hook
933 # enable translation to cmd.exe syntax for autobuild hook
934 tonative.incoming.autobuild = True
934 tonative.incoming.autobuild = True
935
935
936 ``changegroup``
936 ``changegroup``
937 Run after a changegroup has been added via push, pull or unbundle. The ID of
937 Run after a changegroup has been added via push, pull or unbundle. The ID of
938 the first new changeset is in ``$HG_NODE`` and last is in ``$HG_NODE_LAST``.
938 the first new changeset is in ``$HG_NODE`` and last is in ``$HG_NODE_LAST``.
939 The URL from which changes came is in ``$HG_URL``.
939 The URL from which changes came is in ``$HG_URL``.
940
940
941 ``commit``
941 ``commit``
942 Run after a changeset has been created in the local repository. The ID
942 Run after a changeset has been created in the local repository. The ID
943 of the newly created changeset is in ``$HG_NODE``. Parent changeset
943 of the newly created changeset is in ``$HG_NODE``. Parent changeset
944 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
944 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
945
945
946 ``incoming``
946 ``incoming``
947 Run after a changeset has been pulled, pushed, or unbundled into
947 Run after a changeset has been pulled, pushed, or unbundled into
948 the local repository. The ID of the newly arrived changeset is in
948 the local repository. The ID of the newly arrived changeset is in
949 ``$HG_NODE``. The URL that was source of the changes is in ``$HG_URL``.
949 ``$HG_NODE``. The URL that was source of the changes is in ``$HG_URL``.
950
950
951 ``outgoing``
951 ``outgoing``
952 Run after sending changes from the local repository to another. The ID of
952 Run after sending changes from the local repository to another. The ID of
953 first changeset sent is in ``$HG_NODE``. The source of operation is in
953 first changeset sent is in ``$HG_NODE``. The source of operation is in
954 ``$HG_SOURCE``. Also see :hg:`help config.hooks.preoutgoing`.
954 ``$HG_SOURCE``. Also see :hg:`help config.hooks.preoutgoing`.
955
955
956 ``post-<command>``
956 ``post-<command>``
957 Run after successful invocations of the associated command. The
957 Run after successful invocations of the associated command. The
958 contents of the command line are passed as ``$HG_ARGS`` and the result
958 contents of the command line are passed as ``$HG_ARGS`` and the result
959 code in ``$HG_RESULT``. Parsed command line arguments are passed as
959 code in ``$HG_RESULT``. Parsed command line arguments are passed as
960 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
960 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
961 the python data internally passed to <command>. ``$HG_OPTS`` is a
961 the python data internally passed to <command>. ``$HG_OPTS`` is a
962 dictionary of options (with unspecified options set to their defaults).
962 dictionary of options (with unspecified options set to their defaults).
963 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
963 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
964
964
965 ``fail-<command>``
965 ``fail-<command>``
966 Run after a failed invocation of an associated command. The contents
966 Run after a failed invocation of an associated command. The contents
967 of the command line are passed as ``$HG_ARGS``. Parsed command line
967 of the command line are passed as ``$HG_ARGS``. Parsed command line
968 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
968 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
969 string representations of the python data internally passed to
969 string representations of the python data internally passed to
970 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
970 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
971 options set to their defaults). ``$HG_PATS`` is a list of arguments.
971 options set to their defaults). ``$HG_PATS`` is a list of arguments.
972 Hook failure is ignored.
972 Hook failure is ignored.
973
973
974 ``pre-<command>``
974 ``pre-<command>``
975 Run before executing the associated command. The contents of the
975 Run before executing the associated command. The contents of the
976 command line are passed as ``$HG_ARGS``. Parsed command line arguments
976 command line are passed as ``$HG_ARGS``. Parsed command line arguments
977 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
977 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
978 representations of the data internally passed to <command>. ``$HG_OPTS``
978 representations of the data internally passed to <command>. ``$HG_OPTS``
979 is a dictionary of options (with unspecified options set to their
979 is a dictionary of options (with unspecified options set to their
980 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
980 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
981 failure, the command doesn't execute and Mercurial returns the failure
981 failure, the command doesn't execute and Mercurial returns the failure
982 code.
982 code.
983
983
984 ``prechangegroup``
984 ``prechangegroup``
985 Run before a changegroup is added via push, pull or unbundle. Exit
985 Run before a changegroup is added via push, pull or unbundle. Exit
986 status 0 allows the changegroup to proceed. A non-zero status will
986 status 0 allows the changegroup to proceed. A non-zero status will
987 cause the push, pull or unbundle to fail. The URL from which changes
987 cause the push, pull or unbundle to fail. The URL from which changes
988 will come is in ``$HG_URL``.
988 will come is in ``$HG_URL``.
989
989
990 ``precommit``
990 ``precommit``
991 Run before starting a local commit. Exit status 0 allows the
991 Run before starting a local commit. Exit status 0 allows the
992 commit to proceed. A non-zero status will cause the commit to fail.
992 commit to proceed. A non-zero status will cause the commit to fail.
993 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
993 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
994
994
995 ``prelistkeys``
995 ``prelistkeys``
996 Run before listing pushkeys (like bookmarks) in the
996 Run before listing pushkeys (like bookmarks) in the
997 repository. A non-zero status will cause failure. The key namespace is
997 repository. A non-zero status will cause failure. The key namespace is
998 in ``$HG_NAMESPACE``.
998 in ``$HG_NAMESPACE``.
999
999
1000 ``preoutgoing``
1000 ``preoutgoing``
1001 Run before collecting changes to send from the local repository to
1001 Run before collecting changes to send from the local repository to
1002 another. A non-zero status will cause failure. This lets you prevent
1002 another. A non-zero status will cause failure. This lets you prevent
1003 pull over HTTP or SSH. It can also prevent propagating commits (via
1003 pull over HTTP or SSH. It can also prevent propagating commits (via
1004 local pull, push (outbound) or bundle commands), but not completely,
1004 local pull, push (outbound) or bundle commands), but not completely,
1005 since you can just copy files instead. The source of operation is in
1005 since you can just copy files instead. The source of operation is in
1006 ``$HG_SOURCE``. If "serve", the operation is happening on behalf of a remote
1006 ``$HG_SOURCE``. If "serve", the operation is happening on behalf of a remote
1007 SSH or HTTP repository. If "push", "pull" or "bundle", the operation
1007 SSH or HTTP repository. If "push", "pull" or "bundle", the operation
1008 is happening on behalf of a repository on same system.
1008 is happening on behalf of a repository on same system.
1009
1009
1010 ``prepushkey``
1010 ``prepushkey``
1011 Run before a pushkey (like a bookmark) is added to the
1011 Run before a pushkey (like a bookmark) is added to the
1012 repository. A non-zero status will cause the key to be rejected. The
1012 repository. A non-zero status will cause the key to be rejected. The
1013 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
1013 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
1014 the old value (if any) is in ``$HG_OLD``, and the new value is in
1014 the old value (if any) is in ``$HG_OLD``, and the new value is in
1015 ``$HG_NEW``.
1015 ``$HG_NEW``.
1016
1016
1017 ``pretag``
1017 ``pretag``
1018 Run before creating a tag. Exit status 0 allows the tag to be
1018 Run before creating a tag. Exit status 0 allows the tag to be
1019 created. A non-zero status will cause the tag to fail. The ID of the
1019 created. A non-zero status will cause the tag to fail. The ID of the
1020 changeset to tag is in ``$HG_NODE``. The name of tag is in ``$HG_TAG``. The
1020 changeset to tag is in ``$HG_NODE``. The name of tag is in ``$HG_TAG``. The
1021 tag is local if ``$HG_LOCAL=1``, or in the repository if ``$HG_LOCAL=0``.
1021 tag is local if ``$HG_LOCAL=1``, or in the repository if ``$HG_LOCAL=0``.
1022
1022
1023 ``pretxnopen``
1023 ``pretxnopen``
1024 Run before any new repository transaction is open. The reason for the
1024 Run before any new repository transaction is open. The reason for the
1025 transaction will be in ``$HG_TXNNAME``, and a unique identifier for the
1025 transaction will be in ``$HG_TXNNAME``, and a unique identifier for the
1026 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
1026 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
1027 transaction from being opened.
1027 transaction from being opened.
1028
1028
1029 ``pretxnclose``
1029 ``pretxnclose``
1030 Run right before the transaction is actually finalized. Any repository change
1030 Run right before the transaction is actually finalized. Any repository change
1031 will be visible to the hook program. This lets you validate the transaction
1031 will be visible to the hook program. This lets you validate the transaction
1032 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1032 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1033 status will cause the transaction to be rolled back. The reason for the
1033 status will cause the transaction to be rolled back. The reason for the
1034 transaction opening will be in ``$HG_TXNNAME``, and a unique identifier for
1034 transaction opening will be in ``$HG_TXNNAME``, and a unique identifier for
1035 the transaction will be in ``HG_TXNID``. The rest of the available data will
1035 the transaction will be in ``HG_TXNID``. The rest of the available data will
1036 vary according the transaction type. New changesets will add ``$HG_NODE``
1036 vary according the transaction type. New changesets will add ``$HG_NODE``
1037 (the ID of the first added changeset), ``$HG_NODE_LAST`` (the ID of the last
1037 (the ID of the first added changeset), ``$HG_NODE_LAST`` (the ID of the last
1038 added changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables. Bookmark and
1038 added changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables. Bookmark and
1039 phase changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``
1039 phase changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``
1040 respectively, etc.
1040 respectively, etc.
1041
1041
1042 ``pretxnclose-bookmark``
1042 ``pretxnclose-bookmark``
1043 Run right before a bookmark change is actually finalized. Any repository
1043 Run right before a bookmark change is actually finalized. Any repository
1044 change will be visible to the hook program. This lets you validate the
1044 change will be visible to the hook program. This lets you validate the
1045 transaction content or change it. Exit status 0 allows the commit to
1045 transaction content or change it. Exit status 0 allows the commit to
1046 proceed. A non-zero status will cause the transaction to be rolled back.
1046 proceed. A non-zero status will cause the transaction to be rolled back.
1047 The name of the bookmark will be available in ``$HG_BOOKMARK``, the new
1047 The name of the bookmark will be available in ``$HG_BOOKMARK``, the new
1048 bookmark location will be available in ``$HG_NODE`` while the previous
1048 bookmark location will be available in ``$HG_NODE`` while the previous
1049 location will be available in ``$HG_OLDNODE``. In case of a bookmark
1049 location will be available in ``$HG_OLDNODE``. In case of a bookmark
1050 creation ``$HG_OLDNODE`` will be empty. In case of deletion ``$HG_NODE``
1050 creation ``$HG_OLDNODE`` will be empty. In case of deletion ``$HG_NODE``
1051 will be empty.
1051 will be empty.
1052 In addition, the reason for the transaction opening will be in
1052 In addition, the reason for the transaction opening will be in
1053 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1053 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1054 ``HG_TXNID``.
1054 ``HG_TXNID``.
1055
1055
1056 ``pretxnclose-phase``
1056 ``pretxnclose-phase``
1057 Run right before a phase change is actually finalized. Any repository change
1057 Run right before a phase change is actually finalized. Any repository change
1058 will be visible to the hook program. This lets you validate the transaction
1058 will be visible to the hook program. This lets you validate the transaction
1059 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1059 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1060 status will cause the transaction to be rolled back. The hook is called
1060 status will cause the transaction to be rolled back. The hook is called
1061 multiple times, once for each revision affected by a phase change.
1061 multiple times, once for each revision affected by a phase change.
1062 The affected node is available in ``$HG_NODE``, the phase in ``$HG_PHASE``
1062 The affected node is available in ``$HG_NODE``, the phase in ``$HG_PHASE``
1063 while the previous ``$HG_OLDPHASE``. In case of new node, ``$HG_OLDPHASE``
1063 while the previous ``$HG_OLDPHASE``. In case of new node, ``$HG_OLDPHASE``
1064 will be empty. In addition, the reason for the transaction opening will be in
1064 will be empty. In addition, the reason for the transaction opening will be in
1065 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1065 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1066 ``HG_TXNID``. The hook is also run for newly added revisions. In this case
1066 ``HG_TXNID``. The hook is also run for newly added revisions. In this case
1067 the ``$HG_OLDPHASE`` entry will be empty.
1067 the ``$HG_OLDPHASE`` entry will be empty.
1068
1068
1069 ``txnclose``
1069 ``txnclose``
1070 Run after any repository transaction has been committed. At this
1070 Run after any repository transaction has been committed. At this
1071 point, the transaction can no longer be rolled back. The hook will run
1071 point, the transaction can no longer be rolled back. The hook will run
1072 after the lock is released. See :hg:`help config.hooks.pretxnclose` for
1072 after the lock is released. See :hg:`help config.hooks.pretxnclose` for
1073 details about available variables.
1073 details about available variables.
1074
1074
1075 ``txnclose-bookmark``
1075 ``txnclose-bookmark``
1076 Run after any bookmark change has been committed. At this point, the
1076 Run after any bookmark change has been committed. At this point, the
1077 transaction can no longer be rolled back. The hook will run after the lock
1077 transaction can no longer be rolled back. The hook will run after the lock
1078 is released. See :hg:`help config.hooks.pretxnclose-bookmark` for details
1078 is released. See :hg:`help config.hooks.pretxnclose-bookmark` for details
1079 about available variables.
1079 about available variables.
1080
1080
1081 ``txnclose-phase``
1081 ``txnclose-phase``
1082 Run after any phase change has been committed. At this point, the
1082 Run after any phase change has been committed. At this point, the
1083 transaction can no longer be rolled back. The hook will run after the lock
1083 transaction can no longer be rolled back. The hook will run after the lock
1084 is released. See :hg:`help config.hooks.pretxnclose-phase` for details about
1084 is released. See :hg:`help config.hooks.pretxnclose-phase` for details about
1085 available variables.
1085 available variables.
1086
1086
1087 ``txnabort``
1087 ``txnabort``
1088 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
1088 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
1089 for details about available variables.
1089 for details about available variables.
1090
1090
1091 ``pretxnchangegroup``
1091 ``pretxnchangegroup``
1092 Run after a changegroup has been added via push, pull or unbundle, but before
1092 Run after a changegroup has been added via push, pull or unbundle, but before
1093 the transaction has been committed. The changegroup is visible to the hook
1093 the transaction has been committed. The changegroup is visible to the hook
1094 program. This allows validation of incoming changes before accepting them.
1094 program. This allows validation of incoming changes before accepting them.
1095 The ID of the first new changeset is in ``$HG_NODE`` and last is in
1095 The ID of the first new changeset is in ``$HG_NODE`` and last is in
1096 ``$HG_NODE_LAST``. Exit status 0 allows the transaction to commit. A non-zero
1096 ``$HG_NODE_LAST``. Exit status 0 allows the transaction to commit. A non-zero
1097 status will cause the transaction to be rolled back, and the push, pull or
1097 status will cause the transaction to be rolled back, and the push, pull or
1098 unbundle will fail. The URL that was the source of changes is in ``$HG_URL``.
1098 unbundle will fail. The URL that was the source of changes is in ``$HG_URL``.
1099
1099
1100 ``pretxncommit``
1100 ``pretxncommit``
1101 Run after a changeset has been created, but before the transaction is
1101 Run after a changeset has been created, but before the transaction is
1102 committed. The changeset is visible to the hook program. This allows
1102 committed. The changeset is visible to the hook program. This allows
1103 validation of the commit message and changes. Exit status 0 allows the
1103 validation of the commit message and changes. Exit status 0 allows the
1104 commit to proceed. A non-zero status will cause the transaction to
1104 commit to proceed. A non-zero status will cause the transaction to
1105 be rolled back. The ID of the new changeset is in ``$HG_NODE``. The parent
1105 be rolled back. The ID of the new changeset is in ``$HG_NODE``. The parent
1106 changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1106 changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1107
1107
1108 ``preupdate``
1108 ``preupdate``
1109 Run before updating the working directory. Exit status 0 allows
1109 Run before updating the working directory. Exit status 0 allows
1110 the update to proceed. A non-zero status will prevent the update.
1110 the update to proceed. A non-zero status will prevent the update.
1111 The changeset ID of first new parent is in ``$HG_PARENT1``. If updating to a
1111 The changeset ID of first new parent is in ``$HG_PARENT1``. If updating to a
1112 merge, the ID of second new parent is in ``$HG_PARENT2``.
1112 merge, the ID of second new parent is in ``$HG_PARENT2``.
1113
1113
1114 ``listkeys``
1114 ``listkeys``
1115 Run after listing pushkeys (like bookmarks) in the repository. The
1115 Run after listing pushkeys (like bookmarks) in the repository. The
1116 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
1116 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
1117 dictionary containing the keys and values.
1117 dictionary containing the keys and values.
1118
1118
1119 ``pushkey``
1119 ``pushkey``
1120 Run after a pushkey (like a bookmark) is added to the
1120 Run after a pushkey (like a bookmark) is added to the
1121 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
1121 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
1122 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
1122 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
1123 value is in ``$HG_NEW``.
1123 value is in ``$HG_NEW``.
1124
1124
1125 ``tag``
1125 ``tag``
1126 Run after a tag is created. The ID of the tagged changeset is in ``$HG_NODE``.
1126 Run after a tag is created. The ID of the tagged changeset is in ``$HG_NODE``.
1127 The name of tag is in ``$HG_TAG``. The tag is local if ``$HG_LOCAL=1``, or in
1127 The name of tag is in ``$HG_TAG``. The tag is local if ``$HG_LOCAL=1``, or in
1128 the repository if ``$HG_LOCAL=0``.
1128 the repository if ``$HG_LOCAL=0``.
1129
1129
1130 ``update``
1130 ``update``
1131 Run after updating the working directory. The changeset ID of first
1131 Run after updating the working directory. The changeset ID of first
1132 new parent is in ``$HG_PARENT1``. If updating to a merge, the ID of second new
1132 new parent is in ``$HG_PARENT1``. If updating to a merge, the ID of second new
1133 parent is in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
1133 parent is in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
1134 update failed (e.g. because conflicts were not resolved), ``$HG_ERROR=1``.
1134 update failed (e.g. because conflicts were not resolved), ``$HG_ERROR=1``.
1135
1135
1136 .. note::
1136 .. note::
1137
1137
1138 It is generally better to use standard hooks rather than the
1138 It is generally better to use standard hooks rather than the
1139 generic pre- and post- command hooks, as they are guaranteed to be
1139 generic pre- and post- command hooks, as they are guaranteed to be
1140 called in the appropriate contexts for influencing transactions.
1140 called in the appropriate contexts for influencing transactions.
1141 Also, hooks like "commit" will be called in all contexts that
1141 Also, hooks like "commit" will be called in all contexts that
1142 generate a commit (e.g. tag) and not just the commit command.
1142 generate a commit (e.g. tag) and not just the commit command.
1143
1143
1144 .. note::
1144 .. note::
1145
1145
1146 Environment variables with empty values may not be passed to
1146 Environment variables with empty values may not be passed to
1147 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
1147 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
1148 will have an empty value under Unix-like platforms for non-merge
1148 will have an empty value under Unix-like platforms for non-merge
1149 changesets, while it will not be available at all under Windows.
1149 changesets, while it will not be available at all under Windows.
1150
1150
1151 The syntax for Python hooks is as follows::
1151 The syntax for Python hooks is as follows::
1152
1152
1153 hookname = python:modulename.submodule.callable
1153 hookname = python:modulename.submodule.callable
1154 hookname = python:/path/to/python/module.py:callable
1154 hookname = python:/path/to/python/module.py:callable
1155
1155
1156 Python hooks are run within the Mercurial process. Each hook is
1156 Python hooks are run within the Mercurial process. Each hook is
1157 called with at least three keyword arguments: a ui object (keyword
1157 called with at least three keyword arguments: a ui object (keyword
1158 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
1158 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
1159 keyword that tells what kind of hook is used. Arguments listed as
1159 keyword that tells what kind of hook is used. Arguments listed as
1160 environment variables above are passed as keyword arguments, with no
1160 environment variables above are passed as keyword arguments, with no
1161 ``HG_`` prefix, and names in lower case.
1161 ``HG_`` prefix, and names in lower case.
1162
1162
1163 If a Python hook returns a "true" value or raises an exception, this
1163 If a Python hook returns a "true" value or raises an exception, this
1164 is treated as a failure.
1164 is treated as a failure.
1165
1165
1166
1166
1167 ``hostfingerprints``
1167 ``hostfingerprints``
1168 --------------------
1168 --------------------
1169
1169
1170 (Deprecated. Use ``[hostsecurity]``'s ``fingerprints`` options instead.)
1170 (Deprecated. Use ``[hostsecurity]``'s ``fingerprints`` options instead.)
1171
1171
1172 Fingerprints of the certificates of known HTTPS servers.
1172 Fingerprints of the certificates of known HTTPS servers.
1173
1173
1174 A HTTPS connection to a server with a fingerprint configured here will
1174 A HTTPS connection to a server with a fingerprint configured here will
1175 only succeed if the servers certificate matches the fingerprint.
1175 only succeed if the servers certificate matches the fingerprint.
1176 This is very similar to how ssh known hosts works.
1176 This is very similar to how ssh known hosts works.
1177
1177
1178 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
1178 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
1179 Multiple values can be specified (separated by spaces or commas). This can
1179 Multiple values can be specified (separated by spaces or commas). This can
1180 be used to define both old and new fingerprints while a host transitions
1180 be used to define both old and new fingerprints while a host transitions
1181 to a new certificate.
1181 to a new certificate.
1182
1182
1183 The CA chain and web.cacerts is not used for servers with a fingerprint.
1183 The CA chain and web.cacerts is not used for servers with a fingerprint.
1184
1184
1185 For example::
1185 For example::
1186
1186
1187 [hostfingerprints]
1187 [hostfingerprints]
1188 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1188 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1189 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1189 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1190
1190
1191 ``hostsecurity``
1191 ``hostsecurity``
1192 ----------------
1192 ----------------
1193
1193
1194 Used to specify global and per-host security settings for connecting to
1194 Used to specify global and per-host security settings for connecting to
1195 other machines.
1195 other machines.
1196
1196
1197 The following options control default behavior for all hosts.
1197 The following options control default behavior for all hosts.
1198
1198
1199 ``ciphers``
1199 ``ciphers``
1200 Defines the cryptographic ciphers to use for connections.
1200 Defines the cryptographic ciphers to use for connections.
1201
1201
1202 Value must be a valid OpenSSL Cipher List Format as documented at
1202 Value must be a valid OpenSSL Cipher List Format as documented at
1203 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-LIST-FORMAT.
1203 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-LIST-FORMAT.
1204
1204
1205 This setting is for advanced users only. Setting to incorrect values
1205 This setting is for advanced users only. Setting to incorrect values
1206 can significantly lower connection security or decrease performance.
1206 can significantly lower connection security or decrease performance.
1207 You have been warned.
1207 You have been warned.
1208
1208
1209 This option requires Python 2.7.
1209 This option requires Python 2.7.
1210
1210
1211 ``minimumprotocol``
1211 ``minimumprotocol``
1212 Defines the minimum channel encryption protocol to use.
1212 Defines the minimum channel encryption protocol to use.
1213
1213
1214 By default, the highest version of TLS supported by both client and server
1214 By default, the highest version of TLS supported by both client and server
1215 is used.
1215 is used.
1216
1216
1217 Allowed values are: ``tls1.0``, ``tls1.1``, ``tls1.2``.
1217 Allowed values are: ``tls1.0``, ``tls1.1``, ``tls1.2``.
1218
1218
1219 When running on an old Python version, only ``tls1.0`` is allowed since
1219 When running on an old Python version, only ``tls1.0`` is allowed since
1220 old versions of Python only support up to TLS 1.0.
1220 old versions of Python only support up to TLS 1.0.
1221
1221
1222 When running a Python that supports modern TLS versions, the default is
1222 When running a Python that supports modern TLS versions, the default is
1223 ``tls1.1``. ``tls1.0`` can still be used to allow TLS 1.0. However, this
1223 ``tls1.1``. ``tls1.0`` can still be used to allow TLS 1.0. However, this
1224 weakens security and should only be used as a feature of last resort if
1224 weakens security and should only be used as a feature of last resort if
1225 a server does not support TLS 1.1+.
1225 a server does not support TLS 1.1+.
1226
1226
1227 Options in the ``[hostsecurity]`` section can have the form
1227 Options in the ``[hostsecurity]`` section can have the form
1228 ``hostname``:``setting``. This allows multiple settings to be defined on a
1228 ``hostname``:``setting``. This allows multiple settings to be defined on a
1229 per-host basis.
1229 per-host basis.
1230
1230
1231 The following per-host settings can be defined.
1231 The following per-host settings can be defined.
1232
1232
1233 ``ciphers``
1233 ``ciphers``
1234 This behaves like ``ciphers`` as described above except it only applies
1234 This behaves like ``ciphers`` as described above except it only applies
1235 to the host on which it is defined.
1235 to the host on which it is defined.
1236
1236
1237 ``fingerprints``
1237 ``fingerprints``
1238 A list of hashes of the DER encoded peer/remote certificate. Values have
1238 A list of hashes of the DER encoded peer/remote certificate. Values have
1239 the form ``algorithm``:``fingerprint``. e.g.
1239 the form ``algorithm``:``fingerprint``. e.g.
1240 ``sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2``.
1240 ``sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2``.
1241 In addition, colons (``:``) can appear in the fingerprint part.
1241 In addition, colons (``:``) can appear in the fingerprint part.
1242
1242
1243 The following algorithms/prefixes are supported: ``sha1``, ``sha256``,
1243 The following algorithms/prefixes are supported: ``sha1``, ``sha256``,
1244 ``sha512``.
1244 ``sha512``.
1245
1245
1246 Use of ``sha256`` or ``sha512`` is preferred.
1246 Use of ``sha256`` or ``sha512`` is preferred.
1247
1247
1248 If a fingerprint is specified, the CA chain is not validated for this
1248 If a fingerprint is specified, the CA chain is not validated for this
1249 host and Mercurial will require the remote certificate to match one
1249 host and Mercurial will require the remote certificate to match one
1250 of the fingerprints specified. This means if the server updates its
1250 of the fingerprints specified. This means if the server updates its
1251 certificate, Mercurial will abort until a new fingerprint is defined.
1251 certificate, Mercurial will abort until a new fingerprint is defined.
1252 This can provide stronger security than traditional CA-based validation
1252 This can provide stronger security than traditional CA-based validation
1253 at the expense of convenience.
1253 at the expense of convenience.
1254
1254
1255 This option takes precedence over ``verifycertsfile``.
1255 This option takes precedence over ``verifycertsfile``.
1256
1256
1257 ``minimumprotocol``
1257 ``minimumprotocol``
1258 This behaves like ``minimumprotocol`` as described above except it
1258 This behaves like ``minimumprotocol`` as described above except it
1259 only applies to the host on which it is defined.
1259 only applies to the host on which it is defined.
1260
1260
1261 ``verifycertsfile``
1261 ``verifycertsfile``
1262 Path to file a containing a list of PEM encoded certificates used to
1262 Path to file a containing a list of PEM encoded certificates used to
1263 verify the server certificate. Environment variables and ``~user``
1263 verify the server certificate. Environment variables and ``~user``
1264 constructs are expanded in the filename.
1264 constructs are expanded in the filename.
1265
1265
1266 The server certificate or the certificate's certificate authority (CA)
1266 The server certificate or the certificate's certificate authority (CA)
1267 must match a certificate from this file or certificate verification
1267 must match a certificate from this file or certificate verification
1268 will fail and connections to the server will be refused.
1268 will fail and connections to the server will be refused.
1269
1269
1270 If defined, only certificates provided by this file will be used:
1270 If defined, only certificates provided by this file will be used:
1271 ``web.cacerts`` and any system/default certificates will not be
1271 ``web.cacerts`` and any system/default certificates will not be
1272 used.
1272 used.
1273
1273
1274 This option has no effect if the per-host ``fingerprints`` option
1274 This option has no effect if the per-host ``fingerprints`` option
1275 is set.
1275 is set.
1276
1276
1277 The format of the file is as follows::
1277 The format of the file is as follows::
1278
1278
1279 -----BEGIN CERTIFICATE-----
1279 -----BEGIN CERTIFICATE-----
1280 ... (certificate in base64 PEM encoding) ...
1280 ... (certificate in base64 PEM encoding) ...
1281 -----END CERTIFICATE-----
1281 -----END CERTIFICATE-----
1282 -----BEGIN CERTIFICATE-----
1282 -----BEGIN CERTIFICATE-----
1283 ... (certificate in base64 PEM encoding) ...
1283 ... (certificate in base64 PEM encoding) ...
1284 -----END CERTIFICATE-----
1284 -----END CERTIFICATE-----
1285
1285
1286 For example::
1286 For example::
1287
1287
1288 [hostsecurity]
1288 [hostsecurity]
1289 hg.example.com:fingerprints = sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
1289 hg.example.com:fingerprints = sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
1290 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
1290 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
1291 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
1291 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
1292 foo.example.com:verifycertsfile = /etc/ssl/trusted-ca-certs.pem
1292 foo.example.com:verifycertsfile = /etc/ssl/trusted-ca-certs.pem
1293
1293
1294 To change the default minimum protocol version to TLS 1.2 but to allow TLS 1.1
1294 To change the default minimum protocol version to TLS 1.2 but to allow TLS 1.1
1295 when connecting to ``hg.example.com``::
1295 when connecting to ``hg.example.com``::
1296
1296
1297 [hostsecurity]
1297 [hostsecurity]
1298 minimumprotocol = tls1.2
1298 minimumprotocol = tls1.2
1299 hg.example.com:minimumprotocol = tls1.1
1299 hg.example.com:minimumprotocol = tls1.1
1300
1300
1301 ``http_proxy``
1301 ``http_proxy``
1302 --------------
1302 --------------
1303
1303
1304 Used to access web-based Mercurial repositories through a HTTP
1304 Used to access web-based Mercurial repositories through a HTTP
1305 proxy.
1305 proxy.
1306
1306
1307 ``host``
1307 ``host``
1308 Host name and (optional) port of the proxy server, for example
1308 Host name and (optional) port of the proxy server, for example
1309 "myproxy:8000".
1309 "myproxy:8000".
1310
1310
1311 ``no``
1311 ``no``
1312 Optional. Comma-separated list of host names that should bypass
1312 Optional. Comma-separated list of host names that should bypass
1313 the proxy.
1313 the proxy.
1314
1314
1315 ``passwd``
1315 ``passwd``
1316 Optional. Password to authenticate with at the proxy server.
1316 Optional. Password to authenticate with at the proxy server.
1317
1317
1318 ``user``
1318 ``user``
1319 Optional. User name to authenticate with at the proxy server.
1319 Optional. User name to authenticate with at the proxy server.
1320
1320
1321 ``always``
1321 ``always``
1322 Optional. Always use the proxy, even for localhost and any entries
1322 Optional. Always use the proxy, even for localhost and any entries
1323 in ``http_proxy.no``. (default: False)
1323 in ``http_proxy.no``. (default: False)
1324
1324
1325 ``http``
1325 ``http``
1326 ----------
1326 ----------
1327
1327
1328 Used to configure access to Mercurial repositories via HTTP.
1328 Used to configure access to Mercurial repositories via HTTP.
1329
1329
1330 ``timeout``
1330 ``timeout``
1331 If set, blocking operations will timeout after that many seconds.
1331 If set, blocking operations will timeout after that many seconds.
1332 (default: None)
1332 (default: None)
1333
1333
1334 ``merge``
1334 ``merge``
1335 ---------
1335 ---------
1336
1336
1337 This section specifies behavior during merges and updates.
1337 This section specifies behavior during merges and updates.
1338
1338
1339 ``checkignored``
1339 ``checkignored``
1340 Controls behavior when an ignored file on disk has the same name as a tracked
1340 Controls behavior when an ignored file on disk has the same name as a tracked
1341 file in the changeset being merged or updated to, and has different
1341 file in the changeset being merged or updated to, and has different
1342 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1342 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1343 abort on such files. With ``warn``, warn on such files and back them up as
1343 abort on such files. With ``warn``, warn on such files and back them up as
1344 ``.orig``. With ``ignore``, don't print a warning and back them up as
1344 ``.orig``. With ``ignore``, don't print a warning and back them up as
1345 ``.orig``. (default: ``abort``)
1345 ``.orig``. (default: ``abort``)
1346
1346
1347 ``checkunknown``
1347 ``checkunknown``
1348 Controls behavior when an unknown file that isn't ignored has the same name
1348 Controls behavior when an unknown file that isn't ignored has the same name
1349 as a tracked file in the changeset being merged or updated to, and has
1349 as a tracked file in the changeset being merged or updated to, and has
1350 different contents. Similar to ``merge.checkignored``, except for files that
1350 different contents. Similar to ``merge.checkignored``, except for files that
1351 are not ignored. (default: ``abort``)
1351 are not ignored. (default: ``abort``)
1352
1352
1353 ``on-failure``
1353 ``on-failure``
1354 When set to ``continue`` (the default), the merge process attempts to
1354 When set to ``continue`` (the default), the merge process attempts to
1355 merge all unresolved files using the merge chosen tool, regardless of
1355 merge all unresolved files using the merge chosen tool, regardless of
1356 whether previous file merge attempts during the process succeeded or not.
1356 whether previous file merge attempts during the process succeeded or not.
1357 Setting this to ``prompt`` will prompt after any merge failure continue
1357 Setting this to ``prompt`` will prompt after any merge failure continue
1358 or halt the merge process. Setting this to ``halt`` will automatically
1358 or halt the merge process. Setting this to ``halt`` will automatically
1359 halt the merge process on any merge tool failure. The merge process
1359 halt the merge process on any merge tool failure. The merge process
1360 can be restarted by using the ``resolve`` command. When a merge is
1360 can be restarted by using the ``resolve`` command. When a merge is
1361 halted, the repository is left in a normal ``unresolved`` merge state.
1361 halted, the repository is left in a normal ``unresolved`` merge state.
1362 (default: ``continue``)
1362 (default: ``continue``)
1363
1363
1364 ``strict-capability-check``
1364 ``strict-capability-check``
1365 Whether capabilities of internal merge tools are checked strictly
1365 Whether capabilities of internal merge tools are checked strictly
1366 or not, while examining rules to decide merge tool to be used.
1366 or not, while examining rules to decide merge tool to be used.
1367 (default: False)
1367 (default: False)
1368
1368
1369 ``merge-patterns``
1369 ``merge-patterns``
1370 ------------------
1370 ------------------
1371
1371
1372 This section specifies merge tools to associate with particular file
1372 This section specifies merge tools to associate with particular file
1373 patterns. Tools matched here will take precedence over the default
1373 patterns. Tools matched here will take precedence over the default
1374 merge tool. Patterns are globs by default, rooted at the repository
1374 merge tool. Patterns are globs by default, rooted at the repository
1375 root.
1375 root.
1376
1376
1377 Example::
1377 Example::
1378
1378
1379 [merge-patterns]
1379 [merge-patterns]
1380 **.c = kdiff3
1380 **.c = kdiff3
1381 **.jpg = myimgmerge
1381 **.jpg = myimgmerge
1382
1382
1383 ``merge-tools``
1383 ``merge-tools``
1384 ---------------
1384 ---------------
1385
1385
1386 This section configures external merge tools to use for file-level
1386 This section configures external merge tools to use for file-level
1387 merges. This section has likely been preconfigured at install time.
1387 merges. This section has likely been preconfigured at install time.
1388 Use :hg:`config merge-tools` to check the existing configuration.
1388 Use :hg:`config merge-tools` to check the existing configuration.
1389 Also see :hg:`help merge-tools` for more details.
1389 Also see :hg:`help merge-tools` for more details.
1390
1390
1391 Example ``~/.hgrc``::
1391 Example ``~/.hgrc``::
1392
1392
1393 [merge-tools]
1393 [merge-tools]
1394 # Override stock tool location
1394 # Override stock tool location
1395 kdiff3.executable = ~/bin/kdiff3
1395 kdiff3.executable = ~/bin/kdiff3
1396 # Specify command line
1396 # Specify command line
1397 kdiff3.args = $base $local $other -o $output
1397 kdiff3.args = $base $local $other -o $output
1398 # Give higher priority
1398 # Give higher priority
1399 kdiff3.priority = 1
1399 kdiff3.priority = 1
1400
1400
1401 # Changing the priority of preconfigured tool
1401 # Changing the priority of preconfigured tool
1402 meld.priority = 0
1402 meld.priority = 0
1403
1403
1404 # Disable a preconfigured tool
1404 # Disable a preconfigured tool
1405 vimdiff.disabled = yes
1405 vimdiff.disabled = yes
1406
1406
1407 # Define new tool
1407 # Define new tool
1408 myHtmlTool.args = -m $local $other $base $output
1408 myHtmlTool.args = -m $local $other $base $output
1409 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1409 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1410 myHtmlTool.priority = 1
1410 myHtmlTool.priority = 1
1411
1411
1412 Supported arguments:
1412 Supported arguments:
1413
1413
1414 ``priority``
1414 ``priority``
1415 The priority in which to evaluate this tool.
1415 The priority in which to evaluate this tool.
1416 (default: 0)
1416 (default: 0)
1417
1417
1418 ``executable``
1418 ``executable``
1419 Either just the name of the executable or its pathname.
1419 Either just the name of the executable or its pathname.
1420
1420
1421 .. container:: windows
1421 .. container:: windows
1422
1422
1423 On Windows, the path can use environment variables with ${ProgramFiles}
1423 On Windows, the path can use environment variables with ${ProgramFiles}
1424 syntax.
1424 syntax.
1425
1425
1426 (default: the tool name)
1426 (default: the tool name)
1427
1427
1428 ``args``
1428 ``args``
1429 The arguments to pass to the tool executable. You can refer to the
1429 The arguments to pass to the tool executable. You can refer to the
1430 files being merged as well as the output file through these
1430 files being merged as well as the output file through these
1431 variables: ``$base``, ``$local``, ``$other``, ``$output``.
1431 variables: ``$base``, ``$local``, ``$other``, ``$output``.
1432
1432
1433 The meaning of ``$local`` and ``$other`` can vary depending on which action is
1433 The meaning of ``$local`` and ``$other`` can vary depending on which action is
1434 being performed. During an update or merge, ``$local`` represents the original
1434 being performed. During an update or merge, ``$local`` represents the original
1435 state of the file, while ``$other`` represents the commit you are updating to or
1435 state of the file, while ``$other`` represents the commit you are updating to or
1436 the commit you are merging with. During a rebase, ``$local`` represents the
1436 the commit you are merging with. During a rebase, ``$local`` represents the
1437 destination of the rebase, and ``$other`` represents the commit being rebased.
1437 destination of the rebase, and ``$other`` represents the commit being rebased.
1438
1438
1439 Some operations define custom labels to assist with identifying the revisions,
1439 Some operations define custom labels to assist with identifying the revisions,
1440 accessible via ``$labellocal``, ``$labelother``, and ``$labelbase``. If custom
1440 accessible via ``$labellocal``, ``$labelother``, and ``$labelbase``. If custom
1441 labels are not available, these will be ``local``, ``other``, and ``base``,
1441 labels are not available, these will be ``local``, ``other``, and ``base``,
1442 respectively.
1442 respectively.
1443 (default: ``$local $base $other``)
1443 (default: ``$local $base $other``)
1444
1444
1445 ``premerge``
1445 ``premerge``
1446 Attempt to run internal non-interactive 3-way merge tool before
1446 Attempt to run internal non-interactive 3-way merge tool before
1447 launching external tool. Options are ``true``, ``false``, ``keep`` or
1447 launching external tool. Options are ``true``, ``false``, ``keep`` or
1448 ``keep-merge3``. The ``keep`` option will leave markers in the file if the
1448 ``keep-merge3``. The ``keep`` option will leave markers in the file if the
1449 premerge fails. The ``keep-merge3`` will do the same but include information
1449 premerge fails. The ``keep-merge3`` will do the same but include information
1450 about the base of the merge in the marker (see internal :merge3 in
1450 about the base of the merge in the marker (see internal :merge3 in
1451 :hg:`help merge-tools`).
1451 :hg:`help merge-tools`).
1452 (default: True)
1452 (default: True)
1453
1453
1454 ``binary``
1454 ``binary``
1455 This tool can merge binary files. (default: False, unless tool
1455 This tool can merge binary files. (default: False, unless tool
1456 was selected by file pattern match)
1456 was selected by file pattern match)
1457
1457
1458 ``symlink``
1458 ``symlink``
1459 This tool can merge symlinks. (default: False)
1459 This tool can merge symlinks. (default: False)
1460
1460
1461 ``check``
1461 ``check``
1462 A list of merge success-checking options:
1462 A list of merge success-checking options:
1463
1463
1464 ``changed``
1464 ``changed``
1465 Ask whether merge was successful when the merged file shows no changes.
1465 Ask whether merge was successful when the merged file shows no changes.
1466 ``conflicts``
1466 ``conflicts``
1467 Check whether there are conflicts even though the tool reported success.
1467 Check whether there are conflicts even though the tool reported success.
1468 ``prompt``
1468 ``prompt``
1469 Always prompt for merge success, regardless of success reported by tool.
1469 Always prompt for merge success, regardless of success reported by tool.
1470
1470
1471 ``fixeol``
1471 ``fixeol``
1472 Attempt to fix up EOL changes caused by the merge tool.
1472 Attempt to fix up EOL changes caused by the merge tool.
1473 (default: False)
1473 (default: False)
1474
1474
1475 ``gui``
1475 ``gui``
1476 This tool requires a graphical interface to run. (default: False)
1476 This tool requires a graphical interface to run. (default: False)
1477
1477
1478 ``mergemarkers``
1478 ``mergemarkers``
1479 Controls whether the labels passed via ``$labellocal``, ``$labelother``, and
1479 Controls whether the labels passed via ``$labellocal``, ``$labelother``, and
1480 ``$labelbase`` are ``detailed`` (respecting ``mergemarkertemplate``) or
1480 ``$labelbase`` are ``detailed`` (respecting ``mergemarkertemplate``) or
1481 ``basic``. If ``premerge`` is ``keep`` or ``keep-merge3``, the conflict
1481 ``basic``. If ``premerge`` is ``keep`` or ``keep-merge3``, the conflict
1482 markers generated during premerge will be ``detailed`` if either this option or
1482 markers generated during premerge will be ``detailed`` if either this option or
1483 the corresponding option in the ``[ui]`` section is ``detailed``.
1483 the corresponding option in the ``[ui]`` section is ``detailed``.
1484 (default: ``basic``)
1484 (default: ``basic``)
1485
1485
1486 ``mergemarkertemplate``
1486 ``mergemarkertemplate``
1487 This setting can be used to override ``mergemarkertemplate`` from the ``[ui]``
1487 This setting can be used to override ``mergemarkertemplate`` from the ``[ui]``
1488 section on a per-tool basis; this applies to the ``$label``-prefixed variables
1488 section on a per-tool basis; this applies to the ``$label``-prefixed variables
1489 and to the conflict markers that are generated if ``premerge`` is ``keep` or
1489 and to the conflict markers that are generated if ``premerge`` is ``keep` or
1490 ``keep-merge3``. See the corresponding variable in ``[ui]`` for more
1490 ``keep-merge3``. See the corresponding variable in ``[ui]`` for more
1491 information.
1491 information.
1492
1492
1493 .. container:: windows
1493 .. container:: windows
1494
1494
1495 ``regkey``
1495 ``regkey``
1496 Windows registry key which describes install location of this
1496 Windows registry key which describes install location of this
1497 tool. Mercurial will search for this key first under
1497 tool. Mercurial will search for this key first under
1498 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1498 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1499 (default: None)
1499 (default: None)
1500
1500
1501 ``regkeyalt``
1501 ``regkeyalt``
1502 An alternate Windows registry key to try if the first key is not
1502 An alternate Windows registry key to try if the first key is not
1503 found. The alternate key uses the same ``regname`` and ``regappend``
1503 found. The alternate key uses the same ``regname`` and ``regappend``
1504 semantics of the primary key. The most common use for this key
1504 semantics of the primary key. The most common use for this key
1505 is to search for 32bit applications on 64bit operating systems.
1505 is to search for 32bit applications on 64bit operating systems.
1506 (default: None)
1506 (default: None)
1507
1507
1508 ``regname``
1508 ``regname``
1509 Name of value to read from specified registry key.
1509 Name of value to read from specified registry key.
1510 (default: the unnamed (default) value)
1510 (default: the unnamed (default) value)
1511
1511
1512 ``regappend``
1512 ``regappend``
1513 String to append to the value read from the registry, typically
1513 String to append to the value read from the registry, typically
1514 the executable name of the tool.
1514 the executable name of the tool.
1515 (default: None)
1515 (default: None)
1516
1516
1517 ``pager``
1517 ``pager``
1518 ---------
1518 ---------
1519
1519
1520 Setting used to control when to paginate and with what external tool. See
1520 Setting used to control when to paginate and with what external tool. See
1521 :hg:`help pager` for details.
1521 :hg:`help pager` for details.
1522
1522
1523 ``pager``
1523 ``pager``
1524 Define the external tool used as pager.
1524 Define the external tool used as pager.
1525
1525
1526 If no pager is set, Mercurial uses the environment variable $PAGER.
1526 If no pager is set, Mercurial uses the environment variable $PAGER.
1527 If neither pager.pager, nor $PAGER is set, a default pager will be
1527 If neither pager.pager, nor $PAGER is set, a default pager will be
1528 used, typically `less` on Unix and `more` on Windows. Example::
1528 used, typically `less` on Unix and `more` on Windows. Example::
1529
1529
1530 [pager]
1530 [pager]
1531 pager = less -FRX
1531 pager = less -FRX
1532
1532
1533 ``ignore``
1533 ``ignore``
1534 List of commands to disable the pager for. Example::
1534 List of commands to disable the pager for. Example::
1535
1535
1536 [pager]
1536 [pager]
1537 ignore = version, help, update
1537 ignore = version, help, update
1538
1538
1539 ``patch``
1539 ``patch``
1540 ---------
1540 ---------
1541
1541
1542 Settings used when applying patches, for instance through the 'import'
1542 Settings used when applying patches, for instance through the 'import'
1543 command or with Mercurial Queues extension.
1543 command or with Mercurial Queues extension.
1544
1544
1545 ``eol``
1545 ``eol``
1546 When set to 'strict' patch content and patched files end of lines
1546 When set to 'strict' patch content and patched files end of lines
1547 are preserved. When set to ``lf`` or ``crlf``, both files end of
1547 are preserved. When set to ``lf`` or ``crlf``, both files end of
1548 lines are ignored when patching and the result line endings are
1548 lines are ignored when patching and the result line endings are
1549 normalized to either LF (Unix) or CRLF (Windows). When set to
1549 normalized to either LF (Unix) or CRLF (Windows). When set to
1550 ``auto``, end of lines are again ignored while patching but line
1550 ``auto``, end of lines are again ignored while patching but line
1551 endings in patched files are normalized to their original setting
1551 endings in patched files are normalized to their original setting
1552 on a per-file basis. If target file does not exist or has no end
1552 on a per-file basis. If target file does not exist or has no end
1553 of line, patch line endings are preserved.
1553 of line, patch line endings are preserved.
1554 (default: strict)
1554 (default: strict)
1555
1555
1556 ``fuzz``
1556 ``fuzz``
1557 The number of lines of 'fuzz' to allow when applying patches. This
1557 The number of lines of 'fuzz' to allow when applying patches. This
1558 controls how much context the patcher is allowed to ignore when
1558 controls how much context the patcher is allowed to ignore when
1559 trying to apply a patch.
1559 trying to apply a patch.
1560 (default: 2)
1560 (default: 2)
1561
1561
1562 ``paths``
1562 ``paths``
1563 ---------
1563 ---------
1564
1564
1565 Assigns symbolic names and behavior to repositories.
1565 Assigns symbolic names and behavior to repositories.
1566
1566
1567 Options are symbolic names defining the URL or directory that is the
1567 Options are symbolic names defining the URL or directory that is the
1568 location of the repository. Example::
1568 location of the repository. Example::
1569
1569
1570 [paths]
1570 [paths]
1571 my_server = https://example.com/my_repo
1571 my_server = https://example.com/my_repo
1572 local_path = /home/me/repo
1572 local_path = /home/me/repo
1573
1573
1574 These symbolic names can be used from the command line. To pull
1574 These symbolic names can be used from the command line. To pull
1575 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1575 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1576 :hg:`push local_path`.
1576 :hg:`push local_path`.
1577
1577
1578 Options containing colons (``:``) denote sub-options that can influence
1578 Options containing colons (``:``) denote sub-options that can influence
1579 behavior for that specific path. Example::
1579 behavior for that specific path. Example::
1580
1580
1581 [paths]
1581 [paths]
1582 my_server = https://example.com/my_path
1582 my_server = https://example.com/my_path
1583 my_server:pushurl = ssh://example.com/my_path
1583 my_server:pushurl = ssh://example.com/my_path
1584
1584
1585 The following sub-options can be defined:
1585 The following sub-options can be defined:
1586
1586
1587 ``pushurl``
1587 ``pushurl``
1588 The URL to use for push operations. If not defined, the location
1588 The URL to use for push operations. If not defined, the location
1589 defined by the path's main entry is used.
1589 defined by the path's main entry is used.
1590
1590
1591 ``pushrev``
1591 ``pushrev``
1592 A revset defining which revisions to push by default.
1592 A revset defining which revisions to push by default.
1593
1593
1594 When :hg:`push` is executed without a ``-r`` argument, the revset
1594 When :hg:`push` is executed without a ``-r`` argument, the revset
1595 defined by this sub-option is evaluated to determine what to push.
1595 defined by this sub-option is evaluated to determine what to push.
1596
1596
1597 For example, a value of ``.`` will push the working directory's
1597 For example, a value of ``.`` will push the working directory's
1598 revision by default.
1598 revision by default.
1599
1599
1600 Revsets specifying bookmarks will not result in the bookmark being
1600 Revsets specifying bookmarks will not result in the bookmark being
1601 pushed.
1601 pushed.
1602
1602
1603 The following special named paths exist:
1603 The following special named paths exist:
1604
1604
1605 ``default``
1605 ``default``
1606 The URL or directory to use when no source or remote is specified.
1606 The URL or directory to use when no source or remote is specified.
1607
1607
1608 :hg:`clone` will automatically define this path to the location the
1608 :hg:`clone` will automatically define this path to the location the
1609 repository was cloned from.
1609 repository was cloned from.
1610
1610
1611 ``default-push``
1611 ``default-push``
1612 (deprecated) The URL or directory for the default :hg:`push` location.
1612 (deprecated) The URL or directory for the default :hg:`push` location.
1613 ``default:pushurl`` should be used instead.
1613 ``default:pushurl`` should be used instead.
1614
1614
1615 ``phases``
1615 ``phases``
1616 ----------
1616 ----------
1617
1617
1618 Specifies default handling of phases. See :hg:`help phases` for more
1618 Specifies default handling of phases. See :hg:`help phases` for more
1619 information about working with phases.
1619 information about working with phases.
1620
1620
1621 ``publish``
1621 ``publish``
1622 Controls draft phase behavior when working as a server. When true,
1622 Controls draft phase behavior when working as a server. When true,
1623 pushed changesets are set to public in both client and server and
1623 pushed changesets are set to public in both client and server and
1624 pulled or cloned changesets are set to public in the client.
1624 pulled or cloned changesets are set to public in the client.
1625 (default: True)
1625 (default: True)
1626
1626
1627 ``new-commit``
1627 ``new-commit``
1628 Phase of newly-created commits.
1628 Phase of newly-created commits.
1629 (default: draft)
1629 (default: draft)
1630
1630
1631 ``checksubrepos``
1631 ``checksubrepos``
1632 Check the phase of the current revision of each subrepository. Allowed
1632 Check the phase of the current revision of each subrepository. Allowed
1633 values are "ignore", "follow" and "abort". For settings other than
1633 values are "ignore", "follow" and "abort". For settings other than
1634 "ignore", the phase of the current revision of each subrepository is
1634 "ignore", the phase of the current revision of each subrepository is
1635 checked before committing the parent repository. If any of those phases is
1635 checked before committing the parent repository. If any of those phases is
1636 greater than the phase of the parent repository (e.g. if a subrepo is in a
1636 greater than the phase of the parent repository (e.g. if a subrepo is in a
1637 "secret" phase while the parent repo is in "draft" phase), the commit is
1637 "secret" phase while the parent repo is in "draft" phase), the commit is
1638 either aborted (if checksubrepos is set to "abort") or the higher phase is
1638 either aborted (if checksubrepos is set to "abort") or the higher phase is
1639 used for the parent repository commit (if set to "follow").
1639 used for the parent repository commit (if set to "follow").
1640 (default: follow)
1640 (default: follow)
1641
1641
1642
1642
1643 ``profiling``
1643 ``profiling``
1644 -------------
1644 -------------
1645
1645
1646 Specifies profiling type, format, and file output. Two profilers are
1646 Specifies profiling type, format, and file output. Two profilers are
1647 supported: an instrumenting profiler (named ``ls``), and a sampling
1647 supported: an instrumenting profiler (named ``ls``), and a sampling
1648 profiler (named ``stat``).
1648 profiler (named ``stat``).
1649
1649
1650 In this section description, 'profiling data' stands for the raw data
1650 In this section description, 'profiling data' stands for the raw data
1651 collected during profiling, while 'profiling report' stands for a
1651 collected during profiling, while 'profiling report' stands for a
1652 statistical text report generated from the profiling data.
1652 statistical text report generated from the profiling data.
1653
1653
1654 ``enabled``
1654 ``enabled``
1655 Enable the profiler.
1655 Enable the profiler.
1656 (default: false)
1656 (default: false)
1657
1657
1658 This is equivalent to passing ``--profile`` on the command line.
1658 This is equivalent to passing ``--profile`` on the command line.
1659
1659
1660 ``type``
1660 ``type``
1661 The type of profiler to use.
1661 The type of profiler to use.
1662 (default: stat)
1662 (default: stat)
1663
1663
1664 ``ls``
1664 ``ls``
1665 Use Python's built-in instrumenting profiler. This profiler
1665 Use Python's built-in instrumenting profiler. This profiler
1666 works on all platforms, but each line number it reports is the
1666 works on all platforms, but each line number it reports is the
1667 first line of a function. This restriction makes it difficult to
1667 first line of a function. This restriction makes it difficult to
1668 identify the expensive parts of a non-trivial function.
1668 identify the expensive parts of a non-trivial function.
1669 ``stat``
1669 ``stat``
1670 Use a statistical profiler, statprof. This profiler is most
1670 Use a statistical profiler, statprof. This profiler is most
1671 useful for profiling commands that run for longer than about 0.1
1671 useful for profiling commands that run for longer than about 0.1
1672 seconds.
1672 seconds.
1673
1673
1674 ``format``
1674 ``format``
1675 Profiling format. Specific to the ``ls`` instrumenting profiler.
1675 Profiling format. Specific to the ``ls`` instrumenting profiler.
1676 (default: text)
1676 (default: text)
1677
1677
1678 ``text``
1678 ``text``
1679 Generate a profiling report. When saving to a file, it should be
1679 Generate a profiling report. When saving to a file, it should be
1680 noted that only the report is saved, and the profiling data is
1680 noted that only the report is saved, and the profiling data is
1681 not kept.
1681 not kept.
1682 ``kcachegrind``
1682 ``kcachegrind``
1683 Format profiling data for kcachegrind use: when saving to a
1683 Format profiling data for kcachegrind use: when saving to a
1684 file, the generated file can directly be loaded into
1684 file, the generated file can directly be loaded into
1685 kcachegrind.
1685 kcachegrind.
1686
1686
1687 ``statformat``
1687 ``statformat``
1688 Profiling format for the ``stat`` profiler.
1688 Profiling format for the ``stat`` profiler.
1689 (default: hotpath)
1689 (default: hotpath)
1690
1690
1691 ``hotpath``
1691 ``hotpath``
1692 Show a tree-based display containing the hot path of execution (where
1692 Show a tree-based display containing the hot path of execution (where
1693 most time was spent).
1693 most time was spent).
1694 ``bymethod``
1694 ``bymethod``
1695 Show a table of methods ordered by how frequently they are active.
1695 Show a table of methods ordered by how frequently they are active.
1696 ``byline``
1696 ``byline``
1697 Show a table of lines in files ordered by how frequently they are active.
1697 Show a table of lines in files ordered by how frequently they are active.
1698 ``json``
1698 ``json``
1699 Render profiling data as JSON.
1699 Render profiling data as JSON.
1700
1700
1701 ``frequency``
1701 ``frequency``
1702 Sampling frequency. Specific to the ``stat`` sampling profiler.
1702 Sampling frequency. Specific to the ``stat`` sampling profiler.
1703 (default: 1000)
1703 (default: 1000)
1704
1704
1705 ``output``
1705 ``output``
1706 File path where profiling data or report should be saved. If the
1706 File path where profiling data or report should be saved. If the
1707 file exists, it is replaced. (default: None, data is printed on
1707 file exists, it is replaced. (default: None, data is printed on
1708 stderr)
1708 stderr)
1709
1709
1710 ``sort``
1710 ``sort``
1711 Sort field. Specific to the ``ls`` instrumenting profiler.
1711 Sort field. Specific to the ``ls`` instrumenting profiler.
1712 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1712 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1713 ``inlinetime``.
1713 ``inlinetime``.
1714 (default: inlinetime)
1714 (default: inlinetime)
1715
1715
1716 ``time-track``
1716 ``time-track``
1717 Control if the stat profiler track ``cpu`` or ``real`` time.
1717 Control if the stat profiler track ``cpu`` or ``real`` time.
1718 (default: ``cpu`` on Windows, otherwise ``real``)
1718 (default: ``cpu`` on Windows, otherwise ``real``)
1719
1719
1720 ``limit``
1720 ``limit``
1721 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1721 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1722 (default: 30)
1722 (default: 30)
1723
1723
1724 ``nested``
1724 ``nested``
1725 Show at most this number of lines of drill-down info after each main entry.
1725 Show at most this number of lines of drill-down info after each main entry.
1726 This can help explain the difference between Total and Inline.
1726 This can help explain the difference between Total and Inline.
1727 Specific to the ``ls`` instrumenting profiler.
1727 Specific to the ``ls`` instrumenting profiler.
1728 (default: 0)
1728 (default: 0)
1729
1729
1730 ``showmin``
1730 ``showmin``
1731 Minimum fraction of samples an entry must have for it to be displayed.
1731 Minimum fraction of samples an entry must have for it to be displayed.
1732 Can be specified as a float between ``0.0`` and ``1.0`` or can have a
1732 Can be specified as a float between ``0.0`` and ``1.0`` or can have a
1733 ``%`` afterwards to allow values up to ``100``. e.g. ``5%``.
1733 ``%`` afterwards to allow values up to ``100``. e.g. ``5%``.
1734
1734
1735 Only used by the ``stat`` profiler.
1735 Only used by the ``stat`` profiler.
1736
1736
1737 For the ``hotpath`` format, default is ``0.05``.
1737 For the ``hotpath`` format, default is ``0.05``.
1738 For the ``chrome`` format, default is ``0.005``.
1738 For the ``chrome`` format, default is ``0.005``.
1739
1739
1740 The option is unused on other formats.
1740 The option is unused on other formats.
1741
1741
1742 ``showmax``
1742 ``showmax``
1743 Maximum fraction of samples an entry can have before it is ignored in
1743 Maximum fraction of samples an entry can have before it is ignored in
1744 display. Values format is the same as ``showmin``.
1744 display. Values format is the same as ``showmin``.
1745
1745
1746 Only used by the ``stat`` profiler.
1746 Only used by the ``stat`` profiler.
1747
1747
1748 For the ``chrome`` format, default is ``0.999``.
1748 For the ``chrome`` format, default is ``0.999``.
1749
1749
1750 The option is unused on other formats.
1750 The option is unused on other formats.
1751
1751
1752 ``progress``
1752 ``progress``
1753 ------------
1753 ------------
1754
1754
1755 Mercurial commands can draw progress bars that are as informative as
1755 Mercurial commands can draw progress bars that are as informative as
1756 possible. Some progress bars only offer indeterminate information, while others
1756 possible. Some progress bars only offer indeterminate information, while others
1757 have a definite end point.
1757 have a definite end point.
1758
1758
1759 ``debug``
1759 ``debug``
1760 Whether to print debug info when updating the progress bar. (default: False)
1760 Whether to print debug info when updating the progress bar. (default: False)
1761
1761
1762 ``delay``
1762 ``delay``
1763 Number of seconds (float) before showing the progress bar. (default: 3)
1763 Number of seconds (float) before showing the progress bar. (default: 3)
1764
1764
1765 ``changedelay``
1765 ``changedelay``
1766 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1766 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1767 that value will be used instead. (default: 1)
1767 that value will be used instead. (default: 1)
1768
1768
1769 ``estimateinterval``
1769 ``estimateinterval``
1770 Maximum sampling interval in seconds for speed and estimated time
1770 Maximum sampling interval in seconds for speed and estimated time
1771 calculation. (default: 60)
1771 calculation. (default: 60)
1772
1772
1773 ``refresh``
1773 ``refresh``
1774 Time in seconds between refreshes of the progress bar. (default: 0.1)
1774 Time in seconds between refreshes of the progress bar. (default: 0.1)
1775
1775
1776 ``format``
1776 ``format``
1777 Format of the progress bar.
1777 Format of the progress bar.
1778
1778
1779 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1779 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1780 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1780 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1781 last 20 characters of the item, but this can be changed by adding either
1781 last 20 characters of the item, but this can be changed by adding either
1782 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1782 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1783 first num characters.
1783 first num characters.
1784
1784
1785 (default: topic bar number estimate)
1785 (default: topic bar number estimate)
1786
1786
1787 ``width``
1787 ``width``
1788 If set, the maximum width of the progress information (that is, min(width,
1788 If set, the maximum width of the progress information (that is, min(width,
1789 term width) will be used).
1789 term width) will be used).
1790
1790
1791 ``clear-complete``
1791 ``clear-complete``
1792 Clear the progress bar after it's done. (default: True)
1792 Clear the progress bar after it's done. (default: True)
1793
1793
1794 ``disable``
1794 ``disable``
1795 If true, don't show a progress bar.
1795 If true, don't show a progress bar.
1796
1796
1797 ``assume-tty``
1797 ``assume-tty``
1798 If true, ALWAYS show a progress bar, unless disable is given.
1798 If true, ALWAYS show a progress bar, unless disable is given.
1799
1799
1800 ``rebase``
1800 ``rebase``
1801 ----------
1801 ----------
1802
1802
1803 ``evolution.allowdivergence``
1803 ``evolution.allowdivergence``
1804 Default to False, when True allow creating divergence when performing
1804 Default to False, when True allow creating divergence when performing
1805 rebase of obsolete changesets.
1805 rebase of obsolete changesets.
1806
1806
1807 ``revsetalias``
1807 ``revsetalias``
1808 ---------------
1808 ---------------
1809
1809
1810 Alias definitions for revsets. See :hg:`help revsets` for details.
1810 Alias definitions for revsets. See :hg:`help revsets` for details.
1811
1811
1812 ``rewrite``
1812 ``rewrite``
1813 -----------
1813 -----------
1814
1814
1815 ``backup-bundle``
1816 Whether to save stripped changesets to a bundle file. (default: True)
1817
1815 ``update-timestamp``
1818 ``update-timestamp``
1816 If true, updates the date and time of the changeset to current. It is only
1819 If true, updates the date and time of the changeset to current. It is only
1817 applicable for hg amend in current version.
1820 applicable for hg amend in current version.
1818
1821
1819 ``storage``
1822 ``storage``
1820 -----------
1823 -----------
1821
1824
1822 Control the strategy Mercurial uses internally to store history. Options in this
1825 Control the strategy Mercurial uses internally to store history. Options in this
1823 category impact performance and repository size.
1826 category impact performance and repository size.
1824
1827
1825 ``revlog.optimize-delta-parent-choice``
1828 ``revlog.optimize-delta-parent-choice``
1826 When storing a merge revision, both parents will be equally considered as
1829 When storing a merge revision, both parents will be equally considered as
1827 a possible delta base. This results in better delta selection and improved
1830 a possible delta base. This results in better delta selection and improved
1828 revlog compression. This option is enabled by default.
1831 revlog compression. This option is enabled by default.
1829
1832
1830 Turning this option off can result in large increase of repository size for
1833 Turning this option off can result in large increase of repository size for
1831 repository with many merges.
1834 repository with many merges.
1832
1835
1833 ``server``
1836 ``server``
1834 ----------
1837 ----------
1835
1838
1836 Controls generic server settings.
1839 Controls generic server settings.
1837
1840
1838 ``bookmarks-pushkey-compat``
1841 ``bookmarks-pushkey-compat``
1839 Trigger pushkey hook when being pushed bookmark updates. This config exist
1842 Trigger pushkey hook when being pushed bookmark updates. This config exist
1840 for compatibility purpose (default to True)
1843 for compatibility purpose (default to True)
1841
1844
1842 If you use ``pushkey`` and ``pre-pushkey`` hooks to control bookmark
1845 If you use ``pushkey`` and ``pre-pushkey`` hooks to control bookmark
1843 movement we recommend you migrate them to ``txnclose-bookmark`` and
1846 movement we recommend you migrate them to ``txnclose-bookmark`` and
1844 ``pretxnclose-bookmark``.
1847 ``pretxnclose-bookmark``.
1845
1848
1846 ``compressionengines``
1849 ``compressionengines``
1847 List of compression engines and their relative priority to advertise
1850 List of compression engines and their relative priority to advertise
1848 to clients.
1851 to clients.
1849
1852
1850 The order of compression engines determines their priority, the first
1853 The order of compression engines determines their priority, the first
1851 having the highest priority. If a compression engine is not listed
1854 having the highest priority. If a compression engine is not listed
1852 here, it won't be advertised to clients.
1855 here, it won't be advertised to clients.
1853
1856
1854 If not set (the default), built-in defaults are used. Run
1857 If not set (the default), built-in defaults are used. Run
1855 :hg:`debuginstall` to list available compression engines and their
1858 :hg:`debuginstall` to list available compression engines and their
1856 default wire protocol priority.
1859 default wire protocol priority.
1857
1860
1858 Older Mercurial clients only support zlib compression and this setting
1861 Older Mercurial clients only support zlib compression and this setting
1859 has no effect for legacy clients.
1862 has no effect for legacy clients.
1860
1863
1861 ``uncompressed``
1864 ``uncompressed``
1862 Whether to allow clients to clone a repository using the
1865 Whether to allow clients to clone a repository using the
1863 uncompressed streaming protocol. This transfers about 40% more
1866 uncompressed streaming protocol. This transfers about 40% more
1864 data than a regular clone, but uses less memory and CPU on both
1867 data than a regular clone, but uses less memory and CPU on both
1865 server and client. Over a LAN (100 Mbps or better) or a very fast
1868 server and client. Over a LAN (100 Mbps or better) or a very fast
1866 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
1869 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
1867 regular clone. Over most WAN connections (anything slower than
1870 regular clone. Over most WAN connections (anything slower than
1868 about 6 Mbps), uncompressed streaming is slower, because of the
1871 about 6 Mbps), uncompressed streaming is slower, because of the
1869 extra data transfer overhead. This mode will also temporarily hold
1872 extra data transfer overhead. This mode will also temporarily hold
1870 the write lock while determining what data to transfer.
1873 the write lock while determining what data to transfer.
1871 (default: True)
1874 (default: True)
1872
1875
1873 ``uncompressedallowsecret``
1876 ``uncompressedallowsecret``
1874 Whether to allow stream clones when the repository contains secret
1877 Whether to allow stream clones when the repository contains secret
1875 changesets. (default: False)
1878 changesets. (default: False)
1876
1879
1877 ``preferuncompressed``
1880 ``preferuncompressed``
1878 When set, clients will try to use the uncompressed streaming
1881 When set, clients will try to use the uncompressed streaming
1879 protocol. (default: False)
1882 protocol. (default: False)
1880
1883
1881 ``disablefullbundle``
1884 ``disablefullbundle``
1882 When set, servers will refuse attempts to do pull-based clones.
1885 When set, servers will refuse attempts to do pull-based clones.
1883 If this option is set, ``preferuncompressed`` and/or clone bundles
1886 If this option is set, ``preferuncompressed`` and/or clone bundles
1884 are highly recommended. Partial clones will still be allowed.
1887 are highly recommended. Partial clones will still be allowed.
1885 (default: False)
1888 (default: False)
1886
1889
1887 ``streamunbundle``
1890 ``streamunbundle``
1888 When set, servers will apply data sent from the client directly,
1891 When set, servers will apply data sent from the client directly,
1889 otherwise it will be written to a temporary file first. This option
1892 otherwise it will be written to a temporary file first. This option
1890 effectively prevents concurrent pushes.
1893 effectively prevents concurrent pushes.
1891
1894
1892 ``pullbundle``
1895 ``pullbundle``
1893 When set, the server will check pullbundle.manifest for bundles
1896 When set, the server will check pullbundle.manifest for bundles
1894 covering the requested heads and common nodes. The first matching
1897 covering the requested heads and common nodes. The first matching
1895 entry will be streamed to the client.
1898 entry will be streamed to the client.
1896
1899
1897 For HTTP transport, the stream will still use zlib compression
1900 For HTTP transport, the stream will still use zlib compression
1898 for older clients.
1901 for older clients.
1899
1902
1900 ``concurrent-push-mode``
1903 ``concurrent-push-mode``
1901 Level of allowed race condition between two pushing clients.
1904 Level of allowed race condition between two pushing clients.
1902
1905
1903 - 'strict': push is abort if another client touched the repository
1906 - 'strict': push is abort if another client touched the repository
1904 while the push was preparing. (default)
1907 while the push was preparing. (default)
1905 - 'check-related': push is only aborted if it affects head that got also
1908 - 'check-related': push is only aborted if it affects head that got also
1906 affected while the push was preparing.
1909 affected while the push was preparing.
1907
1910
1908 This requires compatible client (version 4.3 and later). Old client will
1911 This requires compatible client (version 4.3 and later). Old client will
1909 use 'strict'.
1912 use 'strict'.
1910
1913
1911 ``validate``
1914 ``validate``
1912 Whether to validate the completeness of pushed changesets by
1915 Whether to validate the completeness of pushed changesets by
1913 checking that all new file revisions specified in manifests are
1916 checking that all new file revisions specified in manifests are
1914 present. (default: False)
1917 present. (default: False)
1915
1918
1916 ``maxhttpheaderlen``
1919 ``maxhttpheaderlen``
1917 Instruct HTTP clients not to send request headers longer than this
1920 Instruct HTTP clients not to send request headers longer than this
1918 many bytes. (default: 1024)
1921 many bytes. (default: 1024)
1919
1922
1920 ``bundle1``
1923 ``bundle1``
1921 Whether to allow clients to push and pull using the legacy bundle1
1924 Whether to allow clients to push and pull using the legacy bundle1
1922 exchange format. (default: True)
1925 exchange format. (default: True)
1923
1926
1924 ``bundle1gd``
1927 ``bundle1gd``
1925 Like ``bundle1`` but only used if the repository is using the
1928 Like ``bundle1`` but only used if the repository is using the
1926 *generaldelta* storage format. (default: True)
1929 *generaldelta* storage format. (default: True)
1927
1930
1928 ``bundle1.push``
1931 ``bundle1.push``
1929 Whether to allow clients to push using the legacy bundle1 exchange
1932 Whether to allow clients to push using the legacy bundle1 exchange
1930 format. (default: True)
1933 format. (default: True)
1931
1934
1932 ``bundle1gd.push``
1935 ``bundle1gd.push``
1933 Like ``bundle1.push`` but only used if the repository is using the
1936 Like ``bundle1.push`` but only used if the repository is using the
1934 *generaldelta* storage format. (default: True)
1937 *generaldelta* storage format. (default: True)
1935
1938
1936 ``bundle1.pull``
1939 ``bundle1.pull``
1937 Whether to allow clients to pull using the legacy bundle1 exchange
1940 Whether to allow clients to pull using the legacy bundle1 exchange
1938 format. (default: True)
1941 format. (default: True)
1939
1942
1940 ``bundle1gd.pull``
1943 ``bundle1gd.pull``
1941 Like ``bundle1.pull`` but only used if the repository is using the
1944 Like ``bundle1.pull`` but only used if the repository is using the
1942 *generaldelta* storage format. (default: True)
1945 *generaldelta* storage format. (default: True)
1943
1946
1944 Large repositories using the *generaldelta* storage format should
1947 Large repositories using the *generaldelta* storage format should
1945 consider setting this option because converting *generaldelta*
1948 consider setting this option because converting *generaldelta*
1946 repositories to the exchange format required by the bundle1 data
1949 repositories to the exchange format required by the bundle1 data
1947 format can consume a lot of CPU.
1950 format can consume a lot of CPU.
1948
1951
1949 ``bundle2.stream``
1952 ``bundle2.stream``
1950 Whether to allow clients to pull using the bundle2 streaming protocol.
1953 Whether to allow clients to pull using the bundle2 streaming protocol.
1951 (default: True)
1954 (default: True)
1952
1955
1953 ``zliblevel``
1956 ``zliblevel``
1954 Integer between ``-1`` and ``9`` that controls the zlib compression level
1957 Integer between ``-1`` and ``9`` that controls the zlib compression level
1955 for wire protocol commands that send zlib compressed output (notably the
1958 for wire protocol commands that send zlib compressed output (notably the
1956 commands that send repository history data).
1959 commands that send repository history data).
1957
1960
1958 The default (``-1``) uses the default zlib compression level, which is
1961 The default (``-1``) uses the default zlib compression level, which is
1959 likely equivalent to ``6``. ``0`` means no compression. ``9`` means
1962 likely equivalent to ``6``. ``0`` means no compression. ``9`` means
1960 maximum compression.
1963 maximum compression.
1961
1964
1962 Setting this option allows server operators to make trade-offs between
1965 Setting this option allows server operators to make trade-offs between
1963 bandwidth and CPU used. Lowering the compression lowers CPU utilization
1966 bandwidth and CPU used. Lowering the compression lowers CPU utilization
1964 but sends more bytes to clients.
1967 but sends more bytes to clients.
1965
1968
1966 This option only impacts the HTTP server.
1969 This option only impacts the HTTP server.
1967
1970
1968 ``zstdlevel``
1971 ``zstdlevel``
1969 Integer between ``1`` and ``22`` that controls the zstd compression level
1972 Integer between ``1`` and ``22`` that controls the zstd compression level
1970 for wire protocol commands. ``1`` is the minimal amount of compression and
1973 for wire protocol commands. ``1`` is the minimal amount of compression and
1971 ``22`` is the highest amount of compression.
1974 ``22`` is the highest amount of compression.
1972
1975
1973 The default (``3``) should be significantly faster than zlib while likely
1976 The default (``3``) should be significantly faster than zlib while likely
1974 delivering better compression ratios.
1977 delivering better compression ratios.
1975
1978
1976 This option only impacts the HTTP server.
1979 This option only impacts the HTTP server.
1977
1980
1978 See also ``server.zliblevel``.
1981 See also ``server.zliblevel``.
1979
1982
1980 ``smtp``
1983 ``smtp``
1981 --------
1984 --------
1982
1985
1983 Configuration for extensions that need to send email messages.
1986 Configuration for extensions that need to send email messages.
1984
1987
1985 ``host``
1988 ``host``
1986 Host name of mail server, e.g. "mail.example.com".
1989 Host name of mail server, e.g. "mail.example.com".
1987
1990
1988 ``port``
1991 ``port``
1989 Optional. Port to connect to on mail server. (default: 465 if
1992 Optional. Port to connect to on mail server. (default: 465 if
1990 ``tls`` is smtps; 25 otherwise)
1993 ``tls`` is smtps; 25 otherwise)
1991
1994
1992 ``tls``
1995 ``tls``
1993 Optional. Method to enable TLS when connecting to mail server: starttls,
1996 Optional. Method to enable TLS when connecting to mail server: starttls,
1994 smtps or none. (default: none)
1997 smtps or none. (default: none)
1995
1998
1996 ``username``
1999 ``username``
1997 Optional. User name for authenticating with the SMTP server.
2000 Optional. User name for authenticating with the SMTP server.
1998 (default: None)
2001 (default: None)
1999
2002
2000 ``password``
2003 ``password``
2001 Optional. Password for authenticating with the SMTP server. If not
2004 Optional. Password for authenticating with the SMTP server. If not
2002 specified, interactive sessions will prompt the user for a
2005 specified, interactive sessions will prompt the user for a
2003 password; non-interactive sessions will fail. (default: None)
2006 password; non-interactive sessions will fail. (default: None)
2004
2007
2005 ``local_hostname``
2008 ``local_hostname``
2006 Optional. The hostname that the sender can use to identify
2009 Optional. The hostname that the sender can use to identify
2007 itself to the MTA.
2010 itself to the MTA.
2008
2011
2009
2012
2010 ``subpaths``
2013 ``subpaths``
2011 ------------
2014 ------------
2012
2015
2013 Subrepository source URLs can go stale if a remote server changes name
2016 Subrepository source URLs can go stale if a remote server changes name
2014 or becomes temporarily unavailable. This section lets you define
2017 or becomes temporarily unavailable. This section lets you define
2015 rewrite rules of the form::
2018 rewrite rules of the form::
2016
2019
2017 <pattern> = <replacement>
2020 <pattern> = <replacement>
2018
2021
2019 where ``pattern`` is a regular expression matching a subrepository
2022 where ``pattern`` is a regular expression matching a subrepository
2020 source URL and ``replacement`` is the replacement string used to
2023 source URL and ``replacement`` is the replacement string used to
2021 rewrite it. Groups can be matched in ``pattern`` and referenced in
2024 rewrite it. Groups can be matched in ``pattern`` and referenced in
2022 ``replacements``. For instance::
2025 ``replacements``. For instance::
2023
2026
2024 http://server/(.*)-hg/ = http://hg.server/\1/
2027 http://server/(.*)-hg/ = http://hg.server/\1/
2025
2028
2026 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
2029 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
2027
2030
2028 Relative subrepository paths are first made absolute, and the
2031 Relative subrepository paths are first made absolute, and the
2029 rewrite rules are then applied on the full (absolute) path. If ``pattern``
2032 rewrite rules are then applied on the full (absolute) path. If ``pattern``
2030 doesn't match the full path, an attempt is made to apply it on the
2033 doesn't match the full path, an attempt is made to apply it on the
2031 relative path alone. The rules are applied in definition order.
2034 relative path alone. The rules are applied in definition order.
2032
2035
2033 ``subrepos``
2036 ``subrepos``
2034 ------------
2037 ------------
2035
2038
2036 This section contains options that control the behavior of the
2039 This section contains options that control the behavior of the
2037 subrepositories feature. See also :hg:`help subrepos`.
2040 subrepositories feature. See also :hg:`help subrepos`.
2038
2041
2039 Security note: auditing in Mercurial is known to be insufficient to
2042 Security note: auditing in Mercurial is known to be insufficient to
2040 prevent clone-time code execution with carefully constructed Git
2043 prevent clone-time code execution with carefully constructed Git
2041 subrepos. It is unknown if a similar detect is present in Subversion
2044 subrepos. It is unknown if a similar detect is present in Subversion
2042 subrepos. Both Git and Subversion subrepos are disabled by default
2045 subrepos. Both Git and Subversion subrepos are disabled by default
2043 out of security concerns. These subrepo types can be enabled using
2046 out of security concerns. These subrepo types can be enabled using
2044 the respective options below.
2047 the respective options below.
2045
2048
2046 ``allowed``
2049 ``allowed``
2047 Whether subrepositories are allowed in the working directory.
2050 Whether subrepositories are allowed in the working directory.
2048
2051
2049 When false, commands involving subrepositories (like :hg:`update`)
2052 When false, commands involving subrepositories (like :hg:`update`)
2050 will fail for all subrepository types.
2053 will fail for all subrepository types.
2051 (default: true)
2054 (default: true)
2052
2055
2053 ``hg:allowed``
2056 ``hg:allowed``
2054 Whether Mercurial subrepositories are allowed in the working
2057 Whether Mercurial subrepositories are allowed in the working
2055 directory. This option only has an effect if ``subrepos.allowed``
2058 directory. This option only has an effect if ``subrepos.allowed``
2056 is true.
2059 is true.
2057 (default: true)
2060 (default: true)
2058
2061
2059 ``git:allowed``
2062 ``git:allowed``
2060 Whether Git subrepositories are allowed in the working directory.
2063 Whether Git subrepositories are allowed in the working directory.
2061 This option only has an effect if ``subrepos.allowed`` is true.
2064 This option only has an effect if ``subrepos.allowed`` is true.
2062
2065
2063 See the security note above before enabling Git subrepos.
2066 See the security note above before enabling Git subrepos.
2064 (default: false)
2067 (default: false)
2065
2068
2066 ``svn:allowed``
2069 ``svn:allowed``
2067 Whether Subversion subrepositories are allowed in the working
2070 Whether Subversion subrepositories are allowed in the working
2068 directory. This option only has an effect if ``subrepos.allowed``
2071 directory. This option only has an effect if ``subrepos.allowed``
2069 is true.
2072 is true.
2070
2073
2071 See the security note above before enabling Subversion subrepos.
2074 See the security note above before enabling Subversion subrepos.
2072 (default: false)
2075 (default: false)
2073
2076
2074 ``templatealias``
2077 ``templatealias``
2075 -----------------
2078 -----------------
2076
2079
2077 Alias definitions for templates. See :hg:`help templates` for details.
2080 Alias definitions for templates. See :hg:`help templates` for details.
2078
2081
2079 ``templates``
2082 ``templates``
2080 -------------
2083 -------------
2081
2084
2082 Use the ``[templates]`` section to define template strings.
2085 Use the ``[templates]`` section to define template strings.
2083 See :hg:`help templates` for details.
2086 See :hg:`help templates` for details.
2084
2087
2085 ``trusted``
2088 ``trusted``
2086 -----------
2089 -----------
2087
2090
2088 Mercurial will not use the settings in the
2091 Mercurial will not use the settings in the
2089 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
2092 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
2090 user or to a trusted group, as various hgrc features allow arbitrary
2093 user or to a trusted group, as various hgrc features allow arbitrary
2091 commands to be run. This issue is often encountered when configuring
2094 commands to be run. This issue is often encountered when configuring
2092 hooks or extensions for shared repositories or servers. However,
2095 hooks or extensions for shared repositories or servers. However,
2093 the web interface will use some safe settings from the ``[web]``
2096 the web interface will use some safe settings from the ``[web]``
2094 section.
2097 section.
2095
2098
2096 This section specifies what users and groups are trusted. The
2099 This section specifies what users and groups are trusted. The
2097 current user is always trusted. To trust everybody, list a user or a
2100 current user is always trusted. To trust everybody, list a user or a
2098 group with name ``*``. These settings must be placed in an
2101 group with name ``*``. These settings must be placed in an
2099 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
2102 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
2100 user or service running Mercurial.
2103 user or service running Mercurial.
2101
2104
2102 ``users``
2105 ``users``
2103 Comma-separated list of trusted users.
2106 Comma-separated list of trusted users.
2104
2107
2105 ``groups``
2108 ``groups``
2106 Comma-separated list of trusted groups.
2109 Comma-separated list of trusted groups.
2107
2110
2108
2111
2109 ``ui``
2112 ``ui``
2110 ------
2113 ------
2111
2114
2112 User interface controls.
2115 User interface controls.
2113
2116
2114 ``archivemeta``
2117 ``archivemeta``
2115 Whether to include the .hg_archival.txt file containing meta data
2118 Whether to include the .hg_archival.txt file containing meta data
2116 (hashes for the repository base and for tip) in archives created
2119 (hashes for the repository base and for tip) in archives created
2117 by the :hg:`archive` command or downloaded via hgweb.
2120 by the :hg:`archive` command or downloaded via hgweb.
2118 (default: True)
2121 (default: True)
2119
2122
2120 ``askusername``
2123 ``askusername``
2121 Whether to prompt for a username when committing. If True, and
2124 Whether to prompt for a username when committing. If True, and
2122 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
2125 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
2123 be prompted to enter a username. If no username is entered, the
2126 be prompted to enter a username. If no username is entered, the
2124 default ``USER@HOST`` is used instead.
2127 default ``USER@HOST`` is used instead.
2125 (default: False)
2128 (default: False)
2126
2129
2127 ``clonebundles``
2130 ``clonebundles``
2128 Whether the "clone bundles" feature is enabled.
2131 Whether the "clone bundles" feature is enabled.
2129
2132
2130 When enabled, :hg:`clone` may download and apply a server-advertised
2133 When enabled, :hg:`clone` may download and apply a server-advertised
2131 bundle file from a URL instead of using the normal exchange mechanism.
2134 bundle file from a URL instead of using the normal exchange mechanism.
2132
2135
2133 This can likely result in faster and more reliable clones.
2136 This can likely result in faster and more reliable clones.
2134
2137
2135 (default: True)
2138 (default: True)
2136
2139
2137 ``clonebundlefallback``
2140 ``clonebundlefallback``
2138 Whether failure to apply an advertised "clone bundle" from a server
2141 Whether failure to apply an advertised "clone bundle" from a server
2139 should result in fallback to a regular clone.
2142 should result in fallback to a regular clone.
2140
2143
2141 This is disabled by default because servers advertising "clone
2144 This is disabled by default because servers advertising "clone
2142 bundles" often do so to reduce server load. If advertised bundles
2145 bundles" often do so to reduce server load. If advertised bundles
2143 start mass failing and clients automatically fall back to a regular
2146 start mass failing and clients automatically fall back to a regular
2144 clone, this would add significant and unexpected load to the server
2147 clone, this would add significant and unexpected load to the server
2145 since the server is expecting clone operations to be offloaded to
2148 since the server is expecting clone operations to be offloaded to
2146 pre-generated bundles. Failing fast (the default behavior) ensures
2149 pre-generated bundles. Failing fast (the default behavior) ensures
2147 clients don't overwhelm the server when "clone bundle" application
2150 clients don't overwhelm the server when "clone bundle" application
2148 fails.
2151 fails.
2149
2152
2150 (default: False)
2153 (default: False)
2151
2154
2152 ``clonebundleprefers``
2155 ``clonebundleprefers``
2153 Defines preferences for which "clone bundles" to use.
2156 Defines preferences for which "clone bundles" to use.
2154
2157
2155 Servers advertising "clone bundles" may advertise multiple available
2158 Servers advertising "clone bundles" may advertise multiple available
2156 bundles. Each bundle may have different attributes, such as the bundle
2159 bundles. Each bundle may have different attributes, such as the bundle
2157 type and compression format. This option is used to prefer a particular
2160 type and compression format. This option is used to prefer a particular
2158 bundle over another.
2161 bundle over another.
2159
2162
2160 The following keys are defined by Mercurial:
2163 The following keys are defined by Mercurial:
2161
2164
2162 BUNDLESPEC
2165 BUNDLESPEC
2163 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
2166 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
2164 e.g. ``gzip-v2`` or ``bzip2-v1``.
2167 e.g. ``gzip-v2`` or ``bzip2-v1``.
2165
2168
2166 COMPRESSION
2169 COMPRESSION
2167 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
2170 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
2168
2171
2169 Server operators may define custom keys.
2172 Server operators may define custom keys.
2170
2173
2171 Example values: ``COMPRESSION=bzip2``,
2174 Example values: ``COMPRESSION=bzip2``,
2172 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
2175 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
2173
2176
2174 By default, the first bundle advertised by the server is used.
2177 By default, the first bundle advertised by the server is used.
2175
2178
2176 ``color``
2179 ``color``
2177 When to colorize output. Possible value are Boolean ("yes" or "no"), or
2180 When to colorize output. Possible value are Boolean ("yes" or "no"), or
2178 "debug", or "always". (default: "yes"). "yes" will use color whenever it
2181 "debug", or "always". (default: "yes"). "yes" will use color whenever it
2179 seems possible. See :hg:`help color` for details.
2182 seems possible. See :hg:`help color` for details.
2180
2183
2181 ``commitsubrepos``
2184 ``commitsubrepos``
2182 Whether to commit modified subrepositories when committing the
2185 Whether to commit modified subrepositories when committing the
2183 parent repository. If False and one subrepository has uncommitted
2186 parent repository. If False and one subrepository has uncommitted
2184 changes, abort the commit.
2187 changes, abort the commit.
2185 (default: False)
2188 (default: False)
2186
2189
2187 ``debug``
2190 ``debug``
2188 Print debugging information. (default: False)
2191 Print debugging information. (default: False)
2189
2192
2190 ``editor``
2193 ``editor``
2191 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
2194 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
2192
2195
2193 ``fallbackencoding``
2196 ``fallbackencoding``
2194 Encoding to try if it's not possible to decode the changelog using
2197 Encoding to try if it's not possible to decode the changelog using
2195 UTF-8. (default: ISO-8859-1)
2198 UTF-8. (default: ISO-8859-1)
2196
2199
2197 ``graphnodetemplate``
2200 ``graphnodetemplate``
2198 The template used to print changeset nodes in an ASCII revision graph.
2201 The template used to print changeset nodes in an ASCII revision graph.
2199 (default: ``{graphnode}``)
2202 (default: ``{graphnode}``)
2200
2203
2201 ``ignore``
2204 ``ignore``
2202 A file to read per-user ignore patterns from. This file should be
2205 A file to read per-user ignore patterns from. This file should be
2203 in the same format as a repository-wide .hgignore file. Filenames
2206 in the same format as a repository-wide .hgignore file. Filenames
2204 are relative to the repository root. This option supports hook syntax,
2207 are relative to the repository root. This option supports hook syntax,
2205 so if you want to specify multiple ignore files, you can do so by
2208 so if you want to specify multiple ignore files, you can do so by
2206 setting something like ``ignore.other = ~/.hgignore2``. For details
2209 setting something like ``ignore.other = ~/.hgignore2``. For details
2207 of the ignore file format, see the ``hgignore(5)`` man page.
2210 of the ignore file format, see the ``hgignore(5)`` man page.
2208
2211
2209 ``interactive``
2212 ``interactive``
2210 Allow to prompt the user. (default: True)
2213 Allow to prompt the user. (default: True)
2211
2214
2212 ``interface``
2215 ``interface``
2213 Select the default interface for interactive features (default: text).
2216 Select the default interface for interactive features (default: text).
2214 Possible values are 'text' and 'curses'.
2217 Possible values are 'text' and 'curses'.
2215
2218
2216 ``interface.chunkselector``
2219 ``interface.chunkselector``
2217 Select the interface for change recording (e.g. :hg:`commit -i`).
2220 Select the interface for change recording (e.g. :hg:`commit -i`).
2218 Possible values are 'text' and 'curses'.
2221 Possible values are 'text' and 'curses'.
2219 This config overrides the interface specified by ui.interface.
2222 This config overrides the interface specified by ui.interface.
2220
2223
2221 ``large-file-limit``
2224 ``large-file-limit``
2222 Largest file size that gives no memory use warning.
2225 Largest file size that gives no memory use warning.
2223 Possible values are integers or 0 to disable the check.
2226 Possible values are integers or 0 to disable the check.
2224 (default: 10000000)
2227 (default: 10000000)
2225
2228
2226 ``logtemplate``
2229 ``logtemplate``
2227 Template string for commands that print changesets.
2230 Template string for commands that print changesets.
2228
2231
2229 ``merge``
2232 ``merge``
2230 The conflict resolution program to use during a manual merge.
2233 The conflict resolution program to use during a manual merge.
2231 For more information on merge tools see :hg:`help merge-tools`.
2234 For more information on merge tools see :hg:`help merge-tools`.
2232 For configuring merge tools see the ``[merge-tools]`` section.
2235 For configuring merge tools see the ``[merge-tools]`` section.
2233
2236
2234 ``mergemarkers``
2237 ``mergemarkers``
2235 Sets the merge conflict marker label styling. The ``detailed``
2238 Sets the merge conflict marker label styling. The ``detailed``
2236 style uses the ``mergemarkertemplate`` setting to style the labels.
2239 style uses the ``mergemarkertemplate`` setting to style the labels.
2237 The ``basic`` style just uses 'local' and 'other' as the marker label.
2240 The ``basic`` style just uses 'local' and 'other' as the marker label.
2238 One of ``basic`` or ``detailed``.
2241 One of ``basic`` or ``detailed``.
2239 (default: ``basic``)
2242 (default: ``basic``)
2240
2243
2241 ``mergemarkertemplate``
2244 ``mergemarkertemplate``
2242 The template used to print the commit description next to each conflict
2245 The template used to print the commit description next to each conflict
2243 marker during merge conflicts. See :hg:`help templates` for the template
2246 marker during merge conflicts. See :hg:`help templates` for the template
2244 format.
2247 format.
2245
2248
2246 Defaults to showing the hash, tags, branches, bookmarks, author, and
2249 Defaults to showing the hash, tags, branches, bookmarks, author, and
2247 the first line of the commit description.
2250 the first line of the commit description.
2248
2251
2249 If you use non-ASCII characters in names for tags, branches, bookmarks,
2252 If you use non-ASCII characters in names for tags, branches, bookmarks,
2250 authors, and/or commit descriptions, you must pay attention to encodings of
2253 authors, and/or commit descriptions, you must pay attention to encodings of
2251 managed files. At template expansion, non-ASCII characters use the encoding
2254 managed files. At template expansion, non-ASCII characters use the encoding
2252 specified by the ``--encoding`` global option, ``HGENCODING`` or other
2255 specified by the ``--encoding`` global option, ``HGENCODING`` or other
2253 environment variables that govern your locale. If the encoding of the merge
2256 environment variables that govern your locale. If the encoding of the merge
2254 markers is different from the encoding of the merged files,
2257 markers is different from the encoding of the merged files,
2255 serious problems may occur.
2258 serious problems may occur.
2256
2259
2257 Can be overridden per-merge-tool, see the ``[merge-tools]`` section.
2260 Can be overridden per-merge-tool, see the ``[merge-tools]`` section.
2258
2261
2259 ``message-output``
2262 ``message-output``
2260 Where to write status and error messages. (default: ``stdio``)
2263 Where to write status and error messages. (default: ``stdio``)
2261
2264
2262 ``stderr``
2265 ``stderr``
2263 Everything to stderr.
2266 Everything to stderr.
2264 ``stdio``
2267 ``stdio``
2265 Status to stdout, and error to stderr.
2268 Status to stdout, and error to stderr.
2266
2269
2267 ``origbackuppath``
2270 ``origbackuppath``
2268 The path to a directory used to store generated .orig files. If the path is
2271 The path to a directory used to store generated .orig files. If the path is
2269 not a directory, one will be created. If set, files stored in this
2272 not a directory, one will be created. If set, files stored in this
2270 directory have the same name as the original file and do not have a .orig
2273 directory have the same name as the original file and do not have a .orig
2271 suffix.
2274 suffix.
2272
2275
2273 ``paginate``
2276 ``paginate``
2274 Control the pagination of command output (default: True). See :hg:`help pager`
2277 Control the pagination of command output (default: True). See :hg:`help pager`
2275 for details.
2278 for details.
2276
2279
2277 ``patch``
2280 ``patch``
2278 An optional external tool that ``hg import`` and some extensions
2281 An optional external tool that ``hg import`` and some extensions
2279 will use for applying patches. By default Mercurial uses an
2282 will use for applying patches. By default Mercurial uses an
2280 internal patch utility. The external tool must work as the common
2283 internal patch utility. The external tool must work as the common
2281 Unix ``patch`` program. In particular, it must accept a ``-p``
2284 Unix ``patch`` program. In particular, it must accept a ``-p``
2282 argument to strip patch headers, a ``-d`` argument to specify the
2285 argument to strip patch headers, a ``-d`` argument to specify the
2283 current directory, a file name to patch, and a patch file to take
2286 current directory, a file name to patch, and a patch file to take
2284 from stdin.
2287 from stdin.
2285
2288
2286 It is possible to specify a patch tool together with extra
2289 It is possible to specify a patch tool together with extra
2287 arguments. For example, setting this option to ``patch --merge``
2290 arguments. For example, setting this option to ``patch --merge``
2288 will use the ``patch`` program with its 2-way merge option.
2291 will use the ``patch`` program with its 2-way merge option.
2289
2292
2290 ``portablefilenames``
2293 ``portablefilenames``
2291 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
2294 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
2292 (default: ``warn``)
2295 (default: ``warn``)
2293
2296
2294 ``warn``
2297 ``warn``
2295 Print a warning message on POSIX platforms, if a file with a non-portable
2298 Print a warning message on POSIX platforms, if a file with a non-portable
2296 filename is added (e.g. a file with a name that can't be created on
2299 filename is added (e.g. a file with a name that can't be created on
2297 Windows because it contains reserved parts like ``AUX``, reserved
2300 Windows because it contains reserved parts like ``AUX``, reserved
2298 characters like ``:``, or would cause a case collision with an existing
2301 characters like ``:``, or would cause a case collision with an existing
2299 file).
2302 file).
2300
2303
2301 ``ignore``
2304 ``ignore``
2302 Don't print a warning.
2305 Don't print a warning.
2303
2306
2304 ``abort``
2307 ``abort``
2305 The command is aborted.
2308 The command is aborted.
2306
2309
2307 ``true``
2310 ``true``
2308 Alias for ``warn``.
2311 Alias for ``warn``.
2309
2312
2310 ``false``
2313 ``false``
2311 Alias for ``ignore``.
2314 Alias for ``ignore``.
2312
2315
2313 .. container:: windows
2316 .. container:: windows
2314
2317
2315 On Windows, this configuration option is ignored and the command aborted.
2318 On Windows, this configuration option is ignored and the command aborted.
2316
2319
2317 ``pre-merge-tool-output-template``
2320 ``pre-merge-tool-output-template``
2318 A template that is printed before executing an external merge tool. This can
2321 A template that is printed before executing an external merge tool. This can
2319 be used to print out additional context that might be useful to have during
2322 be used to print out additional context that might be useful to have during
2320 the conflict resolution, such as the description of the various commits
2323 the conflict resolution, such as the description of the various commits
2321 involved or bookmarks/tags.
2324 involved or bookmarks/tags.
2322
2325
2323 Additional information is available in the ``local`, ``base``, and ``other``
2326 Additional information is available in the ``local`, ``base``, and ``other``
2324 dicts. For example: ``{local.label}``, ``{base.name}``, or
2327 dicts. For example: ``{local.label}``, ``{base.name}``, or
2325 ``{other.islink}``.
2328 ``{other.islink}``.
2326
2329
2327 ``quiet``
2330 ``quiet``
2328 Reduce the amount of output printed.
2331 Reduce the amount of output printed.
2329 (default: False)
2332 (default: False)
2330
2333
2331 ``remotecmd``
2334 ``remotecmd``
2332 Remote command to use for clone/push/pull operations.
2335 Remote command to use for clone/push/pull operations.
2333 (default: ``hg``)
2336 (default: ``hg``)
2334
2337
2335 ``report_untrusted``
2338 ``report_untrusted``
2336 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
2339 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
2337 trusted user or group.
2340 trusted user or group.
2338 (default: True)
2341 (default: True)
2339
2342
2340 ``slash``
2343 ``slash``
2341 (Deprecated. Use ``slashpath`` template filter instead.)
2344 (Deprecated. Use ``slashpath`` template filter instead.)
2342
2345
2343 Display paths using a slash (``/``) as the path separator. This
2346 Display paths using a slash (``/``) as the path separator. This
2344 only makes a difference on systems where the default path
2347 only makes a difference on systems where the default path
2345 separator is not the slash character (e.g. Windows uses the
2348 separator is not the slash character (e.g. Windows uses the
2346 backslash character (``\``)).
2349 backslash character (``\``)).
2347 (default: False)
2350 (default: False)
2348
2351
2349 ``statuscopies``
2352 ``statuscopies``
2350 Display copies in the status command.
2353 Display copies in the status command.
2351
2354
2352 ``ssh``
2355 ``ssh``
2353 Command to use for SSH connections. (default: ``ssh``)
2356 Command to use for SSH connections. (default: ``ssh``)
2354
2357
2355 ``ssherrorhint``
2358 ``ssherrorhint``
2356 A hint shown to the user in the case of SSH error (e.g.
2359 A hint shown to the user in the case of SSH error (e.g.
2357 ``Please see http://company/internalwiki/ssh.html``)
2360 ``Please see http://company/internalwiki/ssh.html``)
2358
2361
2359 ``strict``
2362 ``strict``
2360 Require exact command names, instead of allowing unambiguous
2363 Require exact command names, instead of allowing unambiguous
2361 abbreviations. (default: False)
2364 abbreviations. (default: False)
2362
2365
2363 ``style``
2366 ``style``
2364 Name of style to use for command output.
2367 Name of style to use for command output.
2365
2368
2366 ``supportcontact``
2369 ``supportcontact``
2367 A URL where users should report a Mercurial traceback. Use this if you are a
2370 A URL where users should report a Mercurial traceback. Use this if you are a
2368 large organisation with its own Mercurial deployment process and crash
2371 large organisation with its own Mercurial deployment process and crash
2369 reports should be addressed to your internal support.
2372 reports should be addressed to your internal support.
2370
2373
2371 ``textwidth``
2374 ``textwidth``
2372 Maximum width of help text. A longer line generated by ``hg help`` or
2375 Maximum width of help text. A longer line generated by ``hg help`` or
2373 ``hg subcommand --help`` will be broken after white space to get this
2376 ``hg subcommand --help`` will be broken after white space to get this
2374 width or the terminal width, whichever comes first.
2377 width or the terminal width, whichever comes first.
2375 A non-positive value will disable this and the terminal width will be
2378 A non-positive value will disable this and the terminal width will be
2376 used. (default: 78)
2379 used. (default: 78)
2377
2380
2378 ``timeout``
2381 ``timeout``
2379 The timeout used when a lock is held (in seconds), a negative value
2382 The timeout used when a lock is held (in seconds), a negative value
2380 means no timeout. (default: 600)
2383 means no timeout. (default: 600)
2381
2384
2382 ``timeout.warn``
2385 ``timeout.warn``
2383 Time (in seconds) before a warning is printed about held lock. A negative
2386 Time (in seconds) before a warning is printed about held lock. A negative
2384 value means no warning. (default: 0)
2387 value means no warning. (default: 0)
2385
2388
2386 ``traceback``
2389 ``traceback``
2387 Mercurial always prints a traceback when an unknown exception
2390 Mercurial always prints a traceback when an unknown exception
2388 occurs. Setting this to True will make Mercurial print a traceback
2391 occurs. Setting this to True will make Mercurial print a traceback
2389 on all exceptions, even those recognized by Mercurial (such as
2392 on all exceptions, even those recognized by Mercurial (such as
2390 IOError or MemoryError). (default: False)
2393 IOError or MemoryError). (default: False)
2391
2394
2392 ``tweakdefaults``
2395 ``tweakdefaults``
2393
2396
2394 By default Mercurial's behavior changes very little from release
2397 By default Mercurial's behavior changes very little from release
2395 to release, but over time the recommended config settings
2398 to release, but over time the recommended config settings
2396 shift. Enable this config to opt in to get automatic tweaks to
2399 shift. Enable this config to opt in to get automatic tweaks to
2397 Mercurial's behavior over time. This config setting will have no
2400 Mercurial's behavior over time. This config setting will have no
2398 effect if ``HGPLAIN`` is set or ``HGPLAINEXCEPT`` is set and does
2401 effect if ``HGPLAIN`` is set or ``HGPLAINEXCEPT`` is set and does
2399 not include ``tweakdefaults``. (default: False)
2402 not include ``tweakdefaults``. (default: False)
2400
2403
2401 It currently means::
2404 It currently means::
2402
2405
2403 .. tweakdefaultsmarker
2406 .. tweakdefaultsmarker
2404
2407
2405 ``username``
2408 ``username``
2406 The committer of a changeset created when running "commit".
2409 The committer of a changeset created when running "commit".
2407 Typically a person's name and email address, e.g. ``Fred Widget
2410 Typically a person's name and email address, e.g. ``Fred Widget
2408 <fred@example.com>``. Environment variables in the
2411 <fred@example.com>``. Environment variables in the
2409 username are expanded.
2412 username are expanded.
2410
2413
2411 (default: ``$EMAIL`` or ``username@hostname``. If the username in
2414 (default: ``$EMAIL`` or ``username@hostname``. If the username in
2412 hgrc is empty, e.g. if the system admin set ``username =`` in the
2415 hgrc is empty, e.g. if the system admin set ``username =`` in the
2413 system hgrc, it has to be specified manually or in a different
2416 system hgrc, it has to be specified manually or in a different
2414 hgrc file)
2417 hgrc file)
2415
2418
2416 ``verbose``
2419 ``verbose``
2417 Increase the amount of output printed. (default: False)
2420 Increase the amount of output printed. (default: False)
2418
2421
2419
2422
2420 ``web``
2423 ``web``
2421 -------
2424 -------
2422
2425
2423 Web interface configuration. The settings in this section apply to
2426 Web interface configuration. The settings in this section apply to
2424 both the builtin webserver (started by :hg:`serve`) and the script you
2427 both the builtin webserver (started by :hg:`serve`) and the script you
2425 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
2428 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
2426 and WSGI).
2429 and WSGI).
2427
2430
2428 The Mercurial webserver does no authentication (it does not prompt for
2431 The Mercurial webserver does no authentication (it does not prompt for
2429 usernames and passwords to validate *who* users are), but it does do
2432 usernames and passwords to validate *who* users are), but it does do
2430 authorization (it grants or denies access for *authenticated users*
2433 authorization (it grants or denies access for *authenticated users*
2431 based on settings in this section). You must either configure your
2434 based on settings in this section). You must either configure your
2432 webserver to do authentication for you, or disable the authorization
2435 webserver to do authentication for you, or disable the authorization
2433 checks.
2436 checks.
2434
2437
2435 For a quick setup in a trusted environment, e.g., a private LAN, where
2438 For a quick setup in a trusted environment, e.g., a private LAN, where
2436 you want it to accept pushes from anybody, you can use the following
2439 you want it to accept pushes from anybody, you can use the following
2437 command line::
2440 command line::
2438
2441
2439 $ hg --config web.allow-push=* --config web.push_ssl=False serve
2442 $ hg --config web.allow-push=* --config web.push_ssl=False serve
2440
2443
2441 Note that this will allow anybody to push anything to the server and
2444 Note that this will allow anybody to push anything to the server and
2442 that this should not be used for public servers.
2445 that this should not be used for public servers.
2443
2446
2444 The full set of options is:
2447 The full set of options is:
2445
2448
2446 ``accesslog``
2449 ``accesslog``
2447 Where to output the access log. (default: stdout)
2450 Where to output the access log. (default: stdout)
2448
2451
2449 ``address``
2452 ``address``
2450 Interface address to bind to. (default: all)
2453 Interface address to bind to. (default: all)
2451
2454
2452 ``allow-archive``
2455 ``allow-archive``
2453 List of archive format (bz2, gz, zip) allowed for downloading.
2456 List of archive format (bz2, gz, zip) allowed for downloading.
2454 (default: empty)
2457 (default: empty)
2455
2458
2456 ``allowbz2``
2459 ``allowbz2``
2457 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
2460 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
2458 revisions.
2461 revisions.
2459 (default: False)
2462 (default: False)
2460
2463
2461 ``allowgz``
2464 ``allowgz``
2462 (DEPRECATED) Whether to allow .tar.gz downloading of repository
2465 (DEPRECATED) Whether to allow .tar.gz downloading of repository
2463 revisions.
2466 revisions.
2464 (default: False)
2467 (default: False)
2465
2468
2466 ``allow-pull``
2469 ``allow-pull``
2467 Whether to allow pulling from the repository. (default: True)
2470 Whether to allow pulling from the repository. (default: True)
2468
2471
2469 ``allow-push``
2472 ``allow-push``
2470 Whether to allow pushing to the repository. If empty or not set,
2473 Whether to allow pushing to the repository. If empty or not set,
2471 pushing is not allowed. If the special value ``*``, any remote
2474 pushing is not allowed. If the special value ``*``, any remote
2472 user can push, including unauthenticated users. Otherwise, the
2475 user can push, including unauthenticated users. Otherwise, the
2473 remote user must have been authenticated, and the authenticated
2476 remote user must have been authenticated, and the authenticated
2474 user name must be present in this list. The contents of the
2477 user name must be present in this list. The contents of the
2475 allow-push list are examined after the deny_push list.
2478 allow-push list are examined after the deny_push list.
2476
2479
2477 ``allow_read``
2480 ``allow_read``
2478 If the user has not already been denied repository access due to
2481 If the user has not already been denied repository access due to
2479 the contents of deny_read, this list determines whether to grant
2482 the contents of deny_read, this list determines whether to grant
2480 repository access to the user. If this list is not empty, and the
2483 repository access to the user. If this list is not empty, and the
2481 user is unauthenticated or not present in the list, then access is
2484 user is unauthenticated or not present in the list, then access is
2482 denied for the user. If the list is empty or not set, then access
2485 denied for the user. If the list is empty or not set, then access
2483 is permitted to all users by default. Setting allow_read to the
2486 is permitted to all users by default. Setting allow_read to the
2484 special value ``*`` is equivalent to it not being set (i.e. access
2487 special value ``*`` is equivalent to it not being set (i.e. access
2485 is permitted to all users). The contents of the allow_read list are
2488 is permitted to all users). The contents of the allow_read list are
2486 examined after the deny_read list.
2489 examined after the deny_read list.
2487
2490
2488 ``allowzip``
2491 ``allowzip``
2489 (DEPRECATED) Whether to allow .zip downloading of repository
2492 (DEPRECATED) Whether to allow .zip downloading of repository
2490 revisions. This feature creates temporary files.
2493 revisions. This feature creates temporary files.
2491 (default: False)
2494 (default: False)
2492
2495
2493 ``archivesubrepos``
2496 ``archivesubrepos``
2494 Whether to recurse into subrepositories when archiving.
2497 Whether to recurse into subrepositories when archiving.
2495 (default: False)
2498 (default: False)
2496
2499
2497 ``baseurl``
2500 ``baseurl``
2498 Base URL to use when publishing URLs in other locations, so
2501 Base URL to use when publishing URLs in other locations, so
2499 third-party tools like email notification hooks can construct
2502 third-party tools like email notification hooks can construct
2500 URLs. Example: ``http://hgserver/repos/``.
2503 URLs. Example: ``http://hgserver/repos/``.
2501
2504
2502 ``cacerts``
2505 ``cacerts``
2503 Path to file containing a list of PEM encoded certificate
2506 Path to file containing a list of PEM encoded certificate
2504 authority certificates. Environment variables and ``~user``
2507 authority certificates. Environment variables and ``~user``
2505 constructs are expanded in the filename. If specified on the
2508 constructs are expanded in the filename. If specified on the
2506 client, then it will verify the identity of remote HTTPS servers
2509 client, then it will verify the identity of remote HTTPS servers
2507 with these certificates.
2510 with these certificates.
2508
2511
2509 To disable SSL verification temporarily, specify ``--insecure`` from
2512 To disable SSL verification temporarily, specify ``--insecure`` from
2510 command line.
2513 command line.
2511
2514
2512 You can use OpenSSL's CA certificate file if your platform has
2515 You can use OpenSSL's CA certificate file if your platform has
2513 one. On most Linux systems this will be
2516 one. On most Linux systems this will be
2514 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
2517 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
2515 generate this file manually. The form must be as follows::
2518 generate this file manually. The form must be as follows::
2516
2519
2517 -----BEGIN CERTIFICATE-----
2520 -----BEGIN CERTIFICATE-----
2518 ... (certificate in base64 PEM encoding) ...
2521 ... (certificate in base64 PEM encoding) ...
2519 -----END CERTIFICATE-----
2522 -----END CERTIFICATE-----
2520 -----BEGIN CERTIFICATE-----
2523 -----BEGIN CERTIFICATE-----
2521 ... (certificate in base64 PEM encoding) ...
2524 ... (certificate in base64 PEM encoding) ...
2522 -----END CERTIFICATE-----
2525 -----END CERTIFICATE-----
2523
2526
2524 ``cache``
2527 ``cache``
2525 Whether to support caching in hgweb. (default: True)
2528 Whether to support caching in hgweb. (default: True)
2526
2529
2527 ``certificate``
2530 ``certificate``
2528 Certificate to use when running :hg:`serve`.
2531 Certificate to use when running :hg:`serve`.
2529
2532
2530 ``collapse``
2533 ``collapse``
2531 With ``descend`` enabled, repositories in subdirectories are shown at
2534 With ``descend`` enabled, repositories in subdirectories are shown at
2532 a single level alongside repositories in the current path. With
2535 a single level alongside repositories in the current path. With
2533 ``collapse`` also enabled, repositories residing at a deeper level than
2536 ``collapse`` also enabled, repositories residing at a deeper level than
2534 the current path are grouped behind navigable directory entries that
2537 the current path are grouped behind navigable directory entries that
2535 lead to the locations of these repositories. In effect, this setting
2538 lead to the locations of these repositories. In effect, this setting
2536 collapses each collection of repositories found within a subdirectory
2539 collapses each collection of repositories found within a subdirectory
2537 into a single entry for that subdirectory. (default: False)
2540 into a single entry for that subdirectory. (default: False)
2538
2541
2539 ``comparisoncontext``
2542 ``comparisoncontext``
2540 Number of lines of context to show in side-by-side file comparison. If
2543 Number of lines of context to show in side-by-side file comparison. If
2541 negative or the value ``full``, whole files are shown. (default: 5)
2544 negative or the value ``full``, whole files are shown. (default: 5)
2542
2545
2543 This setting can be overridden by a ``context`` request parameter to the
2546 This setting can be overridden by a ``context`` request parameter to the
2544 ``comparison`` command, taking the same values.
2547 ``comparison`` command, taking the same values.
2545
2548
2546 ``contact``
2549 ``contact``
2547 Name or email address of the person in charge of the repository.
2550 Name or email address of the person in charge of the repository.
2548 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
2551 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
2549
2552
2550 ``csp``
2553 ``csp``
2551 Send a ``Content-Security-Policy`` HTTP header with this value.
2554 Send a ``Content-Security-Policy`` HTTP header with this value.
2552
2555
2553 The value may contain a special string ``%nonce%``, which will be replaced
2556 The value may contain a special string ``%nonce%``, which will be replaced
2554 by a randomly-generated one-time use value. If the value contains
2557 by a randomly-generated one-time use value. If the value contains
2555 ``%nonce%``, ``web.cache`` will be disabled, as caching undermines the
2558 ``%nonce%``, ``web.cache`` will be disabled, as caching undermines the
2556 one-time property of the nonce. This nonce will also be inserted into
2559 one-time property of the nonce. This nonce will also be inserted into
2557 ``<script>`` elements containing inline JavaScript.
2560 ``<script>`` elements containing inline JavaScript.
2558
2561
2559 Note: lots of HTML content sent by the server is derived from repository
2562 Note: lots of HTML content sent by the server is derived from repository
2560 data. Please consider the potential for malicious repository data to
2563 data. Please consider the potential for malicious repository data to
2561 "inject" itself into generated HTML content as part of your security
2564 "inject" itself into generated HTML content as part of your security
2562 threat model.
2565 threat model.
2563
2566
2564 ``deny_push``
2567 ``deny_push``
2565 Whether to deny pushing to the repository. If empty or not set,
2568 Whether to deny pushing to the repository. If empty or not set,
2566 push is not denied. If the special value ``*``, all remote users are
2569 push is not denied. If the special value ``*``, all remote users are
2567 denied push. Otherwise, unauthenticated users are all denied, and
2570 denied push. Otherwise, unauthenticated users are all denied, and
2568 any authenticated user name present in this list is also denied. The
2571 any authenticated user name present in this list is also denied. The
2569 contents of the deny_push list are examined before the allow-push list.
2572 contents of the deny_push list are examined before the allow-push list.
2570
2573
2571 ``deny_read``
2574 ``deny_read``
2572 Whether to deny reading/viewing of the repository. If this list is
2575 Whether to deny reading/viewing of the repository. If this list is
2573 not empty, unauthenticated users are all denied, and any
2576 not empty, unauthenticated users are all denied, and any
2574 authenticated user name present in this list is also denied access to
2577 authenticated user name present in this list is also denied access to
2575 the repository. If set to the special value ``*``, all remote users
2578 the repository. If set to the special value ``*``, all remote users
2576 are denied access (rarely needed ;). If deny_read is empty or not set,
2579 are denied access (rarely needed ;). If deny_read is empty or not set,
2577 the determination of repository access depends on the presence and
2580 the determination of repository access depends on the presence and
2578 content of the allow_read list (see description). If both
2581 content of the allow_read list (see description). If both
2579 deny_read and allow_read are empty or not set, then access is
2582 deny_read and allow_read are empty or not set, then access is
2580 permitted to all users by default. If the repository is being
2583 permitted to all users by default. If the repository is being
2581 served via hgwebdir, denied users will not be able to see it in
2584 served via hgwebdir, denied users will not be able to see it in
2582 the list of repositories. The contents of the deny_read list have
2585 the list of repositories. The contents of the deny_read list have
2583 priority over (are examined before) the contents of the allow_read
2586 priority over (are examined before) the contents of the allow_read
2584 list.
2587 list.
2585
2588
2586 ``descend``
2589 ``descend``
2587 hgwebdir indexes will not descend into subdirectories. Only repositories
2590 hgwebdir indexes will not descend into subdirectories. Only repositories
2588 directly in the current path will be shown (other repositories are still
2591 directly in the current path will be shown (other repositories are still
2589 available from the index corresponding to their containing path).
2592 available from the index corresponding to their containing path).
2590
2593
2591 ``description``
2594 ``description``
2592 Textual description of the repository's purpose or contents.
2595 Textual description of the repository's purpose or contents.
2593 (default: "unknown")
2596 (default: "unknown")
2594
2597
2595 ``encoding``
2598 ``encoding``
2596 Character encoding name. (default: the current locale charset)
2599 Character encoding name. (default: the current locale charset)
2597 Example: "UTF-8".
2600 Example: "UTF-8".
2598
2601
2599 ``errorlog``
2602 ``errorlog``
2600 Where to output the error log. (default: stderr)
2603 Where to output the error log. (default: stderr)
2601
2604
2602 ``guessmime``
2605 ``guessmime``
2603 Control MIME types for raw download of file content.
2606 Control MIME types for raw download of file content.
2604 Set to True to let hgweb guess the content type from the file
2607 Set to True to let hgweb guess the content type from the file
2605 extension. This will serve HTML files as ``text/html`` and might
2608 extension. This will serve HTML files as ``text/html`` and might
2606 allow cross-site scripting attacks when serving untrusted
2609 allow cross-site scripting attacks when serving untrusted
2607 repositories. (default: False)
2610 repositories. (default: False)
2608
2611
2609 ``hidden``
2612 ``hidden``
2610 Whether to hide the repository in the hgwebdir index.
2613 Whether to hide the repository in the hgwebdir index.
2611 (default: False)
2614 (default: False)
2612
2615
2613 ``ipv6``
2616 ``ipv6``
2614 Whether to use IPv6. (default: False)
2617 Whether to use IPv6. (default: False)
2615
2618
2616 ``labels``
2619 ``labels``
2617 List of string *labels* associated with the repository.
2620 List of string *labels* associated with the repository.
2618
2621
2619 Labels are exposed as a template keyword and can be used to customize
2622 Labels are exposed as a template keyword and can be used to customize
2620 output. e.g. the ``index`` template can group or filter repositories
2623 output. e.g. the ``index`` template can group or filter repositories
2621 by labels and the ``summary`` template can display additional content
2624 by labels and the ``summary`` template can display additional content
2622 if a specific label is present.
2625 if a specific label is present.
2623
2626
2624 ``logoimg``
2627 ``logoimg``
2625 File name of the logo image that some templates display on each page.
2628 File name of the logo image that some templates display on each page.
2626 The file name is relative to ``staticurl``. That is, the full path to
2629 The file name is relative to ``staticurl``. That is, the full path to
2627 the logo image is "staticurl/logoimg".
2630 the logo image is "staticurl/logoimg".
2628 If unset, ``hglogo.png`` will be used.
2631 If unset, ``hglogo.png`` will be used.
2629
2632
2630 ``logourl``
2633 ``logourl``
2631 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
2634 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
2632 will be used.
2635 will be used.
2633
2636
2634 ``maxchanges``
2637 ``maxchanges``
2635 Maximum number of changes to list on the changelog. (default: 10)
2638 Maximum number of changes to list on the changelog. (default: 10)
2636
2639
2637 ``maxfiles``
2640 ``maxfiles``
2638 Maximum number of files to list per changeset. (default: 10)
2641 Maximum number of files to list per changeset. (default: 10)
2639
2642
2640 ``maxshortchanges``
2643 ``maxshortchanges``
2641 Maximum number of changes to list on the shortlog, graph or filelog
2644 Maximum number of changes to list on the shortlog, graph or filelog
2642 pages. (default: 60)
2645 pages. (default: 60)
2643
2646
2644 ``name``
2647 ``name``
2645 Repository name to use in the web interface.
2648 Repository name to use in the web interface.
2646 (default: current working directory)
2649 (default: current working directory)
2647
2650
2648 ``port``
2651 ``port``
2649 Port to listen on. (default: 8000)
2652 Port to listen on. (default: 8000)
2650
2653
2651 ``prefix``
2654 ``prefix``
2652 Prefix path to serve from. (default: '' (server root))
2655 Prefix path to serve from. (default: '' (server root))
2653
2656
2654 ``push_ssl``
2657 ``push_ssl``
2655 Whether to require that inbound pushes be transported over SSL to
2658 Whether to require that inbound pushes be transported over SSL to
2656 prevent password sniffing. (default: True)
2659 prevent password sniffing. (default: True)
2657
2660
2658 ``refreshinterval``
2661 ``refreshinterval``
2659 How frequently directory listings re-scan the filesystem for new
2662 How frequently directory listings re-scan the filesystem for new
2660 repositories, in seconds. This is relevant when wildcards are used
2663 repositories, in seconds. This is relevant when wildcards are used
2661 to define paths. Depending on how much filesystem traversal is
2664 to define paths. Depending on how much filesystem traversal is
2662 required, refreshing may negatively impact performance.
2665 required, refreshing may negatively impact performance.
2663
2666
2664 Values less than or equal to 0 always refresh.
2667 Values less than or equal to 0 always refresh.
2665 (default: 20)
2668 (default: 20)
2666
2669
2667 ``server-header``
2670 ``server-header``
2668 Value for HTTP ``Server`` response header.
2671 Value for HTTP ``Server`` response header.
2669
2672
2670 ``static``
2673 ``static``
2671 Directory where static files are served from.
2674 Directory where static files are served from.
2672
2675
2673 ``staticurl``
2676 ``staticurl``
2674 Base URL to use for static files. If unset, static files (e.g. the
2677 Base URL to use for static files. If unset, static files (e.g. the
2675 hgicon.png favicon) will be served by the CGI script itself. Use
2678 hgicon.png favicon) will be served by the CGI script itself. Use
2676 this setting to serve them directly with the HTTP server.
2679 this setting to serve them directly with the HTTP server.
2677 Example: ``http://hgserver/static/``.
2680 Example: ``http://hgserver/static/``.
2678
2681
2679 ``stripes``
2682 ``stripes``
2680 How many lines a "zebra stripe" should span in multi-line output.
2683 How many lines a "zebra stripe" should span in multi-line output.
2681 Set to 0 to disable. (default: 1)
2684 Set to 0 to disable. (default: 1)
2682
2685
2683 ``style``
2686 ``style``
2684 Which template map style to use. The available options are the names of
2687 Which template map style to use. The available options are the names of
2685 subdirectories in the HTML templates path. (default: ``paper``)
2688 subdirectories in the HTML templates path. (default: ``paper``)
2686 Example: ``monoblue``.
2689 Example: ``monoblue``.
2687
2690
2688 ``templates``
2691 ``templates``
2689 Where to find the HTML templates. The default path to the HTML templates
2692 Where to find the HTML templates. The default path to the HTML templates
2690 can be obtained from ``hg debuginstall``.
2693 can be obtained from ``hg debuginstall``.
2691
2694
2692 ``websub``
2695 ``websub``
2693 ----------
2696 ----------
2694
2697
2695 Web substitution filter definition. You can use this section to
2698 Web substitution filter definition. You can use this section to
2696 define a set of regular expression substitution patterns which
2699 define a set of regular expression substitution patterns which
2697 let you automatically modify the hgweb server output.
2700 let you automatically modify the hgweb server output.
2698
2701
2699 The default hgweb templates only apply these substitution patterns
2702 The default hgweb templates only apply these substitution patterns
2700 on the revision description fields. You can apply them anywhere
2703 on the revision description fields. You can apply them anywhere
2701 you want when you create your own templates by adding calls to the
2704 you want when you create your own templates by adding calls to the
2702 "websub" filter (usually after calling the "escape" filter).
2705 "websub" filter (usually after calling the "escape" filter).
2703
2706
2704 This can be used, for example, to convert issue references to links
2707 This can be used, for example, to convert issue references to links
2705 to your issue tracker, or to convert "markdown-like" syntax into
2708 to your issue tracker, or to convert "markdown-like" syntax into
2706 HTML (see the examples below).
2709 HTML (see the examples below).
2707
2710
2708 Each entry in this section names a substitution filter.
2711 Each entry in this section names a substitution filter.
2709 The value of each entry defines the substitution expression itself.
2712 The value of each entry defines the substitution expression itself.
2710 The websub expressions follow the old interhg extension syntax,
2713 The websub expressions follow the old interhg extension syntax,
2711 which in turn imitates the Unix sed replacement syntax::
2714 which in turn imitates the Unix sed replacement syntax::
2712
2715
2713 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
2716 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
2714
2717
2715 You can use any separator other than "/". The final "i" is optional
2718 You can use any separator other than "/". The final "i" is optional
2716 and indicates that the search must be case insensitive.
2719 and indicates that the search must be case insensitive.
2717
2720
2718 Examples::
2721 Examples::
2719
2722
2720 [websub]
2723 [websub]
2721 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
2724 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
2722 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
2725 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
2723 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
2726 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
2724
2727
2725 ``worker``
2728 ``worker``
2726 ----------
2729 ----------
2727
2730
2728 Parallel master/worker configuration. We currently perform working
2731 Parallel master/worker configuration. We currently perform working
2729 directory updates in parallel on Unix-like systems, which greatly
2732 directory updates in parallel on Unix-like systems, which greatly
2730 helps performance.
2733 helps performance.
2731
2734
2732 ``enabled``
2735 ``enabled``
2733 Whether to enable workers code to be used.
2736 Whether to enable workers code to be used.
2734 (default: true)
2737 (default: true)
2735
2738
2736 ``numcpus``
2739 ``numcpus``
2737 Number of CPUs to use for parallel operations. A zero or
2740 Number of CPUs to use for parallel operations. A zero or
2738 negative value is treated as ``use the default``.
2741 negative value is treated as ``use the default``.
2739 (default: 4 or the number of CPUs on the system, whichever is larger)
2742 (default: 4 or the number of CPUs on the system, whichever is larger)
2740
2743
2741 ``backgroundclose``
2744 ``backgroundclose``
2742 Whether to enable closing file handles on background threads during certain
2745 Whether to enable closing file handles on background threads during certain
2743 operations. Some platforms aren't very efficient at closing file
2746 operations. Some platforms aren't very efficient at closing file
2744 handles that have been written or appended to. By performing file closing
2747 handles that have been written or appended to. By performing file closing
2745 on background threads, file write rate can increase substantially.
2748 on background threads, file write rate can increase substantially.
2746 (default: true on Windows, false elsewhere)
2749 (default: true on Windows, false elsewhere)
2747
2750
2748 ``backgroundcloseminfilecount``
2751 ``backgroundcloseminfilecount``
2749 Minimum number of files required to trigger background file closing.
2752 Minimum number of files required to trigger background file closing.
2750 Operations not writing this many files won't start background close
2753 Operations not writing this many files won't start background close
2751 threads.
2754 threads.
2752 (default: 2048)
2755 (default: 2048)
2753
2756
2754 ``backgroundclosemaxqueue``
2757 ``backgroundclosemaxqueue``
2755 The maximum number of opened file handles waiting to be closed in the
2758 The maximum number of opened file handles waiting to be closed in the
2756 background. This option only has an effect if ``backgroundclose`` is
2759 background. This option only has an effect if ``backgroundclose`` is
2757 enabled.
2760 enabled.
2758 (default: 384)
2761 (default: 384)
2759
2762
2760 ``backgroundclosethreadcount``
2763 ``backgroundclosethreadcount``
2761 Number of threads to process background file closes. Only relevant if
2764 Number of threads to process background file closes. Only relevant if
2762 ``backgroundclose`` is enabled.
2765 ``backgroundclose`` is enabled.
2763 (default: 4)
2766 (default: 4)
General Comments 0
You need to be logged in to leave comments. Login now