##// END OF EJS Templates
diff: describe behavior by using --from/--to instead of varying revision count...
Martin von Zweigbergk -
r46721:ed5a0b5d default
parent child Browse files
Show More
@@ -1,7744 +1,7747 b''
1 # commands.py - command processing for mercurial
1 # commands.py - command processing for mercurial
2 #
2 #
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import errno
10 import errno
11 import os
11 import os
12 import re
12 import re
13 import sys
13 import sys
14
14
15 from .i18n import _
15 from .i18n import _
16 from .node import (
16 from .node import (
17 hex,
17 hex,
18 nullid,
18 nullid,
19 nullrev,
19 nullrev,
20 short,
20 short,
21 wdirhex,
21 wdirhex,
22 wdirrev,
22 wdirrev,
23 )
23 )
24 from .pycompat import open
24 from .pycompat import open
25 from . import (
25 from . import (
26 archival,
26 archival,
27 bookmarks,
27 bookmarks,
28 bundle2,
28 bundle2,
29 bundlecaches,
29 bundlecaches,
30 changegroup,
30 changegroup,
31 cmdutil,
31 cmdutil,
32 copies,
32 copies,
33 debugcommands as debugcommandsmod,
33 debugcommands as debugcommandsmod,
34 destutil,
34 destutil,
35 dirstateguard,
35 dirstateguard,
36 discovery,
36 discovery,
37 encoding,
37 encoding,
38 error,
38 error,
39 exchange,
39 exchange,
40 extensions,
40 extensions,
41 filemerge,
41 filemerge,
42 formatter,
42 formatter,
43 graphmod,
43 graphmod,
44 grep as grepmod,
44 grep as grepmod,
45 hbisect,
45 hbisect,
46 help,
46 help,
47 hg,
47 hg,
48 logcmdutil,
48 logcmdutil,
49 merge as mergemod,
49 merge as mergemod,
50 mergestate as mergestatemod,
50 mergestate as mergestatemod,
51 narrowspec,
51 narrowspec,
52 obsolete,
52 obsolete,
53 obsutil,
53 obsutil,
54 patch,
54 patch,
55 phases,
55 phases,
56 pycompat,
56 pycompat,
57 rcutil,
57 rcutil,
58 registrar,
58 registrar,
59 requirements,
59 requirements,
60 revsetlang,
60 revsetlang,
61 rewriteutil,
61 rewriteutil,
62 scmutil,
62 scmutil,
63 server,
63 server,
64 shelve as shelvemod,
64 shelve as shelvemod,
65 state as statemod,
65 state as statemod,
66 streamclone,
66 streamclone,
67 tags as tagsmod,
67 tags as tagsmod,
68 ui as uimod,
68 ui as uimod,
69 util,
69 util,
70 verify as verifymod,
70 verify as verifymod,
71 vfs as vfsmod,
71 vfs as vfsmod,
72 wireprotoserver,
72 wireprotoserver,
73 )
73 )
74 from .utils import (
74 from .utils import (
75 dateutil,
75 dateutil,
76 stringutil,
76 stringutil,
77 )
77 )
78
78
79 table = {}
79 table = {}
80 table.update(debugcommandsmod.command._table)
80 table.update(debugcommandsmod.command._table)
81
81
82 command = registrar.command(table)
82 command = registrar.command(table)
83 INTENT_READONLY = registrar.INTENT_READONLY
83 INTENT_READONLY = registrar.INTENT_READONLY
84
84
85 # common command options
85 # common command options
86
86
87 globalopts = [
87 globalopts = [
88 (
88 (
89 b'R',
89 b'R',
90 b'repository',
90 b'repository',
91 b'',
91 b'',
92 _(b'repository root directory or name of overlay bundle file'),
92 _(b'repository root directory or name of overlay bundle file'),
93 _(b'REPO'),
93 _(b'REPO'),
94 ),
94 ),
95 (b'', b'cwd', b'', _(b'change working directory'), _(b'DIR')),
95 (b'', b'cwd', b'', _(b'change working directory'), _(b'DIR')),
96 (
96 (
97 b'y',
97 b'y',
98 b'noninteractive',
98 b'noninteractive',
99 None,
99 None,
100 _(
100 _(
101 b'do not prompt, automatically pick the first choice for all prompts'
101 b'do not prompt, automatically pick the first choice for all prompts'
102 ),
102 ),
103 ),
103 ),
104 (b'q', b'quiet', None, _(b'suppress output')),
104 (b'q', b'quiet', None, _(b'suppress output')),
105 (b'v', b'verbose', None, _(b'enable additional output')),
105 (b'v', b'verbose', None, _(b'enable additional output')),
106 (
106 (
107 b'',
107 b'',
108 b'color',
108 b'color',
109 b'',
109 b'',
110 # i18n: 'always', 'auto', 'never', and 'debug' are keywords
110 # i18n: 'always', 'auto', 'never', and 'debug' are keywords
111 # and should not be translated
111 # and should not be translated
112 _(b"when to colorize (boolean, always, auto, never, or debug)"),
112 _(b"when to colorize (boolean, always, auto, never, or debug)"),
113 _(b'TYPE'),
113 _(b'TYPE'),
114 ),
114 ),
115 (
115 (
116 b'',
116 b'',
117 b'config',
117 b'config',
118 [],
118 [],
119 _(b'set/override config option (use \'section.name=value\')'),
119 _(b'set/override config option (use \'section.name=value\')'),
120 _(b'CONFIG'),
120 _(b'CONFIG'),
121 ),
121 ),
122 (b'', b'debug', None, _(b'enable debugging output')),
122 (b'', b'debug', None, _(b'enable debugging output')),
123 (b'', b'debugger', None, _(b'start debugger')),
123 (b'', b'debugger', None, _(b'start debugger')),
124 (
124 (
125 b'',
125 b'',
126 b'encoding',
126 b'encoding',
127 encoding.encoding,
127 encoding.encoding,
128 _(b'set the charset encoding'),
128 _(b'set the charset encoding'),
129 _(b'ENCODE'),
129 _(b'ENCODE'),
130 ),
130 ),
131 (
131 (
132 b'',
132 b'',
133 b'encodingmode',
133 b'encodingmode',
134 encoding.encodingmode,
134 encoding.encodingmode,
135 _(b'set the charset encoding mode'),
135 _(b'set the charset encoding mode'),
136 _(b'MODE'),
136 _(b'MODE'),
137 ),
137 ),
138 (b'', b'traceback', None, _(b'always print a traceback on exception')),
138 (b'', b'traceback', None, _(b'always print a traceback on exception')),
139 (b'', b'time', None, _(b'time how long the command takes')),
139 (b'', b'time', None, _(b'time how long the command takes')),
140 (b'', b'profile', None, _(b'print command execution profile')),
140 (b'', b'profile', None, _(b'print command execution profile')),
141 (b'', b'version', None, _(b'output version information and exit')),
141 (b'', b'version', None, _(b'output version information and exit')),
142 (b'h', b'help', None, _(b'display help and exit')),
142 (b'h', b'help', None, _(b'display help and exit')),
143 (b'', b'hidden', False, _(b'consider hidden changesets')),
143 (b'', b'hidden', False, _(b'consider hidden changesets')),
144 (
144 (
145 b'',
145 b'',
146 b'pager',
146 b'pager',
147 b'auto',
147 b'auto',
148 _(b"when to paginate (boolean, always, auto, or never)"),
148 _(b"when to paginate (boolean, always, auto, or never)"),
149 _(b'TYPE'),
149 _(b'TYPE'),
150 ),
150 ),
151 ]
151 ]
152
152
153 dryrunopts = cmdutil.dryrunopts
153 dryrunopts = cmdutil.dryrunopts
154 remoteopts = cmdutil.remoteopts
154 remoteopts = cmdutil.remoteopts
155 walkopts = cmdutil.walkopts
155 walkopts = cmdutil.walkopts
156 commitopts = cmdutil.commitopts
156 commitopts = cmdutil.commitopts
157 commitopts2 = cmdutil.commitopts2
157 commitopts2 = cmdutil.commitopts2
158 commitopts3 = cmdutil.commitopts3
158 commitopts3 = cmdutil.commitopts3
159 formatteropts = cmdutil.formatteropts
159 formatteropts = cmdutil.formatteropts
160 templateopts = cmdutil.templateopts
160 templateopts = cmdutil.templateopts
161 logopts = cmdutil.logopts
161 logopts = cmdutil.logopts
162 diffopts = cmdutil.diffopts
162 diffopts = cmdutil.diffopts
163 diffwsopts = cmdutil.diffwsopts
163 diffwsopts = cmdutil.diffwsopts
164 diffopts2 = cmdutil.diffopts2
164 diffopts2 = cmdutil.diffopts2
165 mergetoolopts = cmdutil.mergetoolopts
165 mergetoolopts = cmdutil.mergetoolopts
166 similarityopts = cmdutil.similarityopts
166 similarityopts = cmdutil.similarityopts
167 subrepoopts = cmdutil.subrepoopts
167 subrepoopts = cmdutil.subrepoopts
168 debugrevlogopts = cmdutil.debugrevlogopts
168 debugrevlogopts = cmdutil.debugrevlogopts
169
169
170 # Commands start here, listed alphabetically
170 # Commands start here, listed alphabetically
171
171
172
172
173 @command(
173 @command(
174 b'abort',
174 b'abort',
175 dryrunopts,
175 dryrunopts,
176 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
176 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
177 helpbasic=True,
177 helpbasic=True,
178 )
178 )
179 def abort(ui, repo, **opts):
179 def abort(ui, repo, **opts):
180 """abort an unfinished operation (EXPERIMENTAL)
180 """abort an unfinished operation (EXPERIMENTAL)
181
181
182 Aborts a multistep operation like graft, histedit, rebase, merge,
182 Aborts a multistep operation like graft, histedit, rebase, merge,
183 and unshelve if they are in an unfinished state.
183 and unshelve if they are in an unfinished state.
184
184
185 use --dry-run/-n to dry run the command.
185 use --dry-run/-n to dry run the command.
186 """
186 """
187 dryrun = opts.get('dry_run')
187 dryrun = opts.get('dry_run')
188 abortstate = cmdutil.getunfinishedstate(repo)
188 abortstate = cmdutil.getunfinishedstate(repo)
189 if not abortstate:
189 if not abortstate:
190 raise error.StateError(_(b'no operation in progress'))
190 raise error.StateError(_(b'no operation in progress'))
191 if not abortstate.abortfunc:
191 if not abortstate.abortfunc:
192 raise error.InputError(
192 raise error.InputError(
193 (
193 (
194 _(b"%s in progress but does not support 'hg abort'")
194 _(b"%s in progress but does not support 'hg abort'")
195 % (abortstate._opname)
195 % (abortstate._opname)
196 ),
196 ),
197 hint=abortstate.hint(),
197 hint=abortstate.hint(),
198 )
198 )
199 if dryrun:
199 if dryrun:
200 ui.status(
200 ui.status(
201 _(b'%s in progress, will be aborted\n') % (abortstate._opname)
201 _(b'%s in progress, will be aborted\n') % (abortstate._opname)
202 )
202 )
203 return
203 return
204 return abortstate.abortfunc(ui, repo)
204 return abortstate.abortfunc(ui, repo)
205
205
206
206
207 @command(
207 @command(
208 b'add',
208 b'add',
209 walkopts + subrepoopts + dryrunopts,
209 walkopts + subrepoopts + dryrunopts,
210 _(b'[OPTION]... [FILE]...'),
210 _(b'[OPTION]... [FILE]...'),
211 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
211 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
212 helpbasic=True,
212 helpbasic=True,
213 inferrepo=True,
213 inferrepo=True,
214 )
214 )
215 def add(ui, repo, *pats, **opts):
215 def add(ui, repo, *pats, **opts):
216 """add the specified files on the next commit
216 """add the specified files on the next commit
217
217
218 Schedule files to be version controlled and added to the
218 Schedule files to be version controlled and added to the
219 repository.
219 repository.
220
220
221 The files will be added to the repository at the next commit. To
221 The files will be added to the repository at the next commit. To
222 undo an add before that, see :hg:`forget`.
222 undo an add before that, see :hg:`forget`.
223
223
224 If no names are given, add all files to the repository (except
224 If no names are given, add all files to the repository (except
225 files matching ``.hgignore``).
225 files matching ``.hgignore``).
226
226
227 .. container:: verbose
227 .. container:: verbose
228
228
229 Examples:
229 Examples:
230
230
231 - New (unknown) files are added
231 - New (unknown) files are added
232 automatically by :hg:`add`::
232 automatically by :hg:`add`::
233
233
234 $ ls
234 $ ls
235 foo.c
235 foo.c
236 $ hg status
236 $ hg status
237 ? foo.c
237 ? foo.c
238 $ hg add
238 $ hg add
239 adding foo.c
239 adding foo.c
240 $ hg status
240 $ hg status
241 A foo.c
241 A foo.c
242
242
243 - Specific files to be added can be specified::
243 - Specific files to be added can be specified::
244
244
245 $ ls
245 $ ls
246 bar.c foo.c
246 bar.c foo.c
247 $ hg status
247 $ hg status
248 ? bar.c
248 ? bar.c
249 ? foo.c
249 ? foo.c
250 $ hg add bar.c
250 $ hg add bar.c
251 $ hg status
251 $ hg status
252 A bar.c
252 A bar.c
253 ? foo.c
253 ? foo.c
254
254
255 Returns 0 if all files are successfully added.
255 Returns 0 if all files are successfully added.
256 """
256 """
257
257
258 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
258 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
259 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
259 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
260 rejected = cmdutil.add(ui, repo, m, b"", uipathfn, False, **opts)
260 rejected = cmdutil.add(ui, repo, m, b"", uipathfn, False, **opts)
261 return rejected and 1 or 0
261 return rejected and 1 or 0
262
262
263
263
264 @command(
264 @command(
265 b'addremove',
265 b'addremove',
266 similarityopts + subrepoopts + walkopts + dryrunopts,
266 similarityopts + subrepoopts + walkopts + dryrunopts,
267 _(b'[OPTION]... [FILE]...'),
267 _(b'[OPTION]... [FILE]...'),
268 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
268 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
269 inferrepo=True,
269 inferrepo=True,
270 )
270 )
271 def addremove(ui, repo, *pats, **opts):
271 def addremove(ui, repo, *pats, **opts):
272 """add all new files, delete all missing files
272 """add all new files, delete all missing files
273
273
274 Add all new files and remove all missing files from the
274 Add all new files and remove all missing files from the
275 repository.
275 repository.
276
276
277 Unless names are given, new files are ignored if they match any of
277 Unless names are given, new files are ignored if they match any of
278 the patterns in ``.hgignore``. As with add, these changes take
278 the patterns in ``.hgignore``. As with add, these changes take
279 effect at the next commit.
279 effect at the next commit.
280
280
281 Use the -s/--similarity option to detect renamed files. This
281 Use the -s/--similarity option to detect renamed files. This
282 option takes a percentage between 0 (disabled) and 100 (files must
282 option takes a percentage between 0 (disabled) and 100 (files must
283 be identical) as its parameter. With a parameter greater than 0,
283 be identical) as its parameter. With a parameter greater than 0,
284 this compares every removed file with every added file and records
284 this compares every removed file with every added file and records
285 those similar enough as renames. Detecting renamed files this way
285 those similar enough as renames. Detecting renamed files this way
286 can be expensive. After using this option, :hg:`status -C` can be
286 can be expensive. After using this option, :hg:`status -C` can be
287 used to check which files were identified as moved or renamed. If
287 used to check which files were identified as moved or renamed. If
288 not specified, -s/--similarity defaults to 100 and only renames of
288 not specified, -s/--similarity defaults to 100 and only renames of
289 identical files are detected.
289 identical files are detected.
290
290
291 .. container:: verbose
291 .. container:: verbose
292
292
293 Examples:
293 Examples:
294
294
295 - A number of files (bar.c and foo.c) are new,
295 - A number of files (bar.c and foo.c) are new,
296 while foobar.c has been removed (without using :hg:`remove`)
296 while foobar.c has been removed (without using :hg:`remove`)
297 from the repository::
297 from the repository::
298
298
299 $ ls
299 $ ls
300 bar.c foo.c
300 bar.c foo.c
301 $ hg status
301 $ hg status
302 ! foobar.c
302 ! foobar.c
303 ? bar.c
303 ? bar.c
304 ? foo.c
304 ? foo.c
305 $ hg addremove
305 $ hg addremove
306 adding bar.c
306 adding bar.c
307 adding foo.c
307 adding foo.c
308 removing foobar.c
308 removing foobar.c
309 $ hg status
309 $ hg status
310 A bar.c
310 A bar.c
311 A foo.c
311 A foo.c
312 R foobar.c
312 R foobar.c
313
313
314 - A file foobar.c was moved to foo.c without using :hg:`rename`.
314 - A file foobar.c was moved to foo.c without using :hg:`rename`.
315 Afterwards, it was edited slightly::
315 Afterwards, it was edited slightly::
316
316
317 $ ls
317 $ ls
318 foo.c
318 foo.c
319 $ hg status
319 $ hg status
320 ! foobar.c
320 ! foobar.c
321 ? foo.c
321 ? foo.c
322 $ hg addremove --similarity 90
322 $ hg addremove --similarity 90
323 removing foobar.c
323 removing foobar.c
324 adding foo.c
324 adding foo.c
325 recording removal of foobar.c as rename to foo.c (94% similar)
325 recording removal of foobar.c as rename to foo.c (94% similar)
326 $ hg status -C
326 $ hg status -C
327 A foo.c
327 A foo.c
328 foobar.c
328 foobar.c
329 R foobar.c
329 R foobar.c
330
330
331 Returns 0 if all files are successfully added.
331 Returns 0 if all files are successfully added.
332 """
332 """
333 opts = pycompat.byteskwargs(opts)
333 opts = pycompat.byteskwargs(opts)
334 if not opts.get(b'similarity'):
334 if not opts.get(b'similarity'):
335 opts[b'similarity'] = b'100'
335 opts[b'similarity'] = b'100'
336 matcher = scmutil.match(repo[None], pats, opts)
336 matcher = scmutil.match(repo[None], pats, opts)
337 relative = scmutil.anypats(pats, opts)
337 relative = scmutil.anypats(pats, opts)
338 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative)
338 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative)
339 return scmutil.addremove(repo, matcher, b"", uipathfn, opts)
339 return scmutil.addremove(repo, matcher, b"", uipathfn, opts)
340
340
341
341
342 @command(
342 @command(
343 b'annotate|blame',
343 b'annotate|blame',
344 [
344 [
345 (b'r', b'rev', b'', _(b'annotate the specified revision'), _(b'REV')),
345 (b'r', b'rev', b'', _(b'annotate the specified revision'), _(b'REV')),
346 (
346 (
347 b'',
347 b'',
348 b'follow',
348 b'follow',
349 None,
349 None,
350 _(b'follow copies/renames and list the filename (DEPRECATED)'),
350 _(b'follow copies/renames and list the filename (DEPRECATED)'),
351 ),
351 ),
352 (b'', b'no-follow', None, _(b"don't follow copies and renames")),
352 (b'', b'no-follow', None, _(b"don't follow copies and renames")),
353 (b'a', b'text', None, _(b'treat all files as text')),
353 (b'a', b'text', None, _(b'treat all files as text')),
354 (b'u', b'user', None, _(b'list the author (long with -v)')),
354 (b'u', b'user', None, _(b'list the author (long with -v)')),
355 (b'f', b'file', None, _(b'list the filename')),
355 (b'f', b'file', None, _(b'list the filename')),
356 (b'd', b'date', None, _(b'list the date (short with -q)')),
356 (b'd', b'date', None, _(b'list the date (short with -q)')),
357 (b'n', b'number', None, _(b'list the revision number (default)')),
357 (b'n', b'number', None, _(b'list the revision number (default)')),
358 (b'c', b'changeset', None, _(b'list the changeset')),
358 (b'c', b'changeset', None, _(b'list the changeset')),
359 (
359 (
360 b'l',
360 b'l',
361 b'line-number',
361 b'line-number',
362 None,
362 None,
363 _(b'show line number at the first appearance'),
363 _(b'show line number at the first appearance'),
364 ),
364 ),
365 (
365 (
366 b'',
366 b'',
367 b'skip',
367 b'skip',
368 [],
368 [],
369 _(b'revset to not display (EXPERIMENTAL)'),
369 _(b'revset to not display (EXPERIMENTAL)'),
370 _(b'REV'),
370 _(b'REV'),
371 ),
371 ),
372 ]
372 ]
373 + diffwsopts
373 + diffwsopts
374 + walkopts
374 + walkopts
375 + formatteropts,
375 + formatteropts,
376 _(b'[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
376 _(b'[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
377 helpcategory=command.CATEGORY_FILE_CONTENTS,
377 helpcategory=command.CATEGORY_FILE_CONTENTS,
378 helpbasic=True,
378 helpbasic=True,
379 inferrepo=True,
379 inferrepo=True,
380 )
380 )
381 def annotate(ui, repo, *pats, **opts):
381 def annotate(ui, repo, *pats, **opts):
382 """show changeset information by line for each file
382 """show changeset information by line for each file
383
383
384 List changes in files, showing the revision id responsible for
384 List changes in files, showing the revision id responsible for
385 each line.
385 each line.
386
386
387 This command is useful for discovering when a change was made and
387 This command is useful for discovering when a change was made and
388 by whom.
388 by whom.
389
389
390 If you include --file, --user, or --date, the revision number is
390 If you include --file, --user, or --date, the revision number is
391 suppressed unless you also include --number.
391 suppressed unless you also include --number.
392
392
393 Without the -a/--text option, annotate will avoid processing files
393 Without the -a/--text option, annotate will avoid processing files
394 it detects as binary. With -a, annotate will annotate the file
394 it detects as binary. With -a, annotate will annotate the file
395 anyway, although the results will probably be neither useful
395 anyway, although the results will probably be neither useful
396 nor desirable.
396 nor desirable.
397
397
398 .. container:: verbose
398 .. container:: verbose
399
399
400 Template:
400 Template:
401
401
402 The following keywords are supported in addition to the common template
402 The following keywords are supported in addition to the common template
403 keywords and functions. See also :hg:`help templates`.
403 keywords and functions. See also :hg:`help templates`.
404
404
405 :lines: List of lines with annotation data.
405 :lines: List of lines with annotation data.
406 :path: String. Repository-absolute path of the specified file.
406 :path: String. Repository-absolute path of the specified file.
407
407
408 And each entry of ``{lines}`` provides the following sub-keywords in
408 And each entry of ``{lines}`` provides the following sub-keywords in
409 addition to ``{date}``, ``{node}``, ``{rev}``, ``{user}``, etc.
409 addition to ``{date}``, ``{node}``, ``{rev}``, ``{user}``, etc.
410
410
411 :line: String. Line content.
411 :line: String. Line content.
412 :lineno: Integer. Line number at that revision.
412 :lineno: Integer. Line number at that revision.
413 :path: String. Repository-absolute path of the file at that revision.
413 :path: String. Repository-absolute path of the file at that revision.
414
414
415 See :hg:`help templates.operators` for the list expansion syntax.
415 See :hg:`help templates.operators` for the list expansion syntax.
416
416
417 Returns 0 on success.
417 Returns 0 on success.
418 """
418 """
419 opts = pycompat.byteskwargs(opts)
419 opts = pycompat.byteskwargs(opts)
420 if not pats:
420 if not pats:
421 raise error.InputError(
421 raise error.InputError(
422 _(b'at least one filename or pattern is required')
422 _(b'at least one filename or pattern is required')
423 )
423 )
424
424
425 if opts.get(b'follow'):
425 if opts.get(b'follow'):
426 # --follow is deprecated and now just an alias for -f/--file
426 # --follow is deprecated and now just an alias for -f/--file
427 # to mimic the behavior of Mercurial before version 1.5
427 # to mimic the behavior of Mercurial before version 1.5
428 opts[b'file'] = True
428 opts[b'file'] = True
429
429
430 if (
430 if (
431 not opts.get(b'user')
431 not opts.get(b'user')
432 and not opts.get(b'changeset')
432 and not opts.get(b'changeset')
433 and not opts.get(b'date')
433 and not opts.get(b'date')
434 and not opts.get(b'file')
434 and not opts.get(b'file')
435 ):
435 ):
436 opts[b'number'] = True
436 opts[b'number'] = True
437
437
438 linenumber = opts.get(b'line_number') is not None
438 linenumber = opts.get(b'line_number') is not None
439 if (
439 if (
440 linenumber
440 linenumber
441 and (not opts.get(b'changeset'))
441 and (not opts.get(b'changeset'))
442 and (not opts.get(b'number'))
442 and (not opts.get(b'number'))
443 ):
443 ):
444 raise error.InputError(_(b'at least one of -n/-c is required for -l'))
444 raise error.InputError(_(b'at least one of -n/-c is required for -l'))
445
445
446 rev = opts.get(b'rev')
446 rev = opts.get(b'rev')
447 if rev:
447 if rev:
448 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
448 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
449 ctx = scmutil.revsingle(repo, rev)
449 ctx = scmutil.revsingle(repo, rev)
450
450
451 ui.pager(b'annotate')
451 ui.pager(b'annotate')
452 rootfm = ui.formatter(b'annotate', opts)
452 rootfm = ui.formatter(b'annotate', opts)
453 if ui.debugflag:
453 if ui.debugflag:
454 shorthex = pycompat.identity
454 shorthex = pycompat.identity
455 else:
455 else:
456
456
457 def shorthex(h):
457 def shorthex(h):
458 return h[:12]
458 return h[:12]
459
459
460 if ui.quiet:
460 if ui.quiet:
461 datefunc = dateutil.shortdate
461 datefunc = dateutil.shortdate
462 else:
462 else:
463 datefunc = dateutil.datestr
463 datefunc = dateutil.datestr
464 if ctx.rev() is None:
464 if ctx.rev() is None:
465 if opts.get(b'changeset'):
465 if opts.get(b'changeset'):
466 # omit "+" suffix which is appended to node hex
466 # omit "+" suffix which is appended to node hex
467 def formatrev(rev):
467 def formatrev(rev):
468 if rev == wdirrev:
468 if rev == wdirrev:
469 return b'%d' % ctx.p1().rev()
469 return b'%d' % ctx.p1().rev()
470 else:
470 else:
471 return b'%d' % rev
471 return b'%d' % rev
472
472
473 else:
473 else:
474
474
475 def formatrev(rev):
475 def formatrev(rev):
476 if rev == wdirrev:
476 if rev == wdirrev:
477 return b'%d+' % ctx.p1().rev()
477 return b'%d+' % ctx.p1().rev()
478 else:
478 else:
479 return b'%d ' % rev
479 return b'%d ' % rev
480
480
481 def formathex(h):
481 def formathex(h):
482 if h == wdirhex:
482 if h == wdirhex:
483 return b'%s+' % shorthex(hex(ctx.p1().node()))
483 return b'%s+' % shorthex(hex(ctx.p1().node()))
484 else:
484 else:
485 return b'%s ' % shorthex(h)
485 return b'%s ' % shorthex(h)
486
486
487 else:
487 else:
488 formatrev = b'%d'.__mod__
488 formatrev = b'%d'.__mod__
489 formathex = shorthex
489 formathex = shorthex
490
490
491 opmap = [
491 opmap = [
492 (b'user', b' ', lambda x: x.fctx.user(), ui.shortuser),
492 (b'user', b' ', lambda x: x.fctx.user(), ui.shortuser),
493 (b'rev', b' ', lambda x: scmutil.intrev(x.fctx), formatrev),
493 (b'rev', b' ', lambda x: scmutil.intrev(x.fctx), formatrev),
494 (b'node', b' ', lambda x: hex(scmutil.binnode(x.fctx)), formathex),
494 (b'node', b' ', lambda x: hex(scmutil.binnode(x.fctx)), formathex),
495 (b'date', b' ', lambda x: x.fctx.date(), util.cachefunc(datefunc)),
495 (b'date', b' ', lambda x: x.fctx.date(), util.cachefunc(datefunc)),
496 (b'path', b' ', lambda x: x.fctx.path(), pycompat.bytestr),
496 (b'path', b' ', lambda x: x.fctx.path(), pycompat.bytestr),
497 (b'lineno', b':', lambda x: x.lineno, pycompat.bytestr),
497 (b'lineno', b':', lambda x: x.lineno, pycompat.bytestr),
498 ]
498 ]
499 opnamemap = {
499 opnamemap = {
500 b'rev': b'number',
500 b'rev': b'number',
501 b'node': b'changeset',
501 b'node': b'changeset',
502 b'path': b'file',
502 b'path': b'file',
503 b'lineno': b'line_number',
503 b'lineno': b'line_number',
504 }
504 }
505
505
506 if rootfm.isplain():
506 if rootfm.isplain():
507
507
508 def makefunc(get, fmt):
508 def makefunc(get, fmt):
509 return lambda x: fmt(get(x))
509 return lambda x: fmt(get(x))
510
510
511 else:
511 else:
512
512
513 def makefunc(get, fmt):
513 def makefunc(get, fmt):
514 return get
514 return get
515
515
516 datahint = rootfm.datahint()
516 datahint = rootfm.datahint()
517 funcmap = [
517 funcmap = [
518 (makefunc(get, fmt), sep)
518 (makefunc(get, fmt), sep)
519 for fn, sep, get, fmt in opmap
519 for fn, sep, get, fmt in opmap
520 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
520 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
521 ]
521 ]
522 funcmap[0] = (funcmap[0][0], b'') # no separator in front of first column
522 funcmap[0] = (funcmap[0][0], b'') # no separator in front of first column
523 fields = b' '.join(
523 fields = b' '.join(
524 fn
524 fn
525 for fn, sep, get, fmt in opmap
525 for fn, sep, get, fmt in opmap
526 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
526 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
527 )
527 )
528
528
529 def bad(x, y):
529 def bad(x, y):
530 raise error.Abort(b"%s: %s" % (x, y))
530 raise error.Abort(b"%s: %s" % (x, y))
531
531
532 m = scmutil.match(ctx, pats, opts, badfn=bad)
532 m = scmutil.match(ctx, pats, opts, badfn=bad)
533
533
534 follow = not opts.get(b'no_follow')
534 follow = not opts.get(b'no_follow')
535 diffopts = patch.difffeatureopts(
535 diffopts = patch.difffeatureopts(
536 ui, opts, section=b'annotate', whitespace=True
536 ui, opts, section=b'annotate', whitespace=True
537 )
537 )
538 skiprevs = opts.get(b'skip')
538 skiprevs = opts.get(b'skip')
539 if skiprevs:
539 if skiprevs:
540 skiprevs = scmutil.revrange(repo, skiprevs)
540 skiprevs = scmutil.revrange(repo, skiprevs)
541
541
542 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
542 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
543 for abs in ctx.walk(m):
543 for abs in ctx.walk(m):
544 fctx = ctx[abs]
544 fctx = ctx[abs]
545 rootfm.startitem()
545 rootfm.startitem()
546 rootfm.data(path=abs)
546 rootfm.data(path=abs)
547 if not opts.get(b'text') and fctx.isbinary():
547 if not opts.get(b'text') and fctx.isbinary():
548 rootfm.plain(_(b"%s: binary file\n") % uipathfn(abs))
548 rootfm.plain(_(b"%s: binary file\n") % uipathfn(abs))
549 continue
549 continue
550
550
551 fm = rootfm.nested(b'lines', tmpl=b'{rev}: {line}')
551 fm = rootfm.nested(b'lines', tmpl=b'{rev}: {line}')
552 lines = fctx.annotate(
552 lines = fctx.annotate(
553 follow=follow, skiprevs=skiprevs, diffopts=diffopts
553 follow=follow, skiprevs=skiprevs, diffopts=diffopts
554 )
554 )
555 if not lines:
555 if not lines:
556 fm.end()
556 fm.end()
557 continue
557 continue
558 formats = []
558 formats = []
559 pieces = []
559 pieces = []
560
560
561 for f, sep in funcmap:
561 for f, sep in funcmap:
562 l = [f(n) for n in lines]
562 l = [f(n) for n in lines]
563 if fm.isplain():
563 if fm.isplain():
564 sizes = [encoding.colwidth(x) for x in l]
564 sizes = [encoding.colwidth(x) for x in l]
565 ml = max(sizes)
565 ml = max(sizes)
566 formats.append([sep + b' ' * (ml - w) + b'%s' for w in sizes])
566 formats.append([sep + b' ' * (ml - w) + b'%s' for w in sizes])
567 else:
567 else:
568 formats.append([b'%s'] * len(l))
568 formats.append([b'%s'] * len(l))
569 pieces.append(l)
569 pieces.append(l)
570
570
571 for f, p, n in zip(zip(*formats), zip(*pieces), lines):
571 for f, p, n in zip(zip(*formats), zip(*pieces), lines):
572 fm.startitem()
572 fm.startitem()
573 fm.context(fctx=n.fctx)
573 fm.context(fctx=n.fctx)
574 fm.write(fields, b"".join(f), *p)
574 fm.write(fields, b"".join(f), *p)
575 if n.skip:
575 if n.skip:
576 fmt = b"* %s"
576 fmt = b"* %s"
577 else:
577 else:
578 fmt = b": %s"
578 fmt = b": %s"
579 fm.write(b'line', fmt, n.text)
579 fm.write(b'line', fmt, n.text)
580
580
581 if not lines[-1].text.endswith(b'\n'):
581 if not lines[-1].text.endswith(b'\n'):
582 fm.plain(b'\n')
582 fm.plain(b'\n')
583 fm.end()
583 fm.end()
584
584
585 rootfm.end()
585 rootfm.end()
586
586
587
587
588 @command(
588 @command(
589 b'archive',
589 b'archive',
590 [
590 [
591 (b'', b'no-decode', None, _(b'do not pass files through decoders')),
591 (b'', b'no-decode', None, _(b'do not pass files through decoders')),
592 (
592 (
593 b'p',
593 b'p',
594 b'prefix',
594 b'prefix',
595 b'',
595 b'',
596 _(b'directory prefix for files in archive'),
596 _(b'directory prefix for files in archive'),
597 _(b'PREFIX'),
597 _(b'PREFIX'),
598 ),
598 ),
599 (b'r', b'rev', b'', _(b'revision to distribute'), _(b'REV')),
599 (b'r', b'rev', b'', _(b'revision to distribute'), _(b'REV')),
600 (b't', b'type', b'', _(b'type of distribution to create'), _(b'TYPE')),
600 (b't', b'type', b'', _(b'type of distribution to create'), _(b'TYPE')),
601 ]
601 ]
602 + subrepoopts
602 + subrepoopts
603 + walkopts,
603 + walkopts,
604 _(b'[OPTION]... DEST'),
604 _(b'[OPTION]... DEST'),
605 helpcategory=command.CATEGORY_IMPORT_EXPORT,
605 helpcategory=command.CATEGORY_IMPORT_EXPORT,
606 )
606 )
607 def archive(ui, repo, dest, **opts):
607 def archive(ui, repo, dest, **opts):
608 """create an unversioned archive of a repository revision
608 """create an unversioned archive of a repository revision
609
609
610 By default, the revision used is the parent of the working
610 By default, the revision used is the parent of the working
611 directory; use -r/--rev to specify a different revision.
611 directory; use -r/--rev to specify a different revision.
612
612
613 The archive type is automatically detected based on file
613 The archive type is automatically detected based on file
614 extension (to override, use -t/--type).
614 extension (to override, use -t/--type).
615
615
616 .. container:: verbose
616 .. container:: verbose
617
617
618 Examples:
618 Examples:
619
619
620 - create a zip file containing the 1.0 release::
620 - create a zip file containing the 1.0 release::
621
621
622 hg archive -r 1.0 project-1.0.zip
622 hg archive -r 1.0 project-1.0.zip
623
623
624 - create a tarball excluding .hg files::
624 - create a tarball excluding .hg files::
625
625
626 hg archive project.tar.gz -X ".hg*"
626 hg archive project.tar.gz -X ".hg*"
627
627
628 Valid types are:
628 Valid types are:
629
629
630 :``files``: a directory full of files (default)
630 :``files``: a directory full of files (default)
631 :``tar``: tar archive, uncompressed
631 :``tar``: tar archive, uncompressed
632 :``tbz2``: tar archive, compressed using bzip2
632 :``tbz2``: tar archive, compressed using bzip2
633 :``tgz``: tar archive, compressed using gzip
633 :``tgz``: tar archive, compressed using gzip
634 :``txz``: tar archive, compressed using lzma (only in Python 3)
634 :``txz``: tar archive, compressed using lzma (only in Python 3)
635 :``uzip``: zip archive, uncompressed
635 :``uzip``: zip archive, uncompressed
636 :``zip``: zip archive, compressed using deflate
636 :``zip``: zip archive, compressed using deflate
637
637
638 The exact name of the destination archive or directory is given
638 The exact name of the destination archive or directory is given
639 using a format string; see :hg:`help export` for details.
639 using a format string; see :hg:`help export` for details.
640
640
641 Each member added to an archive file has a directory prefix
641 Each member added to an archive file has a directory prefix
642 prepended. Use -p/--prefix to specify a format string for the
642 prepended. Use -p/--prefix to specify a format string for the
643 prefix. The default is the basename of the archive, with suffixes
643 prefix. The default is the basename of the archive, with suffixes
644 removed.
644 removed.
645
645
646 Returns 0 on success.
646 Returns 0 on success.
647 """
647 """
648
648
649 opts = pycompat.byteskwargs(opts)
649 opts = pycompat.byteskwargs(opts)
650 rev = opts.get(b'rev')
650 rev = opts.get(b'rev')
651 if rev:
651 if rev:
652 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
652 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
653 ctx = scmutil.revsingle(repo, rev)
653 ctx = scmutil.revsingle(repo, rev)
654 if not ctx:
654 if not ctx:
655 raise error.InputError(
655 raise error.InputError(
656 _(b'no working directory: please specify a revision')
656 _(b'no working directory: please specify a revision')
657 )
657 )
658 node = ctx.node()
658 node = ctx.node()
659 dest = cmdutil.makefilename(ctx, dest)
659 dest = cmdutil.makefilename(ctx, dest)
660 if os.path.realpath(dest) == repo.root:
660 if os.path.realpath(dest) == repo.root:
661 raise error.InputError(_(b'repository root cannot be destination'))
661 raise error.InputError(_(b'repository root cannot be destination'))
662
662
663 kind = opts.get(b'type') or archival.guesskind(dest) or b'files'
663 kind = opts.get(b'type') or archival.guesskind(dest) or b'files'
664 prefix = opts.get(b'prefix')
664 prefix = opts.get(b'prefix')
665
665
666 if dest == b'-':
666 if dest == b'-':
667 if kind == b'files':
667 if kind == b'files':
668 raise error.InputError(_(b'cannot archive plain files to stdout'))
668 raise error.InputError(_(b'cannot archive plain files to stdout'))
669 dest = cmdutil.makefileobj(ctx, dest)
669 dest = cmdutil.makefileobj(ctx, dest)
670 if not prefix:
670 if not prefix:
671 prefix = os.path.basename(repo.root) + b'-%h'
671 prefix = os.path.basename(repo.root) + b'-%h'
672
672
673 prefix = cmdutil.makefilename(ctx, prefix)
673 prefix = cmdutil.makefilename(ctx, prefix)
674 match = scmutil.match(ctx, [], opts)
674 match = scmutil.match(ctx, [], opts)
675 archival.archive(
675 archival.archive(
676 repo,
676 repo,
677 dest,
677 dest,
678 node,
678 node,
679 kind,
679 kind,
680 not opts.get(b'no_decode'),
680 not opts.get(b'no_decode'),
681 match,
681 match,
682 prefix,
682 prefix,
683 subrepos=opts.get(b'subrepos'),
683 subrepos=opts.get(b'subrepos'),
684 )
684 )
685
685
686
686
687 @command(
687 @command(
688 b'backout',
688 b'backout',
689 [
689 [
690 (
690 (
691 b'',
691 b'',
692 b'merge',
692 b'merge',
693 None,
693 None,
694 _(b'merge with old dirstate parent after backout'),
694 _(b'merge with old dirstate parent after backout'),
695 ),
695 ),
696 (
696 (
697 b'',
697 b'',
698 b'commit',
698 b'commit',
699 None,
699 None,
700 _(b'commit if no conflicts were encountered (DEPRECATED)'),
700 _(b'commit if no conflicts were encountered (DEPRECATED)'),
701 ),
701 ),
702 (b'', b'no-commit', None, _(b'do not commit')),
702 (b'', b'no-commit', None, _(b'do not commit')),
703 (
703 (
704 b'',
704 b'',
705 b'parent',
705 b'parent',
706 b'',
706 b'',
707 _(b'parent to choose when backing out merge (DEPRECATED)'),
707 _(b'parent to choose when backing out merge (DEPRECATED)'),
708 _(b'REV'),
708 _(b'REV'),
709 ),
709 ),
710 (b'r', b'rev', b'', _(b'revision to backout'), _(b'REV')),
710 (b'r', b'rev', b'', _(b'revision to backout'), _(b'REV')),
711 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
711 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
712 ]
712 ]
713 + mergetoolopts
713 + mergetoolopts
714 + walkopts
714 + walkopts
715 + commitopts
715 + commitopts
716 + commitopts2,
716 + commitopts2,
717 _(b'[OPTION]... [-r] REV'),
717 _(b'[OPTION]... [-r] REV'),
718 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
718 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
719 )
719 )
720 def backout(ui, repo, node=None, rev=None, **opts):
720 def backout(ui, repo, node=None, rev=None, **opts):
721 """reverse effect of earlier changeset
721 """reverse effect of earlier changeset
722
722
723 Prepare a new changeset with the effect of REV undone in the
723 Prepare a new changeset with the effect of REV undone in the
724 current working directory. If no conflicts were encountered,
724 current working directory. If no conflicts were encountered,
725 it will be committed immediately.
725 it will be committed immediately.
726
726
727 If REV is the parent of the working directory, then this new changeset
727 If REV is the parent of the working directory, then this new changeset
728 is committed automatically (unless --no-commit is specified).
728 is committed automatically (unless --no-commit is specified).
729
729
730 .. note::
730 .. note::
731
731
732 :hg:`backout` cannot be used to fix either an unwanted or
732 :hg:`backout` cannot be used to fix either an unwanted or
733 incorrect merge.
733 incorrect merge.
734
734
735 .. container:: verbose
735 .. container:: verbose
736
736
737 Examples:
737 Examples:
738
738
739 - Reverse the effect of the parent of the working directory.
739 - Reverse the effect of the parent of the working directory.
740 This backout will be committed immediately::
740 This backout will be committed immediately::
741
741
742 hg backout -r .
742 hg backout -r .
743
743
744 - Reverse the effect of previous bad revision 23::
744 - Reverse the effect of previous bad revision 23::
745
745
746 hg backout -r 23
746 hg backout -r 23
747
747
748 - Reverse the effect of previous bad revision 23 and
748 - Reverse the effect of previous bad revision 23 and
749 leave changes uncommitted::
749 leave changes uncommitted::
750
750
751 hg backout -r 23 --no-commit
751 hg backout -r 23 --no-commit
752 hg commit -m "Backout revision 23"
752 hg commit -m "Backout revision 23"
753
753
754 By default, the pending changeset will have one parent,
754 By default, the pending changeset will have one parent,
755 maintaining a linear history. With --merge, the pending
755 maintaining a linear history. With --merge, the pending
756 changeset will instead have two parents: the old parent of the
756 changeset will instead have two parents: the old parent of the
757 working directory and a new child of REV that simply undoes REV.
757 working directory and a new child of REV that simply undoes REV.
758
758
759 Before version 1.7, the behavior without --merge was equivalent
759 Before version 1.7, the behavior without --merge was equivalent
760 to specifying --merge followed by :hg:`update --clean .` to
760 to specifying --merge followed by :hg:`update --clean .` to
761 cancel the merge and leave the child of REV as a head to be
761 cancel the merge and leave the child of REV as a head to be
762 merged separately.
762 merged separately.
763
763
764 See :hg:`help dates` for a list of formats valid for -d/--date.
764 See :hg:`help dates` for a list of formats valid for -d/--date.
765
765
766 See :hg:`help revert` for a way to restore files to the state
766 See :hg:`help revert` for a way to restore files to the state
767 of another revision.
767 of another revision.
768
768
769 Returns 0 on success, 1 if nothing to backout or there are unresolved
769 Returns 0 on success, 1 if nothing to backout or there are unresolved
770 files.
770 files.
771 """
771 """
772 with repo.wlock(), repo.lock():
772 with repo.wlock(), repo.lock():
773 return _dobackout(ui, repo, node, rev, **opts)
773 return _dobackout(ui, repo, node, rev, **opts)
774
774
775
775
776 def _dobackout(ui, repo, node=None, rev=None, **opts):
776 def _dobackout(ui, repo, node=None, rev=None, **opts):
777 cmdutil.check_incompatible_arguments(opts, 'no_commit', ['commit', 'merge'])
777 cmdutil.check_incompatible_arguments(opts, 'no_commit', ['commit', 'merge'])
778 opts = pycompat.byteskwargs(opts)
778 opts = pycompat.byteskwargs(opts)
779
779
780 if rev and node:
780 if rev and node:
781 raise error.InputError(_(b"please specify just one revision"))
781 raise error.InputError(_(b"please specify just one revision"))
782
782
783 if not rev:
783 if not rev:
784 rev = node
784 rev = node
785
785
786 if not rev:
786 if not rev:
787 raise error.InputError(_(b"please specify a revision to backout"))
787 raise error.InputError(_(b"please specify a revision to backout"))
788
788
789 date = opts.get(b'date')
789 date = opts.get(b'date')
790 if date:
790 if date:
791 opts[b'date'] = dateutil.parsedate(date)
791 opts[b'date'] = dateutil.parsedate(date)
792
792
793 cmdutil.checkunfinished(repo)
793 cmdutil.checkunfinished(repo)
794 cmdutil.bailifchanged(repo)
794 cmdutil.bailifchanged(repo)
795 ctx = scmutil.revsingle(repo, rev)
795 ctx = scmutil.revsingle(repo, rev)
796 node = ctx.node()
796 node = ctx.node()
797
797
798 op1, op2 = repo.dirstate.parents()
798 op1, op2 = repo.dirstate.parents()
799 if not repo.changelog.isancestor(node, op1):
799 if not repo.changelog.isancestor(node, op1):
800 raise error.InputError(
800 raise error.InputError(
801 _(b'cannot backout change that is not an ancestor')
801 _(b'cannot backout change that is not an ancestor')
802 )
802 )
803
803
804 p1, p2 = repo.changelog.parents(node)
804 p1, p2 = repo.changelog.parents(node)
805 if p1 == nullid:
805 if p1 == nullid:
806 raise error.InputError(_(b'cannot backout a change with no parents'))
806 raise error.InputError(_(b'cannot backout a change with no parents'))
807 if p2 != nullid:
807 if p2 != nullid:
808 if not opts.get(b'parent'):
808 if not opts.get(b'parent'):
809 raise error.InputError(_(b'cannot backout a merge changeset'))
809 raise error.InputError(_(b'cannot backout a merge changeset'))
810 p = repo.lookup(opts[b'parent'])
810 p = repo.lookup(opts[b'parent'])
811 if p not in (p1, p2):
811 if p not in (p1, p2):
812 raise error.InputError(
812 raise error.InputError(
813 _(b'%s is not a parent of %s') % (short(p), short(node))
813 _(b'%s is not a parent of %s') % (short(p), short(node))
814 )
814 )
815 parent = p
815 parent = p
816 else:
816 else:
817 if opts.get(b'parent'):
817 if opts.get(b'parent'):
818 raise error.InputError(
818 raise error.InputError(
819 _(b'cannot use --parent on non-merge changeset')
819 _(b'cannot use --parent on non-merge changeset')
820 )
820 )
821 parent = p1
821 parent = p1
822
822
823 # the backout should appear on the same branch
823 # the backout should appear on the same branch
824 branch = repo.dirstate.branch()
824 branch = repo.dirstate.branch()
825 bheads = repo.branchheads(branch)
825 bheads = repo.branchheads(branch)
826 rctx = scmutil.revsingle(repo, hex(parent))
826 rctx = scmutil.revsingle(repo, hex(parent))
827 if not opts.get(b'merge') and op1 != node:
827 if not opts.get(b'merge') and op1 != node:
828 with dirstateguard.dirstateguard(repo, b'backout'):
828 with dirstateguard.dirstateguard(repo, b'backout'):
829 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
829 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
830 with ui.configoverride(overrides, b'backout'):
830 with ui.configoverride(overrides, b'backout'):
831 stats = mergemod.back_out(ctx, parent=repo[parent])
831 stats = mergemod.back_out(ctx, parent=repo[parent])
832 repo.setparents(op1, op2)
832 repo.setparents(op1, op2)
833 hg._showstats(repo, stats)
833 hg._showstats(repo, stats)
834 if stats.unresolvedcount:
834 if stats.unresolvedcount:
835 repo.ui.status(
835 repo.ui.status(
836 _(b"use 'hg resolve' to retry unresolved file merges\n")
836 _(b"use 'hg resolve' to retry unresolved file merges\n")
837 )
837 )
838 return 1
838 return 1
839 else:
839 else:
840 hg.clean(repo, node, show_stats=False)
840 hg.clean(repo, node, show_stats=False)
841 repo.dirstate.setbranch(branch)
841 repo.dirstate.setbranch(branch)
842 cmdutil.revert(ui, repo, rctx)
842 cmdutil.revert(ui, repo, rctx)
843
843
844 if opts.get(b'no_commit'):
844 if opts.get(b'no_commit'):
845 msg = _(b"changeset %s backed out, don't forget to commit.\n")
845 msg = _(b"changeset %s backed out, don't forget to commit.\n")
846 ui.status(msg % short(node))
846 ui.status(msg % short(node))
847 return 0
847 return 0
848
848
849 def commitfunc(ui, repo, message, match, opts):
849 def commitfunc(ui, repo, message, match, opts):
850 editform = b'backout'
850 editform = b'backout'
851 e = cmdutil.getcommiteditor(
851 e = cmdutil.getcommiteditor(
852 editform=editform, **pycompat.strkwargs(opts)
852 editform=editform, **pycompat.strkwargs(opts)
853 )
853 )
854 if not message:
854 if not message:
855 # we don't translate commit messages
855 # we don't translate commit messages
856 message = b"Backed out changeset %s" % short(node)
856 message = b"Backed out changeset %s" % short(node)
857 e = cmdutil.getcommiteditor(edit=True, editform=editform)
857 e = cmdutil.getcommiteditor(edit=True, editform=editform)
858 return repo.commit(
858 return repo.commit(
859 message, opts.get(b'user'), opts.get(b'date'), match, editor=e
859 message, opts.get(b'user'), opts.get(b'date'), match, editor=e
860 )
860 )
861
861
862 # save to detect changes
862 # save to detect changes
863 tip = repo.changelog.tip()
863 tip = repo.changelog.tip()
864
864
865 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
865 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
866 if not newnode:
866 if not newnode:
867 ui.status(_(b"nothing changed\n"))
867 ui.status(_(b"nothing changed\n"))
868 return 1
868 return 1
869 cmdutil.commitstatus(repo, newnode, branch, bheads, tip)
869 cmdutil.commitstatus(repo, newnode, branch, bheads, tip)
870
870
871 def nice(node):
871 def nice(node):
872 return b'%d:%s' % (repo.changelog.rev(node), short(node))
872 return b'%d:%s' % (repo.changelog.rev(node), short(node))
873
873
874 ui.status(
874 ui.status(
875 _(b'changeset %s backs out changeset %s\n')
875 _(b'changeset %s backs out changeset %s\n')
876 % (nice(newnode), nice(node))
876 % (nice(newnode), nice(node))
877 )
877 )
878 if opts.get(b'merge') and op1 != node:
878 if opts.get(b'merge') and op1 != node:
879 hg.clean(repo, op1, show_stats=False)
879 hg.clean(repo, op1, show_stats=False)
880 ui.status(_(b'merging with changeset %s\n') % nice(newnode))
880 ui.status(_(b'merging with changeset %s\n') % nice(newnode))
881 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
881 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
882 with ui.configoverride(overrides, b'backout'):
882 with ui.configoverride(overrides, b'backout'):
883 return hg.merge(repo[b'tip'])
883 return hg.merge(repo[b'tip'])
884 return 0
884 return 0
885
885
886
886
887 @command(
887 @command(
888 b'bisect',
888 b'bisect',
889 [
889 [
890 (b'r', b'reset', False, _(b'reset bisect state')),
890 (b'r', b'reset', False, _(b'reset bisect state')),
891 (b'g', b'good', False, _(b'mark changeset good')),
891 (b'g', b'good', False, _(b'mark changeset good')),
892 (b'b', b'bad', False, _(b'mark changeset bad')),
892 (b'b', b'bad', False, _(b'mark changeset bad')),
893 (b's', b'skip', False, _(b'skip testing changeset')),
893 (b's', b'skip', False, _(b'skip testing changeset')),
894 (b'e', b'extend', False, _(b'extend the bisect range')),
894 (b'e', b'extend', False, _(b'extend the bisect range')),
895 (
895 (
896 b'c',
896 b'c',
897 b'command',
897 b'command',
898 b'',
898 b'',
899 _(b'use command to check changeset state'),
899 _(b'use command to check changeset state'),
900 _(b'CMD'),
900 _(b'CMD'),
901 ),
901 ),
902 (b'U', b'noupdate', False, _(b'do not update to target')),
902 (b'U', b'noupdate', False, _(b'do not update to target')),
903 ],
903 ],
904 _(b"[-gbsr] [-U] [-c CMD] [REV]"),
904 _(b"[-gbsr] [-U] [-c CMD] [REV]"),
905 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
905 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
906 )
906 )
907 def bisect(
907 def bisect(
908 ui,
908 ui,
909 repo,
909 repo,
910 positional_1=None,
910 positional_1=None,
911 positional_2=None,
911 positional_2=None,
912 command=None,
912 command=None,
913 reset=None,
913 reset=None,
914 good=None,
914 good=None,
915 bad=None,
915 bad=None,
916 skip=None,
916 skip=None,
917 extend=None,
917 extend=None,
918 noupdate=None,
918 noupdate=None,
919 ):
919 ):
920 """subdivision search of changesets
920 """subdivision search of changesets
921
921
922 This command helps to find changesets which introduce problems. To
922 This command helps to find changesets which introduce problems. To
923 use, mark the earliest changeset you know exhibits the problem as
923 use, mark the earliest changeset you know exhibits the problem as
924 bad, then mark the latest changeset which is free from the problem
924 bad, then mark the latest changeset which is free from the problem
925 as good. Bisect will update your working directory to a revision
925 as good. Bisect will update your working directory to a revision
926 for testing (unless the -U/--noupdate option is specified). Once
926 for testing (unless the -U/--noupdate option is specified). Once
927 you have performed tests, mark the working directory as good or
927 you have performed tests, mark the working directory as good or
928 bad, and bisect will either update to another candidate changeset
928 bad, and bisect will either update to another candidate changeset
929 or announce that it has found the bad revision.
929 or announce that it has found the bad revision.
930
930
931 As a shortcut, you can also use the revision argument to mark a
931 As a shortcut, you can also use the revision argument to mark a
932 revision as good or bad without checking it out first.
932 revision as good or bad without checking it out first.
933
933
934 If you supply a command, it will be used for automatic bisection.
934 If you supply a command, it will be used for automatic bisection.
935 The environment variable HG_NODE will contain the ID of the
935 The environment variable HG_NODE will contain the ID of the
936 changeset being tested. The exit status of the command will be
936 changeset being tested. The exit status of the command will be
937 used to mark revisions as good or bad: status 0 means good, 125
937 used to mark revisions as good or bad: status 0 means good, 125
938 means to skip the revision, 127 (command not found) will abort the
938 means to skip the revision, 127 (command not found) will abort the
939 bisection, and any other non-zero exit status means the revision
939 bisection, and any other non-zero exit status means the revision
940 is bad.
940 is bad.
941
941
942 .. container:: verbose
942 .. container:: verbose
943
943
944 Some examples:
944 Some examples:
945
945
946 - start a bisection with known bad revision 34, and good revision 12::
946 - start a bisection with known bad revision 34, and good revision 12::
947
947
948 hg bisect --bad 34
948 hg bisect --bad 34
949 hg bisect --good 12
949 hg bisect --good 12
950
950
951 - advance the current bisection by marking current revision as good or
951 - advance the current bisection by marking current revision as good or
952 bad::
952 bad::
953
953
954 hg bisect --good
954 hg bisect --good
955 hg bisect --bad
955 hg bisect --bad
956
956
957 - mark the current revision, or a known revision, to be skipped (e.g. if
957 - mark the current revision, or a known revision, to be skipped (e.g. if
958 that revision is not usable because of another issue)::
958 that revision is not usable because of another issue)::
959
959
960 hg bisect --skip
960 hg bisect --skip
961 hg bisect --skip 23
961 hg bisect --skip 23
962
962
963 - skip all revisions that do not touch directories ``foo`` or ``bar``::
963 - skip all revisions that do not touch directories ``foo`` or ``bar``::
964
964
965 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
965 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
966
966
967 - forget the current bisection::
967 - forget the current bisection::
968
968
969 hg bisect --reset
969 hg bisect --reset
970
970
971 - use 'make && make tests' to automatically find the first broken
971 - use 'make && make tests' to automatically find the first broken
972 revision::
972 revision::
973
973
974 hg bisect --reset
974 hg bisect --reset
975 hg bisect --bad 34
975 hg bisect --bad 34
976 hg bisect --good 12
976 hg bisect --good 12
977 hg bisect --command "make && make tests"
977 hg bisect --command "make && make tests"
978
978
979 - see all changesets whose states are already known in the current
979 - see all changesets whose states are already known in the current
980 bisection::
980 bisection::
981
981
982 hg log -r "bisect(pruned)"
982 hg log -r "bisect(pruned)"
983
983
984 - see the changeset currently being bisected (especially useful
984 - see the changeset currently being bisected (especially useful
985 if running with -U/--noupdate)::
985 if running with -U/--noupdate)::
986
986
987 hg log -r "bisect(current)"
987 hg log -r "bisect(current)"
988
988
989 - see all changesets that took part in the current bisection::
989 - see all changesets that took part in the current bisection::
990
990
991 hg log -r "bisect(range)"
991 hg log -r "bisect(range)"
992
992
993 - you can even get a nice graph::
993 - you can even get a nice graph::
994
994
995 hg log --graph -r "bisect(range)"
995 hg log --graph -r "bisect(range)"
996
996
997 See :hg:`help revisions.bisect` for more about the `bisect()` predicate.
997 See :hg:`help revisions.bisect` for more about the `bisect()` predicate.
998
998
999 Returns 0 on success.
999 Returns 0 on success.
1000 """
1000 """
1001 rev = []
1001 rev = []
1002 # backward compatibility
1002 # backward compatibility
1003 if positional_1 in (b"good", b"bad", b"reset", b"init"):
1003 if positional_1 in (b"good", b"bad", b"reset", b"init"):
1004 ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n"))
1004 ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n"))
1005 cmd = positional_1
1005 cmd = positional_1
1006 rev.append(positional_2)
1006 rev.append(positional_2)
1007 if cmd == b"good":
1007 if cmd == b"good":
1008 good = True
1008 good = True
1009 elif cmd == b"bad":
1009 elif cmd == b"bad":
1010 bad = True
1010 bad = True
1011 else:
1011 else:
1012 reset = True
1012 reset = True
1013 elif positional_2:
1013 elif positional_2:
1014 raise error.InputError(_(b'incompatible arguments'))
1014 raise error.InputError(_(b'incompatible arguments'))
1015 elif positional_1 is not None:
1015 elif positional_1 is not None:
1016 rev.append(positional_1)
1016 rev.append(positional_1)
1017
1017
1018 incompatibles = {
1018 incompatibles = {
1019 b'--bad': bad,
1019 b'--bad': bad,
1020 b'--command': bool(command),
1020 b'--command': bool(command),
1021 b'--extend': extend,
1021 b'--extend': extend,
1022 b'--good': good,
1022 b'--good': good,
1023 b'--reset': reset,
1023 b'--reset': reset,
1024 b'--skip': skip,
1024 b'--skip': skip,
1025 }
1025 }
1026
1026
1027 enabled = [x for x in incompatibles if incompatibles[x]]
1027 enabled = [x for x in incompatibles if incompatibles[x]]
1028
1028
1029 if len(enabled) > 1:
1029 if len(enabled) > 1:
1030 raise error.InputError(
1030 raise error.InputError(
1031 _(b'%s and %s are incompatible') % tuple(sorted(enabled)[0:2])
1031 _(b'%s and %s are incompatible') % tuple(sorted(enabled)[0:2])
1032 )
1032 )
1033
1033
1034 if reset:
1034 if reset:
1035 hbisect.resetstate(repo)
1035 hbisect.resetstate(repo)
1036 return
1036 return
1037
1037
1038 state = hbisect.load_state(repo)
1038 state = hbisect.load_state(repo)
1039
1039
1040 if rev:
1040 if rev:
1041 nodes = [repo[i].node() for i in scmutil.revrange(repo, rev)]
1041 nodes = [repo[i].node() for i in scmutil.revrange(repo, rev)]
1042 else:
1042 else:
1043 nodes = [repo.lookup(b'.')]
1043 nodes = [repo.lookup(b'.')]
1044
1044
1045 # update state
1045 # update state
1046 if good or bad or skip:
1046 if good or bad or skip:
1047 if good:
1047 if good:
1048 state[b'good'] += nodes
1048 state[b'good'] += nodes
1049 elif bad:
1049 elif bad:
1050 state[b'bad'] += nodes
1050 state[b'bad'] += nodes
1051 elif skip:
1051 elif skip:
1052 state[b'skip'] += nodes
1052 state[b'skip'] += nodes
1053 hbisect.save_state(repo, state)
1053 hbisect.save_state(repo, state)
1054 if not (state[b'good'] and state[b'bad']):
1054 if not (state[b'good'] and state[b'bad']):
1055 return
1055 return
1056
1056
1057 def mayupdate(repo, node, show_stats=True):
1057 def mayupdate(repo, node, show_stats=True):
1058 """common used update sequence"""
1058 """common used update sequence"""
1059 if noupdate:
1059 if noupdate:
1060 return
1060 return
1061 cmdutil.checkunfinished(repo)
1061 cmdutil.checkunfinished(repo)
1062 cmdutil.bailifchanged(repo)
1062 cmdutil.bailifchanged(repo)
1063 return hg.clean(repo, node, show_stats=show_stats)
1063 return hg.clean(repo, node, show_stats=show_stats)
1064
1064
1065 displayer = logcmdutil.changesetdisplayer(ui, repo, {})
1065 displayer = logcmdutil.changesetdisplayer(ui, repo, {})
1066
1066
1067 if command:
1067 if command:
1068 changesets = 1
1068 changesets = 1
1069 if noupdate:
1069 if noupdate:
1070 try:
1070 try:
1071 node = state[b'current'][0]
1071 node = state[b'current'][0]
1072 except LookupError:
1072 except LookupError:
1073 raise error.StateError(
1073 raise error.StateError(
1074 _(
1074 _(
1075 b'current bisect revision is unknown - '
1075 b'current bisect revision is unknown - '
1076 b'start a new bisect to fix'
1076 b'start a new bisect to fix'
1077 )
1077 )
1078 )
1078 )
1079 else:
1079 else:
1080 node, p2 = repo.dirstate.parents()
1080 node, p2 = repo.dirstate.parents()
1081 if p2 != nullid:
1081 if p2 != nullid:
1082 raise error.StateError(_(b'current bisect revision is a merge'))
1082 raise error.StateError(_(b'current bisect revision is a merge'))
1083 if rev:
1083 if rev:
1084 if not nodes:
1084 if not nodes:
1085 raise error.Abort(_(b'empty revision set'))
1085 raise error.Abort(_(b'empty revision set'))
1086 node = repo[nodes.last()].node()
1086 node = repo[nodes.last()].node()
1087 with hbisect.restore_state(repo, state, node):
1087 with hbisect.restore_state(repo, state, node):
1088 while changesets:
1088 while changesets:
1089 # update state
1089 # update state
1090 state[b'current'] = [node]
1090 state[b'current'] = [node]
1091 hbisect.save_state(repo, state)
1091 hbisect.save_state(repo, state)
1092 status = ui.system(
1092 status = ui.system(
1093 command,
1093 command,
1094 environ={b'HG_NODE': hex(node)},
1094 environ={b'HG_NODE': hex(node)},
1095 blockedtag=b'bisect_check',
1095 blockedtag=b'bisect_check',
1096 )
1096 )
1097 if status == 125:
1097 if status == 125:
1098 transition = b"skip"
1098 transition = b"skip"
1099 elif status == 0:
1099 elif status == 0:
1100 transition = b"good"
1100 transition = b"good"
1101 # status < 0 means process was killed
1101 # status < 0 means process was killed
1102 elif status == 127:
1102 elif status == 127:
1103 raise error.Abort(_(b"failed to execute %s") % command)
1103 raise error.Abort(_(b"failed to execute %s") % command)
1104 elif status < 0:
1104 elif status < 0:
1105 raise error.Abort(_(b"%s killed") % command)
1105 raise error.Abort(_(b"%s killed") % command)
1106 else:
1106 else:
1107 transition = b"bad"
1107 transition = b"bad"
1108 state[transition].append(node)
1108 state[transition].append(node)
1109 ctx = repo[node]
1109 ctx = repo[node]
1110 ui.status(
1110 ui.status(
1111 _(b'changeset %d:%s: %s\n') % (ctx.rev(), ctx, transition)
1111 _(b'changeset %d:%s: %s\n') % (ctx.rev(), ctx, transition)
1112 )
1112 )
1113 hbisect.checkstate(state)
1113 hbisect.checkstate(state)
1114 # bisect
1114 # bisect
1115 nodes, changesets, bgood = hbisect.bisect(repo, state)
1115 nodes, changesets, bgood = hbisect.bisect(repo, state)
1116 # update to next check
1116 # update to next check
1117 node = nodes[0]
1117 node = nodes[0]
1118 mayupdate(repo, node, show_stats=False)
1118 mayupdate(repo, node, show_stats=False)
1119 hbisect.printresult(ui, repo, state, displayer, nodes, bgood)
1119 hbisect.printresult(ui, repo, state, displayer, nodes, bgood)
1120 return
1120 return
1121
1121
1122 hbisect.checkstate(state)
1122 hbisect.checkstate(state)
1123
1123
1124 # actually bisect
1124 # actually bisect
1125 nodes, changesets, good = hbisect.bisect(repo, state)
1125 nodes, changesets, good = hbisect.bisect(repo, state)
1126 if extend:
1126 if extend:
1127 if not changesets:
1127 if not changesets:
1128 extendnode = hbisect.extendrange(repo, state, nodes, good)
1128 extendnode = hbisect.extendrange(repo, state, nodes, good)
1129 if extendnode is not None:
1129 if extendnode is not None:
1130 ui.write(
1130 ui.write(
1131 _(b"Extending search to changeset %d:%s\n")
1131 _(b"Extending search to changeset %d:%s\n")
1132 % (extendnode.rev(), extendnode)
1132 % (extendnode.rev(), extendnode)
1133 )
1133 )
1134 state[b'current'] = [extendnode.node()]
1134 state[b'current'] = [extendnode.node()]
1135 hbisect.save_state(repo, state)
1135 hbisect.save_state(repo, state)
1136 return mayupdate(repo, extendnode.node())
1136 return mayupdate(repo, extendnode.node())
1137 raise error.StateError(_(b"nothing to extend"))
1137 raise error.StateError(_(b"nothing to extend"))
1138
1138
1139 if changesets == 0:
1139 if changesets == 0:
1140 hbisect.printresult(ui, repo, state, displayer, nodes, good)
1140 hbisect.printresult(ui, repo, state, displayer, nodes, good)
1141 else:
1141 else:
1142 assert len(nodes) == 1 # only a single node can be tested next
1142 assert len(nodes) == 1 # only a single node can be tested next
1143 node = nodes[0]
1143 node = nodes[0]
1144 # compute the approximate number of remaining tests
1144 # compute the approximate number of remaining tests
1145 tests, size = 0, 2
1145 tests, size = 0, 2
1146 while size <= changesets:
1146 while size <= changesets:
1147 tests, size = tests + 1, size * 2
1147 tests, size = tests + 1, size * 2
1148 rev = repo.changelog.rev(node)
1148 rev = repo.changelog.rev(node)
1149 ui.write(
1149 ui.write(
1150 _(
1150 _(
1151 b"Testing changeset %d:%s "
1151 b"Testing changeset %d:%s "
1152 b"(%d changesets remaining, ~%d tests)\n"
1152 b"(%d changesets remaining, ~%d tests)\n"
1153 )
1153 )
1154 % (rev, short(node), changesets, tests)
1154 % (rev, short(node), changesets, tests)
1155 )
1155 )
1156 state[b'current'] = [node]
1156 state[b'current'] = [node]
1157 hbisect.save_state(repo, state)
1157 hbisect.save_state(repo, state)
1158 return mayupdate(repo, node)
1158 return mayupdate(repo, node)
1159
1159
1160
1160
1161 @command(
1161 @command(
1162 b'bookmarks|bookmark',
1162 b'bookmarks|bookmark',
1163 [
1163 [
1164 (b'f', b'force', False, _(b'force')),
1164 (b'f', b'force', False, _(b'force')),
1165 (b'r', b'rev', b'', _(b'revision for bookmark action'), _(b'REV')),
1165 (b'r', b'rev', b'', _(b'revision for bookmark action'), _(b'REV')),
1166 (b'd', b'delete', False, _(b'delete a given bookmark')),
1166 (b'd', b'delete', False, _(b'delete a given bookmark')),
1167 (b'm', b'rename', b'', _(b'rename a given bookmark'), _(b'OLD')),
1167 (b'm', b'rename', b'', _(b'rename a given bookmark'), _(b'OLD')),
1168 (b'i', b'inactive', False, _(b'mark a bookmark inactive')),
1168 (b'i', b'inactive', False, _(b'mark a bookmark inactive')),
1169 (b'l', b'list', False, _(b'list existing bookmarks')),
1169 (b'l', b'list', False, _(b'list existing bookmarks')),
1170 ]
1170 ]
1171 + formatteropts,
1171 + formatteropts,
1172 _(b'hg bookmarks [OPTIONS]... [NAME]...'),
1172 _(b'hg bookmarks [OPTIONS]... [NAME]...'),
1173 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1173 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1174 )
1174 )
1175 def bookmark(ui, repo, *names, **opts):
1175 def bookmark(ui, repo, *names, **opts):
1176 """create a new bookmark or list existing bookmarks
1176 """create a new bookmark or list existing bookmarks
1177
1177
1178 Bookmarks are labels on changesets to help track lines of development.
1178 Bookmarks are labels on changesets to help track lines of development.
1179 Bookmarks are unversioned and can be moved, renamed and deleted.
1179 Bookmarks are unversioned and can be moved, renamed and deleted.
1180 Deleting or moving a bookmark has no effect on the associated changesets.
1180 Deleting or moving a bookmark has no effect on the associated changesets.
1181
1181
1182 Creating or updating to a bookmark causes it to be marked as 'active'.
1182 Creating or updating to a bookmark causes it to be marked as 'active'.
1183 The active bookmark is indicated with a '*'.
1183 The active bookmark is indicated with a '*'.
1184 When a commit is made, the active bookmark will advance to the new commit.
1184 When a commit is made, the active bookmark will advance to the new commit.
1185 A plain :hg:`update` will also advance an active bookmark, if possible.
1185 A plain :hg:`update` will also advance an active bookmark, if possible.
1186 Updating away from a bookmark will cause it to be deactivated.
1186 Updating away from a bookmark will cause it to be deactivated.
1187
1187
1188 Bookmarks can be pushed and pulled between repositories (see
1188 Bookmarks can be pushed and pulled between repositories (see
1189 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
1189 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
1190 diverged, a new 'divergent bookmark' of the form 'name@path' will
1190 diverged, a new 'divergent bookmark' of the form 'name@path' will
1191 be created. Using :hg:`merge` will resolve the divergence.
1191 be created. Using :hg:`merge` will resolve the divergence.
1192
1192
1193 Specifying bookmark as '.' to -m/-d/-l options is equivalent to specifying
1193 Specifying bookmark as '.' to -m/-d/-l options is equivalent to specifying
1194 the active bookmark's name.
1194 the active bookmark's name.
1195
1195
1196 A bookmark named '@' has the special property that :hg:`clone` will
1196 A bookmark named '@' has the special property that :hg:`clone` will
1197 check it out by default if it exists.
1197 check it out by default if it exists.
1198
1198
1199 .. container:: verbose
1199 .. container:: verbose
1200
1200
1201 Template:
1201 Template:
1202
1202
1203 The following keywords are supported in addition to the common template
1203 The following keywords are supported in addition to the common template
1204 keywords and functions such as ``{bookmark}``. See also
1204 keywords and functions such as ``{bookmark}``. See also
1205 :hg:`help templates`.
1205 :hg:`help templates`.
1206
1206
1207 :active: Boolean. True if the bookmark is active.
1207 :active: Boolean. True if the bookmark is active.
1208
1208
1209 Examples:
1209 Examples:
1210
1210
1211 - create an active bookmark for a new line of development::
1211 - create an active bookmark for a new line of development::
1212
1212
1213 hg book new-feature
1213 hg book new-feature
1214
1214
1215 - create an inactive bookmark as a place marker::
1215 - create an inactive bookmark as a place marker::
1216
1216
1217 hg book -i reviewed
1217 hg book -i reviewed
1218
1218
1219 - create an inactive bookmark on another changeset::
1219 - create an inactive bookmark on another changeset::
1220
1220
1221 hg book -r .^ tested
1221 hg book -r .^ tested
1222
1222
1223 - rename bookmark turkey to dinner::
1223 - rename bookmark turkey to dinner::
1224
1224
1225 hg book -m turkey dinner
1225 hg book -m turkey dinner
1226
1226
1227 - move the '@' bookmark from another branch::
1227 - move the '@' bookmark from another branch::
1228
1228
1229 hg book -f @
1229 hg book -f @
1230
1230
1231 - print only the active bookmark name::
1231 - print only the active bookmark name::
1232
1232
1233 hg book -ql .
1233 hg book -ql .
1234 """
1234 """
1235 opts = pycompat.byteskwargs(opts)
1235 opts = pycompat.byteskwargs(opts)
1236 force = opts.get(b'force')
1236 force = opts.get(b'force')
1237 rev = opts.get(b'rev')
1237 rev = opts.get(b'rev')
1238 inactive = opts.get(b'inactive') # meaning add/rename to inactive bookmark
1238 inactive = opts.get(b'inactive') # meaning add/rename to inactive bookmark
1239
1239
1240 action = cmdutil.check_at_most_one_arg(opts, b'delete', b'rename', b'list')
1240 action = cmdutil.check_at_most_one_arg(opts, b'delete', b'rename', b'list')
1241 if action:
1241 if action:
1242 cmdutil.check_incompatible_arguments(opts, action, [b'rev'])
1242 cmdutil.check_incompatible_arguments(opts, action, [b'rev'])
1243 elif names or rev:
1243 elif names or rev:
1244 action = b'add'
1244 action = b'add'
1245 elif inactive:
1245 elif inactive:
1246 action = b'inactive' # meaning deactivate
1246 action = b'inactive' # meaning deactivate
1247 else:
1247 else:
1248 action = b'list'
1248 action = b'list'
1249
1249
1250 cmdutil.check_incompatible_arguments(
1250 cmdutil.check_incompatible_arguments(
1251 opts, b'inactive', [b'delete', b'list']
1251 opts, b'inactive', [b'delete', b'list']
1252 )
1252 )
1253 if not names and action in {b'add', b'delete'}:
1253 if not names and action in {b'add', b'delete'}:
1254 raise error.InputError(_(b"bookmark name required"))
1254 raise error.InputError(_(b"bookmark name required"))
1255
1255
1256 if action in {b'add', b'delete', b'rename', b'inactive'}:
1256 if action in {b'add', b'delete', b'rename', b'inactive'}:
1257 with repo.wlock(), repo.lock(), repo.transaction(b'bookmark') as tr:
1257 with repo.wlock(), repo.lock(), repo.transaction(b'bookmark') as tr:
1258 if action == b'delete':
1258 if action == b'delete':
1259 names = pycompat.maplist(repo._bookmarks.expandname, names)
1259 names = pycompat.maplist(repo._bookmarks.expandname, names)
1260 bookmarks.delete(repo, tr, names)
1260 bookmarks.delete(repo, tr, names)
1261 elif action == b'rename':
1261 elif action == b'rename':
1262 if not names:
1262 if not names:
1263 raise error.InputError(_(b"new bookmark name required"))
1263 raise error.InputError(_(b"new bookmark name required"))
1264 elif len(names) > 1:
1264 elif len(names) > 1:
1265 raise error.InputError(
1265 raise error.InputError(
1266 _(b"only one new bookmark name allowed")
1266 _(b"only one new bookmark name allowed")
1267 )
1267 )
1268 oldname = repo._bookmarks.expandname(opts[b'rename'])
1268 oldname = repo._bookmarks.expandname(opts[b'rename'])
1269 bookmarks.rename(repo, tr, oldname, names[0], force, inactive)
1269 bookmarks.rename(repo, tr, oldname, names[0], force, inactive)
1270 elif action == b'add':
1270 elif action == b'add':
1271 bookmarks.addbookmarks(repo, tr, names, rev, force, inactive)
1271 bookmarks.addbookmarks(repo, tr, names, rev, force, inactive)
1272 elif action == b'inactive':
1272 elif action == b'inactive':
1273 if len(repo._bookmarks) == 0:
1273 if len(repo._bookmarks) == 0:
1274 ui.status(_(b"no bookmarks set\n"))
1274 ui.status(_(b"no bookmarks set\n"))
1275 elif not repo._activebookmark:
1275 elif not repo._activebookmark:
1276 ui.status(_(b"no active bookmark\n"))
1276 ui.status(_(b"no active bookmark\n"))
1277 else:
1277 else:
1278 bookmarks.deactivate(repo)
1278 bookmarks.deactivate(repo)
1279 elif action == b'list':
1279 elif action == b'list':
1280 names = pycompat.maplist(repo._bookmarks.expandname, names)
1280 names = pycompat.maplist(repo._bookmarks.expandname, names)
1281 with ui.formatter(b'bookmarks', opts) as fm:
1281 with ui.formatter(b'bookmarks', opts) as fm:
1282 bookmarks.printbookmarks(ui, repo, fm, names)
1282 bookmarks.printbookmarks(ui, repo, fm, names)
1283 else:
1283 else:
1284 raise error.ProgrammingError(b'invalid action: %s' % action)
1284 raise error.ProgrammingError(b'invalid action: %s' % action)
1285
1285
1286
1286
1287 @command(
1287 @command(
1288 b'branch',
1288 b'branch',
1289 [
1289 [
1290 (
1290 (
1291 b'f',
1291 b'f',
1292 b'force',
1292 b'force',
1293 None,
1293 None,
1294 _(b'set branch name even if it shadows an existing branch'),
1294 _(b'set branch name even if it shadows an existing branch'),
1295 ),
1295 ),
1296 (b'C', b'clean', None, _(b'reset branch name to parent branch name')),
1296 (b'C', b'clean', None, _(b'reset branch name to parent branch name')),
1297 (
1297 (
1298 b'r',
1298 b'r',
1299 b'rev',
1299 b'rev',
1300 [],
1300 [],
1301 _(b'change branches of the given revs (EXPERIMENTAL)'),
1301 _(b'change branches of the given revs (EXPERIMENTAL)'),
1302 ),
1302 ),
1303 ],
1303 ],
1304 _(b'[-fC] [NAME]'),
1304 _(b'[-fC] [NAME]'),
1305 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1305 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1306 )
1306 )
1307 def branch(ui, repo, label=None, **opts):
1307 def branch(ui, repo, label=None, **opts):
1308 """set or show the current branch name
1308 """set or show the current branch name
1309
1309
1310 .. note::
1310 .. note::
1311
1311
1312 Branch names are permanent and global. Use :hg:`bookmark` to create a
1312 Branch names are permanent and global. Use :hg:`bookmark` to create a
1313 light-weight bookmark instead. See :hg:`help glossary` for more
1313 light-weight bookmark instead. See :hg:`help glossary` for more
1314 information about named branches and bookmarks.
1314 information about named branches and bookmarks.
1315
1315
1316 With no argument, show the current branch name. With one argument,
1316 With no argument, show the current branch name. With one argument,
1317 set the working directory branch name (the branch will not exist
1317 set the working directory branch name (the branch will not exist
1318 in the repository until the next commit). Standard practice
1318 in the repository until the next commit). Standard practice
1319 recommends that primary development take place on the 'default'
1319 recommends that primary development take place on the 'default'
1320 branch.
1320 branch.
1321
1321
1322 Unless -f/--force is specified, branch will not let you set a
1322 Unless -f/--force is specified, branch will not let you set a
1323 branch name that already exists.
1323 branch name that already exists.
1324
1324
1325 Use -C/--clean to reset the working directory branch to that of
1325 Use -C/--clean to reset the working directory branch to that of
1326 the parent of the working directory, negating a previous branch
1326 the parent of the working directory, negating a previous branch
1327 change.
1327 change.
1328
1328
1329 Use the command :hg:`update` to switch to an existing branch. Use
1329 Use the command :hg:`update` to switch to an existing branch. Use
1330 :hg:`commit --close-branch` to mark this branch head as closed.
1330 :hg:`commit --close-branch` to mark this branch head as closed.
1331 When all heads of a branch are closed, the branch will be
1331 When all heads of a branch are closed, the branch will be
1332 considered closed.
1332 considered closed.
1333
1333
1334 Returns 0 on success.
1334 Returns 0 on success.
1335 """
1335 """
1336 opts = pycompat.byteskwargs(opts)
1336 opts = pycompat.byteskwargs(opts)
1337 revs = opts.get(b'rev')
1337 revs = opts.get(b'rev')
1338 if label:
1338 if label:
1339 label = label.strip()
1339 label = label.strip()
1340
1340
1341 if not opts.get(b'clean') and not label:
1341 if not opts.get(b'clean') and not label:
1342 if revs:
1342 if revs:
1343 raise error.InputError(
1343 raise error.InputError(
1344 _(b"no branch name specified for the revisions")
1344 _(b"no branch name specified for the revisions")
1345 )
1345 )
1346 ui.write(b"%s\n" % repo.dirstate.branch())
1346 ui.write(b"%s\n" % repo.dirstate.branch())
1347 return
1347 return
1348
1348
1349 with repo.wlock():
1349 with repo.wlock():
1350 if opts.get(b'clean'):
1350 if opts.get(b'clean'):
1351 label = repo[b'.'].branch()
1351 label = repo[b'.'].branch()
1352 repo.dirstate.setbranch(label)
1352 repo.dirstate.setbranch(label)
1353 ui.status(_(b'reset working directory to branch %s\n') % label)
1353 ui.status(_(b'reset working directory to branch %s\n') % label)
1354 elif label:
1354 elif label:
1355
1355
1356 scmutil.checknewlabel(repo, label, b'branch')
1356 scmutil.checknewlabel(repo, label, b'branch')
1357 if revs:
1357 if revs:
1358 return cmdutil.changebranch(ui, repo, revs, label, opts)
1358 return cmdutil.changebranch(ui, repo, revs, label, opts)
1359
1359
1360 if not opts.get(b'force') and label in repo.branchmap():
1360 if not opts.get(b'force') and label in repo.branchmap():
1361 if label not in [p.branch() for p in repo[None].parents()]:
1361 if label not in [p.branch() for p in repo[None].parents()]:
1362 raise error.InputError(
1362 raise error.InputError(
1363 _(b'a branch of the same name already exists'),
1363 _(b'a branch of the same name already exists'),
1364 # i18n: "it" refers to an existing branch
1364 # i18n: "it" refers to an existing branch
1365 hint=_(b"use 'hg update' to switch to it"),
1365 hint=_(b"use 'hg update' to switch to it"),
1366 )
1366 )
1367
1367
1368 repo.dirstate.setbranch(label)
1368 repo.dirstate.setbranch(label)
1369 ui.status(_(b'marked working directory as branch %s\n') % label)
1369 ui.status(_(b'marked working directory as branch %s\n') % label)
1370
1370
1371 # find any open named branches aside from default
1371 # find any open named branches aside from default
1372 for n, h, t, c in repo.branchmap().iterbranches():
1372 for n, h, t, c in repo.branchmap().iterbranches():
1373 if n != b"default" and not c:
1373 if n != b"default" and not c:
1374 return 0
1374 return 0
1375 ui.status(
1375 ui.status(
1376 _(
1376 _(
1377 b'(branches are permanent and global, '
1377 b'(branches are permanent and global, '
1378 b'did you want a bookmark?)\n'
1378 b'did you want a bookmark?)\n'
1379 )
1379 )
1380 )
1380 )
1381
1381
1382
1382
1383 @command(
1383 @command(
1384 b'branches',
1384 b'branches',
1385 [
1385 [
1386 (
1386 (
1387 b'a',
1387 b'a',
1388 b'active',
1388 b'active',
1389 False,
1389 False,
1390 _(b'show only branches that have unmerged heads (DEPRECATED)'),
1390 _(b'show only branches that have unmerged heads (DEPRECATED)'),
1391 ),
1391 ),
1392 (b'c', b'closed', False, _(b'show normal and closed branches')),
1392 (b'c', b'closed', False, _(b'show normal and closed branches')),
1393 (b'r', b'rev', [], _(b'show branch name(s) of the given rev')),
1393 (b'r', b'rev', [], _(b'show branch name(s) of the given rev')),
1394 ]
1394 ]
1395 + formatteropts,
1395 + formatteropts,
1396 _(b'[-c]'),
1396 _(b'[-c]'),
1397 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1397 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1398 intents={INTENT_READONLY},
1398 intents={INTENT_READONLY},
1399 )
1399 )
1400 def branches(ui, repo, active=False, closed=False, **opts):
1400 def branches(ui, repo, active=False, closed=False, **opts):
1401 """list repository named branches
1401 """list repository named branches
1402
1402
1403 List the repository's named branches, indicating which ones are
1403 List the repository's named branches, indicating which ones are
1404 inactive. If -c/--closed is specified, also list branches which have
1404 inactive. If -c/--closed is specified, also list branches which have
1405 been marked closed (see :hg:`commit --close-branch`).
1405 been marked closed (see :hg:`commit --close-branch`).
1406
1406
1407 Use the command :hg:`update` to switch to an existing branch.
1407 Use the command :hg:`update` to switch to an existing branch.
1408
1408
1409 .. container:: verbose
1409 .. container:: verbose
1410
1410
1411 Template:
1411 Template:
1412
1412
1413 The following keywords are supported in addition to the common template
1413 The following keywords are supported in addition to the common template
1414 keywords and functions such as ``{branch}``. See also
1414 keywords and functions such as ``{branch}``. See also
1415 :hg:`help templates`.
1415 :hg:`help templates`.
1416
1416
1417 :active: Boolean. True if the branch is active.
1417 :active: Boolean. True if the branch is active.
1418 :closed: Boolean. True if the branch is closed.
1418 :closed: Boolean. True if the branch is closed.
1419 :current: Boolean. True if it is the current branch.
1419 :current: Boolean. True if it is the current branch.
1420
1420
1421 Returns 0.
1421 Returns 0.
1422 """
1422 """
1423
1423
1424 opts = pycompat.byteskwargs(opts)
1424 opts = pycompat.byteskwargs(opts)
1425 revs = opts.get(b'rev')
1425 revs = opts.get(b'rev')
1426 selectedbranches = None
1426 selectedbranches = None
1427 if revs:
1427 if revs:
1428 revs = scmutil.revrange(repo, revs)
1428 revs = scmutil.revrange(repo, revs)
1429 getbi = repo.revbranchcache().branchinfo
1429 getbi = repo.revbranchcache().branchinfo
1430 selectedbranches = {getbi(r)[0] for r in revs}
1430 selectedbranches = {getbi(r)[0] for r in revs}
1431
1431
1432 ui.pager(b'branches')
1432 ui.pager(b'branches')
1433 fm = ui.formatter(b'branches', opts)
1433 fm = ui.formatter(b'branches', opts)
1434 hexfunc = fm.hexfunc
1434 hexfunc = fm.hexfunc
1435
1435
1436 allheads = set(repo.heads())
1436 allheads = set(repo.heads())
1437 branches = []
1437 branches = []
1438 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1438 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1439 if selectedbranches is not None and tag not in selectedbranches:
1439 if selectedbranches is not None and tag not in selectedbranches:
1440 continue
1440 continue
1441 isactive = False
1441 isactive = False
1442 if not isclosed:
1442 if not isclosed:
1443 openheads = set(repo.branchmap().iteropen(heads))
1443 openheads = set(repo.branchmap().iteropen(heads))
1444 isactive = bool(openheads & allheads)
1444 isactive = bool(openheads & allheads)
1445 branches.append((tag, repo[tip], isactive, not isclosed))
1445 branches.append((tag, repo[tip], isactive, not isclosed))
1446 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]), reverse=True)
1446 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]), reverse=True)
1447
1447
1448 for tag, ctx, isactive, isopen in branches:
1448 for tag, ctx, isactive, isopen in branches:
1449 if active and not isactive:
1449 if active and not isactive:
1450 continue
1450 continue
1451 if isactive:
1451 if isactive:
1452 label = b'branches.active'
1452 label = b'branches.active'
1453 notice = b''
1453 notice = b''
1454 elif not isopen:
1454 elif not isopen:
1455 if not closed:
1455 if not closed:
1456 continue
1456 continue
1457 label = b'branches.closed'
1457 label = b'branches.closed'
1458 notice = _(b' (closed)')
1458 notice = _(b' (closed)')
1459 else:
1459 else:
1460 label = b'branches.inactive'
1460 label = b'branches.inactive'
1461 notice = _(b' (inactive)')
1461 notice = _(b' (inactive)')
1462 current = tag == repo.dirstate.branch()
1462 current = tag == repo.dirstate.branch()
1463 if current:
1463 if current:
1464 label = b'branches.current'
1464 label = b'branches.current'
1465
1465
1466 fm.startitem()
1466 fm.startitem()
1467 fm.write(b'branch', b'%s', tag, label=label)
1467 fm.write(b'branch', b'%s', tag, label=label)
1468 rev = ctx.rev()
1468 rev = ctx.rev()
1469 padsize = max(31 - len(b"%d" % rev) - encoding.colwidth(tag), 0)
1469 padsize = max(31 - len(b"%d" % rev) - encoding.colwidth(tag), 0)
1470 fmt = b' ' * padsize + b' %d:%s'
1470 fmt = b' ' * padsize + b' %d:%s'
1471 fm.condwrite(
1471 fm.condwrite(
1472 not ui.quiet,
1472 not ui.quiet,
1473 b'rev node',
1473 b'rev node',
1474 fmt,
1474 fmt,
1475 rev,
1475 rev,
1476 hexfunc(ctx.node()),
1476 hexfunc(ctx.node()),
1477 label=b'log.changeset changeset.%s' % ctx.phasestr(),
1477 label=b'log.changeset changeset.%s' % ctx.phasestr(),
1478 )
1478 )
1479 fm.context(ctx=ctx)
1479 fm.context(ctx=ctx)
1480 fm.data(active=isactive, closed=not isopen, current=current)
1480 fm.data(active=isactive, closed=not isopen, current=current)
1481 if not ui.quiet:
1481 if not ui.quiet:
1482 fm.plain(notice)
1482 fm.plain(notice)
1483 fm.plain(b'\n')
1483 fm.plain(b'\n')
1484 fm.end()
1484 fm.end()
1485
1485
1486
1486
1487 @command(
1487 @command(
1488 b'bundle',
1488 b'bundle',
1489 [
1489 [
1490 (
1490 (
1491 b'f',
1491 b'f',
1492 b'force',
1492 b'force',
1493 None,
1493 None,
1494 _(b'run even when the destination is unrelated'),
1494 _(b'run even when the destination is unrelated'),
1495 ),
1495 ),
1496 (
1496 (
1497 b'r',
1497 b'r',
1498 b'rev',
1498 b'rev',
1499 [],
1499 [],
1500 _(b'a changeset intended to be added to the destination'),
1500 _(b'a changeset intended to be added to the destination'),
1501 _(b'REV'),
1501 _(b'REV'),
1502 ),
1502 ),
1503 (
1503 (
1504 b'b',
1504 b'b',
1505 b'branch',
1505 b'branch',
1506 [],
1506 [],
1507 _(b'a specific branch you would like to bundle'),
1507 _(b'a specific branch you would like to bundle'),
1508 _(b'BRANCH'),
1508 _(b'BRANCH'),
1509 ),
1509 ),
1510 (
1510 (
1511 b'',
1511 b'',
1512 b'base',
1512 b'base',
1513 [],
1513 [],
1514 _(b'a base changeset assumed to be available at the destination'),
1514 _(b'a base changeset assumed to be available at the destination'),
1515 _(b'REV'),
1515 _(b'REV'),
1516 ),
1516 ),
1517 (b'a', b'all', None, _(b'bundle all changesets in the repository')),
1517 (b'a', b'all', None, _(b'bundle all changesets in the repository')),
1518 (
1518 (
1519 b't',
1519 b't',
1520 b'type',
1520 b'type',
1521 b'bzip2',
1521 b'bzip2',
1522 _(b'bundle compression type to use'),
1522 _(b'bundle compression type to use'),
1523 _(b'TYPE'),
1523 _(b'TYPE'),
1524 ),
1524 ),
1525 ]
1525 ]
1526 + remoteopts,
1526 + remoteopts,
1527 _(b'[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]'),
1527 _(b'[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]'),
1528 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1528 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1529 )
1529 )
1530 def bundle(ui, repo, fname, dest=None, **opts):
1530 def bundle(ui, repo, fname, dest=None, **opts):
1531 """create a bundle file
1531 """create a bundle file
1532
1532
1533 Generate a bundle file containing data to be transferred to another
1533 Generate a bundle file containing data to be transferred to another
1534 repository.
1534 repository.
1535
1535
1536 To create a bundle containing all changesets, use -a/--all
1536 To create a bundle containing all changesets, use -a/--all
1537 (or --base null). Otherwise, hg assumes the destination will have
1537 (or --base null). Otherwise, hg assumes the destination will have
1538 all the nodes you specify with --base parameters. Otherwise, hg
1538 all the nodes you specify with --base parameters. Otherwise, hg
1539 will assume the repository has all the nodes in destination, or
1539 will assume the repository has all the nodes in destination, or
1540 default-push/default if no destination is specified, where destination
1540 default-push/default if no destination is specified, where destination
1541 is the repository you provide through DEST option.
1541 is the repository you provide through DEST option.
1542
1542
1543 You can change bundle format with the -t/--type option. See
1543 You can change bundle format with the -t/--type option. See
1544 :hg:`help bundlespec` for documentation on this format. By default,
1544 :hg:`help bundlespec` for documentation on this format. By default,
1545 the most appropriate format is used and compression defaults to
1545 the most appropriate format is used and compression defaults to
1546 bzip2.
1546 bzip2.
1547
1547
1548 The bundle file can then be transferred using conventional means
1548 The bundle file can then be transferred using conventional means
1549 and applied to another repository with the unbundle or pull
1549 and applied to another repository with the unbundle or pull
1550 command. This is useful when direct push and pull are not
1550 command. This is useful when direct push and pull are not
1551 available or when exporting an entire repository is undesirable.
1551 available or when exporting an entire repository is undesirable.
1552
1552
1553 Applying bundles preserves all changeset contents including
1553 Applying bundles preserves all changeset contents including
1554 permissions, copy/rename information, and revision history.
1554 permissions, copy/rename information, and revision history.
1555
1555
1556 Returns 0 on success, 1 if no changes found.
1556 Returns 0 on success, 1 if no changes found.
1557 """
1557 """
1558 opts = pycompat.byteskwargs(opts)
1558 opts = pycompat.byteskwargs(opts)
1559 revs = None
1559 revs = None
1560 if b'rev' in opts:
1560 if b'rev' in opts:
1561 revstrings = opts[b'rev']
1561 revstrings = opts[b'rev']
1562 revs = scmutil.revrange(repo, revstrings)
1562 revs = scmutil.revrange(repo, revstrings)
1563 if revstrings and not revs:
1563 if revstrings and not revs:
1564 raise error.InputError(_(b'no commits to bundle'))
1564 raise error.InputError(_(b'no commits to bundle'))
1565
1565
1566 bundletype = opts.get(b'type', b'bzip2').lower()
1566 bundletype = opts.get(b'type', b'bzip2').lower()
1567 try:
1567 try:
1568 bundlespec = bundlecaches.parsebundlespec(
1568 bundlespec = bundlecaches.parsebundlespec(
1569 repo, bundletype, strict=False
1569 repo, bundletype, strict=False
1570 )
1570 )
1571 except error.UnsupportedBundleSpecification as e:
1571 except error.UnsupportedBundleSpecification as e:
1572 raise error.InputError(
1572 raise error.InputError(
1573 pycompat.bytestr(e),
1573 pycompat.bytestr(e),
1574 hint=_(b"see 'hg help bundlespec' for supported values for --type"),
1574 hint=_(b"see 'hg help bundlespec' for supported values for --type"),
1575 )
1575 )
1576 cgversion = bundlespec.contentopts[b"cg.version"]
1576 cgversion = bundlespec.contentopts[b"cg.version"]
1577
1577
1578 # Packed bundles are a pseudo bundle format for now.
1578 # Packed bundles are a pseudo bundle format for now.
1579 if cgversion == b's1':
1579 if cgversion == b's1':
1580 raise error.InputError(
1580 raise error.InputError(
1581 _(b'packed bundles cannot be produced by "hg bundle"'),
1581 _(b'packed bundles cannot be produced by "hg bundle"'),
1582 hint=_(b"use 'hg debugcreatestreamclonebundle'"),
1582 hint=_(b"use 'hg debugcreatestreamclonebundle'"),
1583 )
1583 )
1584
1584
1585 if opts.get(b'all'):
1585 if opts.get(b'all'):
1586 if dest:
1586 if dest:
1587 raise error.InputError(
1587 raise error.InputError(
1588 _(b"--all is incompatible with specifying a destination")
1588 _(b"--all is incompatible with specifying a destination")
1589 )
1589 )
1590 if opts.get(b'base'):
1590 if opts.get(b'base'):
1591 ui.warn(_(b"ignoring --base because --all was specified\n"))
1591 ui.warn(_(b"ignoring --base because --all was specified\n"))
1592 base = [nullrev]
1592 base = [nullrev]
1593 else:
1593 else:
1594 base = scmutil.revrange(repo, opts.get(b'base'))
1594 base = scmutil.revrange(repo, opts.get(b'base'))
1595 if cgversion not in changegroup.supportedoutgoingversions(repo):
1595 if cgversion not in changegroup.supportedoutgoingversions(repo):
1596 raise error.Abort(
1596 raise error.Abort(
1597 _(b"repository does not support bundle version %s") % cgversion
1597 _(b"repository does not support bundle version %s") % cgversion
1598 )
1598 )
1599
1599
1600 if base:
1600 if base:
1601 if dest:
1601 if dest:
1602 raise error.InputError(
1602 raise error.InputError(
1603 _(b"--base is incompatible with specifying a destination")
1603 _(b"--base is incompatible with specifying a destination")
1604 )
1604 )
1605 common = [repo[rev].node() for rev in base]
1605 common = [repo[rev].node() for rev in base]
1606 heads = [repo[r].node() for r in revs] if revs else None
1606 heads = [repo[r].node() for r in revs] if revs else None
1607 outgoing = discovery.outgoing(repo, common, heads)
1607 outgoing = discovery.outgoing(repo, common, heads)
1608 else:
1608 else:
1609 dest = ui.expandpath(dest or b'default-push', dest or b'default')
1609 dest = ui.expandpath(dest or b'default-push', dest or b'default')
1610 dest, branches = hg.parseurl(dest, opts.get(b'branch'))
1610 dest, branches = hg.parseurl(dest, opts.get(b'branch'))
1611 other = hg.peer(repo, opts, dest)
1611 other = hg.peer(repo, opts, dest)
1612 revs = [repo[r].hex() for r in revs]
1612 revs = [repo[r].hex() for r in revs]
1613 revs, checkout = hg.addbranchrevs(repo, repo, branches, revs)
1613 revs, checkout = hg.addbranchrevs(repo, repo, branches, revs)
1614 heads = revs and pycompat.maplist(repo.lookup, revs) or revs
1614 heads = revs and pycompat.maplist(repo.lookup, revs) or revs
1615 outgoing = discovery.findcommonoutgoing(
1615 outgoing = discovery.findcommonoutgoing(
1616 repo,
1616 repo,
1617 other,
1617 other,
1618 onlyheads=heads,
1618 onlyheads=heads,
1619 force=opts.get(b'force'),
1619 force=opts.get(b'force'),
1620 portable=True,
1620 portable=True,
1621 )
1621 )
1622
1622
1623 if not outgoing.missing:
1623 if not outgoing.missing:
1624 scmutil.nochangesfound(ui, repo, not base and outgoing.excluded)
1624 scmutil.nochangesfound(ui, repo, not base and outgoing.excluded)
1625 return 1
1625 return 1
1626
1626
1627 if cgversion == b'01': # bundle1
1627 if cgversion == b'01': # bundle1
1628 bversion = b'HG10' + bundlespec.wirecompression
1628 bversion = b'HG10' + bundlespec.wirecompression
1629 bcompression = None
1629 bcompression = None
1630 elif cgversion in (b'02', b'03'):
1630 elif cgversion in (b'02', b'03'):
1631 bversion = b'HG20'
1631 bversion = b'HG20'
1632 bcompression = bundlespec.wirecompression
1632 bcompression = bundlespec.wirecompression
1633 else:
1633 else:
1634 raise error.ProgrammingError(
1634 raise error.ProgrammingError(
1635 b'bundle: unexpected changegroup version %s' % cgversion
1635 b'bundle: unexpected changegroup version %s' % cgversion
1636 )
1636 )
1637
1637
1638 # TODO compression options should be derived from bundlespec parsing.
1638 # TODO compression options should be derived from bundlespec parsing.
1639 # This is a temporary hack to allow adjusting bundle compression
1639 # This is a temporary hack to allow adjusting bundle compression
1640 # level without a) formalizing the bundlespec changes to declare it
1640 # level without a) formalizing the bundlespec changes to declare it
1641 # b) introducing a command flag.
1641 # b) introducing a command flag.
1642 compopts = {}
1642 compopts = {}
1643 complevel = ui.configint(
1643 complevel = ui.configint(
1644 b'experimental', b'bundlecomplevel.' + bundlespec.compression
1644 b'experimental', b'bundlecomplevel.' + bundlespec.compression
1645 )
1645 )
1646 if complevel is None:
1646 if complevel is None:
1647 complevel = ui.configint(b'experimental', b'bundlecomplevel')
1647 complevel = ui.configint(b'experimental', b'bundlecomplevel')
1648 if complevel is not None:
1648 if complevel is not None:
1649 compopts[b'level'] = complevel
1649 compopts[b'level'] = complevel
1650
1650
1651 # Allow overriding the bundling of obsmarker in phases through
1651 # Allow overriding the bundling of obsmarker in phases through
1652 # configuration while we don't have a bundle version that include them
1652 # configuration while we don't have a bundle version that include them
1653 if repo.ui.configbool(b'experimental', b'evolution.bundle-obsmarker'):
1653 if repo.ui.configbool(b'experimental', b'evolution.bundle-obsmarker'):
1654 bundlespec.contentopts[b'obsolescence'] = True
1654 bundlespec.contentopts[b'obsolescence'] = True
1655 if repo.ui.configbool(b'experimental', b'bundle-phases'):
1655 if repo.ui.configbool(b'experimental', b'bundle-phases'):
1656 bundlespec.contentopts[b'phases'] = True
1656 bundlespec.contentopts[b'phases'] = True
1657
1657
1658 bundle2.writenewbundle(
1658 bundle2.writenewbundle(
1659 ui,
1659 ui,
1660 repo,
1660 repo,
1661 b'bundle',
1661 b'bundle',
1662 fname,
1662 fname,
1663 bversion,
1663 bversion,
1664 outgoing,
1664 outgoing,
1665 bundlespec.contentopts,
1665 bundlespec.contentopts,
1666 compression=bcompression,
1666 compression=bcompression,
1667 compopts=compopts,
1667 compopts=compopts,
1668 )
1668 )
1669
1669
1670
1670
1671 @command(
1671 @command(
1672 b'cat',
1672 b'cat',
1673 [
1673 [
1674 (
1674 (
1675 b'o',
1675 b'o',
1676 b'output',
1676 b'output',
1677 b'',
1677 b'',
1678 _(b'print output to file with formatted name'),
1678 _(b'print output to file with formatted name'),
1679 _(b'FORMAT'),
1679 _(b'FORMAT'),
1680 ),
1680 ),
1681 (b'r', b'rev', b'', _(b'print the given revision'), _(b'REV')),
1681 (b'r', b'rev', b'', _(b'print the given revision'), _(b'REV')),
1682 (b'', b'decode', None, _(b'apply any matching decode filter')),
1682 (b'', b'decode', None, _(b'apply any matching decode filter')),
1683 ]
1683 ]
1684 + walkopts
1684 + walkopts
1685 + formatteropts,
1685 + formatteropts,
1686 _(b'[OPTION]... FILE...'),
1686 _(b'[OPTION]... FILE...'),
1687 helpcategory=command.CATEGORY_FILE_CONTENTS,
1687 helpcategory=command.CATEGORY_FILE_CONTENTS,
1688 inferrepo=True,
1688 inferrepo=True,
1689 intents={INTENT_READONLY},
1689 intents={INTENT_READONLY},
1690 )
1690 )
1691 def cat(ui, repo, file1, *pats, **opts):
1691 def cat(ui, repo, file1, *pats, **opts):
1692 """output the current or given revision of files
1692 """output the current or given revision of files
1693
1693
1694 Print the specified files as they were at the given revision. If
1694 Print the specified files as they were at the given revision. If
1695 no revision is given, the parent of the working directory is used.
1695 no revision is given, the parent of the working directory is used.
1696
1696
1697 Output may be to a file, in which case the name of the file is
1697 Output may be to a file, in which case the name of the file is
1698 given using a template string. See :hg:`help templates`. In addition
1698 given using a template string. See :hg:`help templates`. In addition
1699 to the common template keywords, the following formatting rules are
1699 to the common template keywords, the following formatting rules are
1700 supported:
1700 supported:
1701
1701
1702 :``%%``: literal "%" character
1702 :``%%``: literal "%" character
1703 :``%s``: basename of file being printed
1703 :``%s``: basename of file being printed
1704 :``%d``: dirname of file being printed, or '.' if in repository root
1704 :``%d``: dirname of file being printed, or '.' if in repository root
1705 :``%p``: root-relative path name of file being printed
1705 :``%p``: root-relative path name of file being printed
1706 :``%H``: changeset hash (40 hexadecimal digits)
1706 :``%H``: changeset hash (40 hexadecimal digits)
1707 :``%R``: changeset revision number
1707 :``%R``: changeset revision number
1708 :``%h``: short-form changeset hash (12 hexadecimal digits)
1708 :``%h``: short-form changeset hash (12 hexadecimal digits)
1709 :``%r``: zero-padded changeset revision number
1709 :``%r``: zero-padded changeset revision number
1710 :``%b``: basename of the exporting repository
1710 :``%b``: basename of the exporting repository
1711 :``\\``: literal "\\" character
1711 :``\\``: literal "\\" character
1712
1712
1713 .. container:: verbose
1713 .. container:: verbose
1714
1714
1715 Template:
1715 Template:
1716
1716
1717 The following keywords are supported in addition to the common template
1717 The following keywords are supported in addition to the common template
1718 keywords and functions. See also :hg:`help templates`.
1718 keywords and functions. See also :hg:`help templates`.
1719
1719
1720 :data: String. File content.
1720 :data: String. File content.
1721 :path: String. Repository-absolute path of the file.
1721 :path: String. Repository-absolute path of the file.
1722
1722
1723 Returns 0 on success.
1723 Returns 0 on success.
1724 """
1724 """
1725 opts = pycompat.byteskwargs(opts)
1725 opts = pycompat.byteskwargs(opts)
1726 rev = opts.get(b'rev')
1726 rev = opts.get(b'rev')
1727 if rev:
1727 if rev:
1728 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
1728 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
1729 ctx = scmutil.revsingle(repo, rev)
1729 ctx = scmutil.revsingle(repo, rev)
1730 m = scmutil.match(ctx, (file1,) + pats, opts)
1730 m = scmutil.match(ctx, (file1,) + pats, opts)
1731 fntemplate = opts.pop(b'output', b'')
1731 fntemplate = opts.pop(b'output', b'')
1732 if cmdutil.isstdiofilename(fntemplate):
1732 if cmdutil.isstdiofilename(fntemplate):
1733 fntemplate = b''
1733 fntemplate = b''
1734
1734
1735 if fntemplate:
1735 if fntemplate:
1736 fm = formatter.nullformatter(ui, b'cat', opts)
1736 fm = formatter.nullformatter(ui, b'cat', opts)
1737 else:
1737 else:
1738 ui.pager(b'cat')
1738 ui.pager(b'cat')
1739 fm = ui.formatter(b'cat', opts)
1739 fm = ui.formatter(b'cat', opts)
1740 with fm:
1740 with fm:
1741 return cmdutil.cat(
1741 return cmdutil.cat(
1742 ui, repo, ctx, m, fm, fntemplate, b'', **pycompat.strkwargs(opts)
1742 ui, repo, ctx, m, fm, fntemplate, b'', **pycompat.strkwargs(opts)
1743 )
1743 )
1744
1744
1745
1745
1746 @command(
1746 @command(
1747 b'clone',
1747 b'clone',
1748 [
1748 [
1749 (
1749 (
1750 b'U',
1750 b'U',
1751 b'noupdate',
1751 b'noupdate',
1752 None,
1752 None,
1753 _(
1753 _(
1754 b'the clone will include an empty working '
1754 b'the clone will include an empty working '
1755 b'directory (only a repository)'
1755 b'directory (only a repository)'
1756 ),
1756 ),
1757 ),
1757 ),
1758 (
1758 (
1759 b'u',
1759 b'u',
1760 b'updaterev',
1760 b'updaterev',
1761 b'',
1761 b'',
1762 _(b'revision, tag, or branch to check out'),
1762 _(b'revision, tag, or branch to check out'),
1763 _(b'REV'),
1763 _(b'REV'),
1764 ),
1764 ),
1765 (
1765 (
1766 b'r',
1766 b'r',
1767 b'rev',
1767 b'rev',
1768 [],
1768 [],
1769 _(
1769 _(
1770 b'do not clone everything, but include this changeset'
1770 b'do not clone everything, but include this changeset'
1771 b' and its ancestors'
1771 b' and its ancestors'
1772 ),
1772 ),
1773 _(b'REV'),
1773 _(b'REV'),
1774 ),
1774 ),
1775 (
1775 (
1776 b'b',
1776 b'b',
1777 b'branch',
1777 b'branch',
1778 [],
1778 [],
1779 _(
1779 _(
1780 b'do not clone everything, but include this branch\'s'
1780 b'do not clone everything, but include this branch\'s'
1781 b' changesets and their ancestors'
1781 b' changesets and their ancestors'
1782 ),
1782 ),
1783 _(b'BRANCH'),
1783 _(b'BRANCH'),
1784 ),
1784 ),
1785 (b'', b'pull', None, _(b'use pull protocol to copy metadata')),
1785 (b'', b'pull', None, _(b'use pull protocol to copy metadata')),
1786 (b'', b'uncompressed', None, _(b'an alias to --stream (DEPRECATED)')),
1786 (b'', b'uncompressed', None, _(b'an alias to --stream (DEPRECATED)')),
1787 (b'', b'stream', None, _(b'clone with minimal data processing')),
1787 (b'', b'stream', None, _(b'clone with minimal data processing')),
1788 ]
1788 ]
1789 + remoteopts,
1789 + remoteopts,
1790 _(b'[OPTION]... SOURCE [DEST]'),
1790 _(b'[OPTION]... SOURCE [DEST]'),
1791 helpcategory=command.CATEGORY_REPO_CREATION,
1791 helpcategory=command.CATEGORY_REPO_CREATION,
1792 helpbasic=True,
1792 helpbasic=True,
1793 norepo=True,
1793 norepo=True,
1794 )
1794 )
1795 def clone(ui, source, dest=None, **opts):
1795 def clone(ui, source, dest=None, **opts):
1796 """make a copy of an existing repository
1796 """make a copy of an existing repository
1797
1797
1798 Create a copy of an existing repository in a new directory.
1798 Create a copy of an existing repository in a new directory.
1799
1799
1800 If no destination directory name is specified, it defaults to the
1800 If no destination directory name is specified, it defaults to the
1801 basename of the source.
1801 basename of the source.
1802
1802
1803 The location of the source is added to the new repository's
1803 The location of the source is added to the new repository's
1804 ``.hg/hgrc`` file, as the default to be used for future pulls.
1804 ``.hg/hgrc`` file, as the default to be used for future pulls.
1805
1805
1806 Only local paths and ``ssh://`` URLs are supported as
1806 Only local paths and ``ssh://`` URLs are supported as
1807 destinations. For ``ssh://`` destinations, no working directory or
1807 destinations. For ``ssh://`` destinations, no working directory or
1808 ``.hg/hgrc`` will be created on the remote side.
1808 ``.hg/hgrc`` will be created on the remote side.
1809
1809
1810 If the source repository has a bookmark called '@' set, that
1810 If the source repository has a bookmark called '@' set, that
1811 revision will be checked out in the new repository by default.
1811 revision will be checked out in the new repository by default.
1812
1812
1813 To check out a particular version, use -u/--update, or
1813 To check out a particular version, use -u/--update, or
1814 -U/--noupdate to create a clone with no working directory.
1814 -U/--noupdate to create a clone with no working directory.
1815
1815
1816 To pull only a subset of changesets, specify one or more revisions
1816 To pull only a subset of changesets, specify one or more revisions
1817 identifiers with -r/--rev or branches with -b/--branch. The
1817 identifiers with -r/--rev or branches with -b/--branch. The
1818 resulting clone will contain only the specified changesets and
1818 resulting clone will contain only the specified changesets and
1819 their ancestors. These options (or 'clone src#rev dest') imply
1819 their ancestors. These options (or 'clone src#rev dest') imply
1820 --pull, even for local source repositories.
1820 --pull, even for local source repositories.
1821
1821
1822 In normal clone mode, the remote normalizes repository data into a common
1822 In normal clone mode, the remote normalizes repository data into a common
1823 exchange format and the receiving end translates this data into its local
1823 exchange format and the receiving end translates this data into its local
1824 storage format. --stream activates a different clone mode that essentially
1824 storage format. --stream activates a different clone mode that essentially
1825 copies repository files from the remote with minimal data processing. This
1825 copies repository files from the remote with minimal data processing. This
1826 significantly reduces the CPU cost of a clone both remotely and locally.
1826 significantly reduces the CPU cost of a clone both remotely and locally.
1827 However, it often increases the transferred data size by 30-40%. This can
1827 However, it often increases the transferred data size by 30-40%. This can
1828 result in substantially faster clones where I/O throughput is plentiful,
1828 result in substantially faster clones where I/O throughput is plentiful,
1829 especially for larger repositories. A side-effect of --stream clones is
1829 especially for larger repositories. A side-effect of --stream clones is
1830 that storage settings and requirements on the remote are applied locally:
1830 that storage settings and requirements on the remote are applied locally:
1831 a modern client may inherit legacy or inefficient storage used by the
1831 a modern client may inherit legacy or inefficient storage used by the
1832 remote or a legacy Mercurial client may not be able to clone from a
1832 remote or a legacy Mercurial client may not be able to clone from a
1833 modern Mercurial remote.
1833 modern Mercurial remote.
1834
1834
1835 .. note::
1835 .. note::
1836
1836
1837 Specifying a tag will include the tagged changeset but not the
1837 Specifying a tag will include the tagged changeset but not the
1838 changeset containing the tag.
1838 changeset containing the tag.
1839
1839
1840 .. container:: verbose
1840 .. container:: verbose
1841
1841
1842 For efficiency, hardlinks are used for cloning whenever the
1842 For efficiency, hardlinks are used for cloning whenever the
1843 source and destination are on the same filesystem (note this
1843 source and destination are on the same filesystem (note this
1844 applies only to the repository data, not to the working
1844 applies only to the repository data, not to the working
1845 directory). Some filesystems, such as AFS, implement hardlinking
1845 directory). Some filesystems, such as AFS, implement hardlinking
1846 incorrectly, but do not report errors. In these cases, use the
1846 incorrectly, but do not report errors. In these cases, use the
1847 --pull option to avoid hardlinking.
1847 --pull option to avoid hardlinking.
1848
1848
1849 Mercurial will update the working directory to the first applicable
1849 Mercurial will update the working directory to the first applicable
1850 revision from this list:
1850 revision from this list:
1851
1851
1852 a) null if -U or the source repository has no changesets
1852 a) null if -U or the source repository has no changesets
1853 b) if -u . and the source repository is local, the first parent of
1853 b) if -u . and the source repository is local, the first parent of
1854 the source repository's working directory
1854 the source repository's working directory
1855 c) the changeset specified with -u (if a branch name, this means the
1855 c) the changeset specified with -u (if a branch name, this means the
1856 latest head of that branch)
1856 latest head of that branch)
1857 d) the changeset specified with -r
1857 d) the changeset specified with -r
1858 e) the tipmost head specified with -b
1858 e) the tipmost head specified with -b
1859 f) the tipmost head specified with the url#branch source syntax
1859 f) the tipmost head specified with the url#branch source syntax
1860 g) the revision marked with the '@' bookmark, if present
1860 g) the revision marked with the '@' bookmark, if present
1861 h) the tipmost head of the default branch
1861 h) the tipmost head of the default branch
1862 i) tip
1862 i) tip
1863
1863
1864 When cloning from servers that support it, Mercurial may fetch
1864 When cloning from servers that support it, Mercurial may fetch
1865 pre-generated data from a server-advertised URL or inline from the
1865 pre-generated data from a server-advertised URL or inline from the
1866 same stream. When this is done, hooks operating on incoming changesets
1866 same stream. When this is done, hooks operating on incoming changesets
1867 and changegroups may fire more than once, once for each pre-generated
1867 and changegroups may fire more than once, once for each pre-generated
1868 bundle and as well as for any additional remaining data. In addition,
1868 bundle and as well as for any additional remaining data. In addition,
1869 if an error occurs, the repository may be rolled back to a partial
1869 if an error occurs, the repository may be rolled back to a partial
1870 clone. This behavior may change in future releases.
1870 clone. This behavior may change in future releases.
1871 See :hg:`help -e clonebundles` for more.
1871 See :hg:`help -e clonebundles` for more.
1872
1872
1873 Examples:
1873 Examples:
1874
1874
1875 - clone a remote repository to a new directory named hg/::
1875 - clone a remote repository to a new directory named hg/::
1876
1876
1877 hg clone https://www.mercurial-scm.org/repo/hg/
1877 hg clone https://www.mercurial-scm.org/repo/hg/
1878
1878
1879 - create a lightweight local clone::
1879 - create a lightweight local clone::
1880
1880
1881 hg clone project/ project-feature/
1881 hg clone project/ project-feature/
1882
1882
1883 - clone from an absolute path on an ssh server (note double-slash)::
1883 - clone from an absolute path on an ssh server (note double-slash)::
1884
1884
1885 hg clone ssh://user@server//home/projects/alpha/
1885 hg clone ssh://user@server//home/projects/alpha/
1886
1886
1887 - do a streaming clone while checking out a specified version::
1887 - do a streaming clone while checking out a specified version::
1888
1888
1889 hg clone --stream http://server/repo -u 1.5
1889 hg clone --stream http://server/repo -u 1.5
1890
1890
1891 - create a repository without changesets after a particular revision::
1891 - create a repository without changesets after a particular revision::
1892
1892
1893 hg clone -r 04e544 experimental/ good/
1893 hg clone -r 04e544 experimental/ good/
1894
1894
1895 - clone (and track) a particular named branch::
1895 - clone (and track) a particular named branch::
1896
1896
1897 hg clone https://www.mercurial-scm.org/repo/hg/#stable
1897 hg clone https://www.mercurial-scm.org/repo/hg/#stable
1898
1898
1899 See :hg:`help urls` for details on specifying URLs.
1899 See :hg:`help urls` for details on specifying URLs.
1900
1900
1901 Returns 0 on success.
1901 Returns 0 on success.
1902 """
1902 """
1903 opts = pycompat.byteskwargs(opts)
1903 opts = pycompat.byteskwargs(opts)
1904 cmdutil.check_at_most_one_arg(opts, b'noupdate', b'updaterev')
1904 cmdutil.check_at_most_one_arg(opts, b'noupdate', b'updaterev')
1905
1905
1906 # --include/--exclude can come from narrow or sparse.
1906 # --include/--exclude can come from narrow or sparse.
1907 includepats, excludepats = None, None
1907 includepats, excludepats = None, None
1908
1908
1909 # hg.clone() differentiates between None and an empty set. So make sure
1909 # hg.clone() differentiates between None and an empty set. So make sure
1910 # patterns are sets if narrow is requested without patterns.
1910 # patterns are sets if narrow is requested without patterns.
1911 if opts.get(b'narrow'):
1911 if opts.get(b'narrow'):
1912 includepats = set()
1912 includepats = set()
1913 excludepats = set()
1913 excludepats = set()
1914
1914
1915 if opts.get(b'include'):
1915 if opts.get(b'include'):
1916 includepats = narrowspec.parsepatterns(opts.get(b'include'))
1916 includepats = narrowspec.parsepatterns(opts.get(b'include'))
1917 if opts.get(b'exclude'):
1917 if opts.get(b'exclude'):
1918 excludepats = narrowspec.parsepatterns(opts.get(b'exclude'))
1918 excludepats = narrowspec.parsepatterns(opts.get(b'exclude'))
1919
1919
1920 r = hg.clone(
1920 r = hg.clone(
1921 ui,
1921 ui,
1922 opts,
1922 opts,
1923 source,
1923 source,
1924 dest,
1924 dest,
1925 pull=opts.get(b'pull'),
1925 pull=opts.get(b'pull'),
1926 stream=opts.get(b'stream') or opts.get(b'uncompressed'),
1926 stream=opts.get(b'stream') or opts.get(b'uncompressed'),
1927 revs=opts.get(b'rev'),
1927 revs=opts.get(b'rev'),
1928 update=opts.get(b'updaterev') or not opts.get(b'noupdate'),
1928 update=opts.get(b'updaterev') or not opts.get(b'noupdate'),
1929 branch=opts.get(b'branch'),
1929 branch=opts.get(b'branch'),
1930 shareopts=opts.get(b'shareopts'),
1930 shareopts=opts.get(b'shareopts'),
1931 storeincludepats=includepats,
1931 storeincludepats=includepats,
1932 storeexcludepats=excludepats,
1932 storeexcludepats=excludepats,
1933 depth=opts.get(b'depth') or None,
1933 depth=opts.get(b'depth') or None,
1934 )
1934 )
1935
1935
1936 return r is None
1936 return r is None
1937
1937
1938
1938
1939 @command(
1939 @command(
1940 b'commit|ci',
1940 b'commit|ci',
1941 [
1941 [
1942 (
1942 (
1943 b'A',
1943 b'A',
1944 b'addremove',
1944 b'addremove',
1945 None,
1945 None,
1946 _(b'mark new/missing files as added/removed before committing'),
1946 _(b'mark new/missing files as added/removed before committing'),
1947 ),
1947 ),
1948 (b'', b'close-branch', None, _(b'mark a branch head as closed')),
1948 (b'', b'close-branch', None, _(b'mark a branch head as closed')),
1949 (b'', b'amend', None, _(b'amend the parent of the working directory')),
1949 (b'', b'amend', None, _(b'amend the parent of the working directory')),
1950 (b's', b'secret', None, _(b'use the secret phase for committing')),
1950 (b's', b'secret', None, _(b'use the secret phase for committing')),
1951 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
1951 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
1952 (
1952 (
1953 b'',
1953 b'',
1954 b'force-close-branch',
1954 b'force-close-branch',
1955 None,
1955 None,
1956 _(b'forcibly close branch from a non-head changeset (ADVANCED)'),
1956 _(b'forcibly close branch from a non-head changeset (ADVANCED)'),
1957 ),
1957 ),
1958 (b'i', b'interactive', None, _(b'use interactive mode')),
1958 (b'i', b'interactive', None, _(b'use interactive mode')),
1959 ]
1959 ]
1960 + walkopts
1960 + walkopts
1961 + commitopts
1961 + commitopts
1962 + commitopts2
1962 + commitopts2
1963 + subrepoopts,
1963 + subrepoopts,
1964 _(b'[OPTION]... [FILE]...'),
1964 _(b'[OPTION]... [FILE]...'),
1965 helpcategory=command.CATEGORY_COMMITTING,
1965 helpcategory=command.CATEGORY_COMMITTING,
1966 helpbasic=True,
1966 helpbasic=True,
1967 inferrepo=True,
1967 inferrepo=True,
1968 )
1968 )
1969 def commit(ui, repo, *pats, **opts):
1969 def commit(ui, repo, *pats, **opts):
1970 """commit the specified files or all outstanding changes
1970 """commit the specified files or all outstanding changes
1971
1971
1972 Commit changes to the given files into the repository. Unlike a
1972 Commit changes to the given files into the repository. Unlike a
1973 centralized SCM, this operation is a local operation. See
1973 centralized SCM, this operation is a local operation. See
1974 :hg:`push` for a way to actively distribute your changes.
1974 :hg:`push` for a way to actively distribute your changes.
1975
1975
1976 If a list of files is omitted, all changes reported by :hg:`status`
1976 If a list of files is omitted, all changes reported by :hg:`status`
1977 will be committed.
1977 will be committed.
1978
1978
1979 If you are committing the result of a merge, do not provide any
1979 If you are committing the result of a merge, do not provide any
1980 filenames or -I/-X filters.
1980 filenames or -I/-X filters.
1981
1981
1982 If no commit message is specified, Mercurial starts your
1982 If no commit message is specified, Mercurial starts your
1983 configured editor where you can enter a message. In case your
1983 configured editor where you can enter a message. In case your
1984 commit fails, you will find a backup of your message in
1984 commit fails, you will find a backup of your message in
1985 ``.hg/last-message.txt``.
1985 ``.hg/last-message.txt``.
1986
1986
1987 The --close-branch flag can be used to mark the current branch
1987 The --close-branch flag can be used to mark the current branch
1988 head closed. When all heads of a branch are closed, the branch
1988 head closed. When all heads of a branch are closed, the branch
1989 will be considered closed and no longer listed.
1989 will be considered closed and no longer listed.
1990
1990
1991 The --amend flag can be used to amend the parent of the
1991 The --amend flag can be used to amend the parent of the
1992 working directory with a new commit that contains the changes
1992 working directory with a new commit that contains the changes
1993 in the parent in addition to those currently reported by :hg:`status`,
1993 in the parent in addition to those currently reported by :hg:`status`,
1994 if there are any. The old commit is stored in a backup bundle in
1994 if there are any. The old commit is stored in a backup bundle in
1995 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
1995 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
1996 on how to restore it).
1996 on how to restore it).
1997
1997
1998 Message, user and date are taken from the amended commit unless
1998 Message, user and date are taken from the amended commit unless
1999 specified. When a message isn't specified on the command line,
1999 specified. When a message isn't specified on the command line,
2000 the editor will open with the message of the amended commit.
2000 the editor will open with the message of the amended commit.
2001
2001
2002 It is not possible to amend public changesets (see :hg:`help phases`)
2002 It is not possible to amend public changesets (see :hg:`help phases`)
2003 or changesets that have children.
2003 or changesets that have children.
2004
2004
2005 See :hg:`help dates` for a list of formats valid for -d/--date.
2005 See :hg:`help dates` for a list of formats valid for -d/--date.
2006
2006
2007 Returns 0 on success, 1 if nothing changed.
2007 Returns 0 on success, 1 if nothing changed.
2008
2008
2009 .. container:: verbose
2009 .. container:: verbose
2010
2010
2011 Examples:
2011 Examples:
2012
2012
2013 - commit all files ending in .py::
2013 - commit all files ending in .py::
2014
2014
2015 hg commit --include "set:**.py"
2015 hg commit --include "set:**.py"
2016
2016
2017 - commit all non-binary files::
2017 - commit all non-binary files::
2018
2018
2019 hg commit --exclude "set:binary()"
2019 hg commit --exclude "set:binary()"
2020
2020
2021 - amend the current commit and set the date to now::
2021 - amend the current commit and set the date to now::
2022
2022
2023 hg commit --amend --date now
2023 hg commit --amend --date now
2024 """
2024 """
2025 with repo.wlock(), repo.lock():
2025 with repo.wlock(), repo.lock():
2026 return _docommit(ui, repo, *pats, **opts)
2026 return _docommit(ui, repo, *pats, **opts)
2027
2027
2028
2028
2029 def _docommit(ui, repo, *pats, **opts):
2029 def _docommit(ui, repo, *pats, **opts):
2030 if opts.get('interactive'):
2030 if opts.get('interactive'):
2031 opts.pop('interactive')
2031 opts.pop('interactive')
2032 ret = cmdutil.dorecord(
2032 ret = cmdutil.dorecord(
2033 ui, repo, commit, None, False, cmdutil.recordfilter, *pats, **opts
2033 ui, repo, commit, None, False, cmdutil.recordfilter, *pats, **opts
2034 )
2034 )
2035 # ret can be 0 (no changes to record) or the value returned by
2035 # ret can be 0 (no changes to record) or the value returned by
2036 # commit(), 1 if nothing changed or None on success.
2036 # commit(), 1 if nothing changed or None on success.
2037 return 1 if ret == 0 else ret
2037 return 1 if ret == 0 else ret
2038
2038
2039 opts = pycompat.byteskwargs(opts)
2039 opts = pycompat.byteskwargs(opts)
2040 if opts.get(b'subrepos'):
2040 if opts.get(b'subrepos'):
2041 cmdutil.check_incompatible_arguments(opts, b'subrepos', [b'amend'])
2041 cmdutil.check_incompatible_arguments(opts, b'subrepos', [b'amend'])
2042 # Let --subrepos on the command line override config setting.
2042 # Let --subrepos on the command line override config setting.
2043 ui.setconfig(b'ui', b'commitsubrepos', True, b'commit')
2043 ui.setconfig(b'ui', b'commitsubrepos', True, b'commit')
2044
2044
2045 cmdutil.checkunfinished(repo, commit=True)
2045 cmdutil.checkunfinished(repo, commit=True)
2046
2046
2047 branch = repo[None].branch()
2047 branch = repo[None].branch()
2048 bheads = repo.branchheads(branch)
2048 bheads = repo.branchheads(branch)
2049 tip = repo.changelog.tip()
2049 tip = repo.changelog.tip()
2050
2050
2051 extra = {}
2051 extra = {}
2052 if opts.get(b'close_branch') or opts.get(b'force_close_branch'):
2052 if opts.get(b'close_branch') or opts.get(b'force_close_branch'):
2053 extra[b'close'] = b'1'
2053 extra[b'close'] = b'1'
2054
2054
2055 if repo[b'.'].closesbranch():
2055 if repo[b'.'].closesbranch():
2056 raise error.InputError(
2056 raise error.InputError(
2057 _(b'current revision is already a branch closing head')
2057 _(b'current revision is already a branch closing head')
2058 )
2058 )
2059 elif not bheads:
2059 elif not bheads:
2060 raise error.InputError(
2060 raise error.InputError(
2061 _(b'branch "%s" has no heads to close') % branch
2061 _(b'branch "%s" has no heads to close') % branch
2062 )
2062 )
2063 elif (
2063 elif (
2064 branch == repo[b'.'].branch()
2064 branch == repo[b'.'].branch()
2065 and repo[b'.'].node() not in bheads
2065 and repo[b'.'].node() not in bheads
2066 and not opts.get(b'force_close_branch')
2066 and not opts.get(b'force_close_branch')
2067 ):
2067 ):
2068 hint = _(
2068 hint = _(
2069 b'use --force-close-branch to close branch from a non-head'
2069 b'use --force-close-branch to close branch from a non-head'
2070 b' changeset'
2070 b' changeset'
2071 )
2071 )
2072 raise error.InputError(_(b'can only close branch heads'), hint=hint)
2072 raise error.InputError(_(b'can only close branch heads'), hint=hint)
2073 elif opts.get(b'amend'):
2073 elif opts.get(b'amend'):
2074 if (
2074 if (
2075 repo[b'.'].p1().branch() != branch
2075 repo[b'.'].p1().branch() != branch
2076 and repo[b'.'].p2().branch() != branch
2076 and repo[b'.'].p2().branch() != branch
2077 ):
2077 ):
2078 raise error.InputError(_(b'can only close branch heads'))
2078 raise error.InputError(_(b'can only close branch heads'))
2079
2079
2080 if opts.get(b'amend'):
2080 if opts.get(b'amend'):
2081 if ui.configbool(b'ui', b'commitsubrepos'):
2081 if ui.configbool(b'ui', b'commitsubrepos'):
2082 raise error.InputError(
2082 raise error.InputError(
2083 _(b'cannot amend with ui.commitsubrepos enabled')
2083 _(b'cannot amend with ui.commitsubrepos enabled')
2084 )
2084 )
2085
2085
2086 old = repo[b'.']
2086 old = repo[b'.']
2087 rewriteutil.precheck(repo, [old.rev()], b'amend')
2087 rewriteutil.precheck(repo, [old.rev()], b'amend')
2088
2088
2089 # Currently histedit gets confused if an amend happens while histedit
2089 # Currently histedit gets confused if an amend happens while histedit
2090 # is in progress. Since we have a checkunfinished command, we are
2090 # is in progress. Since we have a checkunfinished command, we are
2091 # temporarily honoring it.
2091 # temporarily honoring it.
2092 #
2092 #
2093 # Note: eventually this guard will be removed. Please do not expect
2093 # Note: eventually this guard will be removed. Please do not expect
2094 # this behavior to remain.
2094 # this behavior to remain.
2095 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2095 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2096 cmdutil.checkunfinished(repo)
2096 cmdutil.checkunfinished(repo)
2097
2097
2098 node = cmdutil.amend(ui, repo, old, extra, pats, opts)
2098 node = cmdutil.amend(ui, repo, old, extra, pats, opts)
2099 if node == old.node():
2099 if node == old.node():
2100 ui.status(_(b"nothing changed\n"))
2100 ui.status(_(b"nothing changed\n"))
2101 return 1
2101 return 1
2102 else:
2102 else:
2103
2103
2104 def commitfunc(ui, repo, message, match, opts):
2104 def commitfunc(ui, repo, message, match, opts):
2105 overrides = {}
2105 overrides = {}
2106 if opts.get(b'secret'):
2106 if opts.get(b'secret'):
2107 overrides[(b'phases', b'new-commit')] = b'secret'
2107 overrides[(b'phases', b'new-commit')] = b'secret'
2108
2108
2109 baseui = repo.baseui
2109 baseui = repo.baseui
2110 with baseui.configoverride(overrides, b'commit'):
2110 with baseui.configoverride(overrides, b'commit'):
2111 with ui.configoverride(overrides, b'commit'):
2111 with ui.configoverride(overrides, b'commit'):
2112 editform = cmdutil.mergeeditform(
2112 editform = cmdutil.mergeeditform(
2113 repo[None], b'commit.normal'
2113 repo[None], b'commit.normal'
2114 )
2114 )
2115 editor = cmdutil.getcommiteditor(
2115 editor = cmdutil.getcommiteditor(
2116 editform=editform, **pycompat.strkwargs(opts)
2116 editform=editform, **pycompat.strkwargs(opts)
2117 )
2117 )
2118 return repo.commit(
2118 return repo.commit(
2119 message,
2119 message,
2120 opts.get(b'user'),
2120 opts.get(b'user'),
2121 opts.get(b'date'),
2121 opts.get(b'date'),
2122 match,
2122 match,
2123 editor=editor,
2123 editor=editor,
2124 extra=extra,
2124 extra=extra,
2125 )
2125 )
2126
2126
2127 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
2127 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
2128
2128
2129 if not node:
2129 if not node:
2130 stat = cmdutil.postcommitstatus(repo, pats, opts)
2130 stat = cmdutil.postcommitstatus(repo, pats, opts)
2131 if stat.deleted:
2131 if stat.deleted:
2132 ui.status(
2132 ui.status(
2133 _(
2133 _(
2134 b"nothing changed (%d missing files, see "
2134 b"nothing changed (%d missing files, see "
2135 b"'hg status')\n"
2135 b"'hg status')\n"
2136 )
2136 )
2137 % len(stat.deleted)
2137 % len(stat.deleted)
2138 )
2138 )
2139 else:
2139 else:
2140 ui.status(_(b"nothing changed\n"))
2140 ui.status(_(b"nothing changed\n"))
2141 return 1
2141 return 1
2142
2142
2143 cmdutil.commitstatus(repo, node, branch, bheads, tip, opts)
2143 cmdutil.commitstatus(repo, node, branch, bheads, tip, opts)
2144
2144
2145 if not ui.quiet and ui.configbool(b'commands', b'commit.post-status'):
2145 if not ui.quiet and ui.configbool(b'commands', b'commit.post-status'):
2146 status(
2146 status(
2147 ui,
2147 ui,
2148 repo,
2148 repo,
2149 modified=True,
2149 modified=True,
2150 added=True,
2150 added=True,
2151 removed=True,
2151 removed=True,
2152 deleted=True,
2152 deleted=True,
2153 unknown=True,
2153 unknown=True,
2154 subrepos=opts.get(b'subrepos'),
2154 subrepos=opts.get(b'subrepos'),
2155 )
2155 )
2156
2156
2157
2157
2158 @command(
2158 @command(
2159 b'config|showconfig|debugconfig',
2159 b'config|showconfig|debugconfig',
2160 [
2160 [
2161 (b'u', b'untrusted', None, _(b'show untrusted configuration options')),
2161 (b'u', b'untrusted', None, _(b'show untrusted configuration options')),
2162 (b'e', b'edit', None, _(b'edit user config')),
2162 (b'e', b'edit', None, _(b'edit user config')),
2163 (b'l', b'local', None, _(b'edit repository config')),
2163 (b'l', b'local', None, _(b'edit repository config')),
2164 (
2164 (
2165 b'',
2165 b'',
2166 b'shared',
2166 b'shared',
2167 None,
2167 None,
2168 _(b'edit shared source repository config (EXPERIMENTAL)'),
2168 _(b'edit shared source repository config (EXPERIMENTAL)'),
2169 ),
2169 ),
2170 (b'', b'non-shared', None, _(b'edit non shared config (EXPERIMENTAL)')),
2170 (b'', b'non-shared', None, _(b'edit non shared config (EXPERIMENTAL)')),
2171 (b'g', b'global', None, _(b'edit global config')),
2171 (b'g', b'global', None, _(b'edit global config')),
2172 ]
2172 ]
2173 + formatteropts,
2173 + formatteropts,
2174 _(b'[-u] [NAME]...'),
2174 _(b'[-u] [NAME]...'),
2175 helpcategory=command.CATEGORY_HELP,
2175 helpcategory=command.CATEGORY_HELP,
2176 optionalrepo=True,
2176 optionalrepo=True,
2177 intents={INTENT_READONLY},
2177 intents={INTENT_READONLY},
2178 )
2178 )
2179 def config(ui, repo, *values, **opts):
2179 def config(ui, repo, *values, **opts):
2180 """show combined config settings from all hgrc files
2180 """show combined config settings from all hgrc files
2181
2181
2182 With no arguments, print names and values of all config items.
2182 With no arguments, print names and values of all config items.
2183
2183
2184 With one argument of the form section.name, print just the value
2184 With one argument of the form section.name, print just the value
2185 of that config item.
2185 of that config item.
2186
2186
2187 With multiple arguments, print names and values of all config
2187 With multiple arguments, print names and values of all config
2188 items with matching section names or section.names.
2188 items with matching section names or section.names.
2189
2189
2190 With --edit, start an editor on the user-level config file. With
2190 With --edit, start an editor on the user-level config file. With
2191 --global, edit the system-wide config file. With --local, edit the
2191 --global, edit the system-wide config file. With --local, edit the
2192 repository-level config file.
2192 repository-level config file.
2193
2193
2194 With --debug, the source (filename and line number) is printed
2194 With --debug, the source (filename and line number) is printed
2195 for each config item.
2195 for each config item.
2196
2196
2197 See :hg:`help config` for more information about config files.
2197 See :hg:`help config` for more information about config files.
2198
2198
2199 .. container:: verbose
2199 .. container:: verbose
2200
2200
2201 --non-shared flag is used to edit `.hg/hgrc-not-shared` config file.
2201 --non-shared flag is used to edit `.hg/hgrc-not-shared` config file.
2202 This file is not shared across shares when in share-safe mode.
2202 This file is not shared across shares when in share-safe mode.
2203
2203
2204 Template:
2204 Template:
2205
2205
2206 The following keywords are supported. See also :hg:`help templates`.
2206 The following keywords are supported. See also :hg:`help templates`.
2207
2207
2208 :name: String. Config name.
2208 :name: String. Config name.
2209 :source: String. Filename and line number where the item is defined.
2209 :source: String. Filename and line number where the item is defined.
2210 :value: String. Config value.
2210 :value: String. Config value.
2211
2211
2212 The --shared flag can be used to edit the config file of shared source
2212 The --shared flag can be used to edit the config file of shared source
2213 repository. It only works when you have shared using the experimental
2213 repository. It only works when you have shared using the experimental
2214 share safe feature.
2214 share safe feature.
2215
2215
2216 Returns 0 on success, 1 if NAME does not exist.
2216 Returns 0 on success, 1 if NAME does not exist.
2217
2217
2218 """
2218 """
2219
2219
2220 opts = pycompat.byteskwargs(opts)
2220 opts = pycompat.byteskwargs(opts)
2221 editopts = (b'edit', b'local', b'global', b'shared', b'non_shared')
2221 editopts = (b'edit', b'local', b'global', b'shared', b'non_shared')
2222 if any(opts.get(o) for o in editopts):
2222 if any(opts.get(o) for o in editopts):
2223 cmdutil.check_at_most_one_arg(opts, *editopts[1:])
2223 cmdutil.check_at_most_one_arg(opts, *editopts[1:])
2224 if opts.get(b'local'):
2224 if opts.get(b'local'):
2225 if not repo:
2225 if not repo:
2226 raise error.InputError(
2226 raise error.InputError(
2227 _(b"can't use --local outside a repository")
2227 _(b"can't use --local outside a repository")
2228 )
2228 )
2229 paths = [repo.vfs.join(b'hgrc')]
2229 paths = [repo.vfs.join(b'hgrc')]
2230 elif opts.get(b'global'):
2230 elif opts.get(b'global'):
2231 paths = rcutil.systemrcpath()
2231 paths = rcutil.systemrcpath()
2232 elif opts.get(b'shared'):
2232 elif opts.get(b'shared'):
2233 if not repo.shared():
2233 if not repo.shared():
2234 raise error.InputError(
2234 raise error.InputError(
2235 _(b"repository is not shared; can't use --shared")
2235 _(b"repository is not shared; can't use --shared")
2236 )
2236 )
2237 if requirements.SHARESAFE_REQUIREMENT not in repo.requirements:
2237 if requirements.SHARESAFE_REQUIREMENT not in repo.requirements:
2238 raise error.InputError(
2238 raise error.InputError(
2239 _(
2239 _(
2240 b"share safe feature not enabled; "
2240 b"share safe feature not enabled; "
2241 b"unable to edit shared source repository config"
2241 b"unable to edit shared source repository config"
2242 )
2242 )
2243 )
2243 )
2244 paths = [vfsmod.vfs(repo.sharedpath).join(b'hgrc')]
2244 paths = [vfsmod.vfs(repo.sharedpath).join(b'hgrc')]
2245 elif opts.get(b'non_shared'):
2245 elif opts.get(b'non_shared'):
2246 paths = [repo.vfs.join(b'hgrc-not-shared')]
2246 paths = [repo.vfs.join(b'hgrc-not-shared')]
2247 else:
2247 else:
2248 paths = rcutil.userrcpath()
2248 paths = rcutil.userrcpath()
2249
2249
2250 for f in paths:
2250 for f in paths:
2251 if os.path.exists(f):
2251 if os.path.exists(f):
2252 break
2252 break
2253 else:
2253 else:
2254 if opts.get(b'global'):
2254 if opts.get(b'global'):
2255 samplehgrc = uimod.samplehgrcs[b'global']
2255 samplehgrc = uimod.samplehgrcs[b'global']
2256 elif opts.get(b'local'):
2256 elif opts.get(b'local'):
2257 samplehgrc = uimod.samplehgrcs[b'local']
2257 samplehgrc = uimod.samplehgrcs[b'local']
2258 else:
2258 else:
2259 samplehgrc = uimod.samplehgrcs[b'user']
2259 samplehgrc = uimod.samplehgrcs[b'user']
2260
2260
2261 f = paths[0]
2261 f = paths[0]
2262 fp = open(f, b"wb")
2262 fp = open(f, b"wb")
2263 fp.write(util.tonativeeol(samplehgrc))
2263 fp.write(util.tonativeeol(samplehgrc))
2264 fp.close()
2264 fp.close()
2265
2265
2266 editor = ui.geteditor()
2266 editor = ui.geteditor()
2267 ui.system(
2267 ui.system(
2268 b"%s \"%s\"" % (editor, f),
2268 b"%s \"%s\"" % (editor, f),
2269 onerr=error.InputError,
2269 onerr=error.InputError,
2270 errprefix=_(b"edit failed"),
2270 errprefix=_(b"edit failed"),
2271 blockedtag=b'config_edit',
2271 blockedtag=b'config_edit',
2272 )
2272 )
2273 return
2273 return
2274 ui.pager(b'config')
2274 ui.pager(b'config')
2275 fm = ui.formatter(b'config', opts)
2275 fm = ui.formatter(b'config', opts)
2276 for t, f in rcutil.rccomponents():
2276 for t, f in rcutil.rccomponents():
2277 if t == b'path':
2277 if t == b'path':
2278 ui.debug(b'read config from: %s\n' % f)
2278 ui.debug(b'read config from: %s\n' % f)
2279 elif t == b'resource':
2279 elif t == b'resource':
2280 ui.debug(b'read config from: resource:%s.%s\n' % (f[0], f[1]))
2280 ui.debug(b'read config from: resource:%s.%s\n' % (f[0], f[1]))
2281 elif t == b'items':
2281 elif t == b'items':
2282 # Don't print anything for 'items'.
2282 # Don't print anything for 'items'.
2283 pass
2283 pass
2284 else:
2284 else:
2285 raise error.ProgrammingError(b'unknown rctype: %s' % t)
2285 raise error.ProgrammingError(b'unknown rctype: %s' % t)
2286 untrusted = bool(opts.get(b'untrusted'))
2286 untrusted = bool(opts.get(b'untrusted'))
2287
2287
2288 selsections = selentries = []
2288 selsections = selentries = []
2289 if values:
2289 if values:
2290 selsections = [v for v in values if b'.' not in v]
2290 selsections = [v for v in values if b'.' not in v]
2291 selentries = [v for v in values if b'.' in v]
2291 selentries = [v for v in values if b'.' in v]
2292 uniquesel = len(selentries) == 1 and not selsections
2292 uniquesel = len(selentries) == 1 and not selsections
2293 selsections = set(selsections)
2293 selsections = set(selsections)
2294 selentries = set(selentries)
2294 selentries = set(selentries)
2295
2295
2296 matched = False
2296 matched = False
2297 for section, name, value in ui.walkconfig(untrusted=untrusted):
2297 for section, name, value in ui.walkconfig(untrusted=untrusted):
2298 source = ui.configsource(section, name, untrusted)
2298 source = ui.configsource(section, name, untrusted)
2299 value = pycompat.bytestr(value)
2299 value = pycompat.bytestr(value)
2300 defaultvalue = ui.configdefault(section, name)
2300 defaultvalue = ui.configdefault(section, name)
2301 if fm.isplain():
2301 if fm.isplain():
2302 source = source or b'none'
2302 source = source or b'none'
2303 value = value.replace(b'\n', b'\\n')
2303 value = value.replace(b'\n', b'\\n')
2304 entryname = section + b'.' + name
2304 entryname = section + b'.' + name
2305 if values and not (section in selsections or entryname in selentries):
2305 if values and not (section in selsections or entryname in selentries):
2306 continue
2306 continue
2307 fm.startitem()
2307 fm.startitem()
2308 fm.condwrite(ui.debugflag, b'source', b'%s: ', source)
2308 fm.condwrite(ui.debugflag, b'source', b'%s: ', source)
2309 if uniquesel:
2309 if uniquesel:
2310 fm.data(name=entryname)
2310 fm.data(name=entryname)
2311 fm.write(b'value', b'%s\n', value)
2311 fm.write(b'value', b'%s\n', value)
2312 else:
2312 else:
2313 fm.write(b'name value', b'%s=%s\n', entryname, value)
2313 fm.write(b'name value', b'%s=%s\n', entryname, value)
2314 if formatter.isprintable(defaultvalue):
2314 if formatter.isprintable(defaultvalue):
2315 fm.data(defaultvalue=defaultvalue)
2315 fm.data(defaultvalue=defaultvalue)
2316 elif isinstance(defaultvalue, list) and all(
2316 elif isinstance(defaultvalue, list) and all(
2317 formatter.isprintable(e) for e in defaultvalue
2317 formatter.isprintable(e) for e in defaultvalue
2318 ):
2318 ):
2319 fm.data(defaultvalue=fm.formatlist(defaultvalue, name=b'value'))
2319 fm.data(defaultvalue=fm.formatlist(defaultvalue, name=b'value'))
2320 # TODO: no idea how to process unsupported defaultvalue types
2320 # TODO: no idea how to process unsupported defaultvalue types
2321 matched = True
2321 matched = True
2322 fm.end()
2322 fm.end()
2323 if matched:
2323 if matched:
2324 return 0
2324 return 0
2325 return 1
2325 return 1
2326
2326
2327
2327
2328 @command(
2328 @command(
2329 b'continue',
2329 b'continue',
2330 dryrunopts,
2330 dryrunopts,
2331 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2331 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2332 helpbasic=True,
2332 helpbasic=True,
2333 )
2333 )
2334 def continuecmd(ui, repo, **opts):
2334 def continuecmd(ui, repo, **opts):
2335 """resumes an interrupted operation (EXPERIMENTAL)
2335 """resumes an interrupted operation (EXPERIMENTAL)
2336
2336
2337 Finishes a multistep operation like graft, histedit, rebase, merge,
2337 Finishes a multistep operation like graft, histedit, rebase, merge,
2338 and unshelve if they are in an interrupted state.
2338 and unshelve if they are in an interrupted state.
2339
2339
2340 use --dry-run/-n to dry run the command.
2340 use --dry-run/-n to dry run the command.
2341 """
2341 """
2342 dryrun = opts.get('dry_run')
2342 dryrun = opts.get('dry_run')
2343 contstate = cmdutil.getunfinishedstate(repo)
2343 contstate = cmdutil.getunfinishedstate(repo)
2344 if not contstate:
2344 if not contstate:
2345 raise error.StateError(_(b'no operation in progress'))
2345 raise error.StateError(_(b'no operation in progress'))
2346 if not contstate.continuefunc:
2346 if not contstate.continuefunc:
2347 raise error.StateError(
2347 raise error.StateError(
2348 (
2348 (
2349 _(b"%s in progress but does not support 'hg continue'")
2349 _(b"%s in progress but does not support 'hg continue'")
2350 % (contstate._opname)
2350 % (contstate._opname)
2351 ),
2351 ),
2352 hint=contstate.continuemsg(),
2352 hint=contstate.continuemsg(),
2353 )
2353 )
2354 if dryrun:
2354 if dryrun:
2355 ui.status(_(b'%s in progress, will be resumed\n') % (contstate._opname))
2355 ui.status(_(b'%s in progress, will be resumed\n') % (contstate._opname))
2356 return
2356 return
2357 return contstate.continuefunc(ui, repo)
2357 return contstate.continuefunc(ui, repo)
2358
2358
2359
2359
2360 @command(
2360 @command(
2361 b'copy|cp',
2361 b'copy|cp',
2362 [
2362 [
2363 (b'', b'forget', None, _(b'unmark a destination file as copied')),
2363 (b'', b'forget', None, _(b'unmark a destination file as copied')),
2364 (b'A', b'after', None, _(b'record a copy that has already occurred')),
2364 (b'A', b'after', None, _(b'record a copy that has already occurred')),
2365 (
2365 (
2366 b'',
2366 b'',
2367 b'at-rev',
2367 b'at-rev',
2368 b'',
2368 b'',
2369 _(b'(un)mark copies in the given revision (EXPERIMENTAL)'),
2369 _(b'(un)mark copies in the given revision (EXPERIMENTAL)'),
2370 _(b'REV'),
2370 _(b'REV'),
2371 ),
2371 ),
2372 (
2372 (
2373 b'f',
2373 b'f',
2374 b'force',
2374 b'force',
2375 None,
2375 None,
2376 _(b'forcibly copy over an existing managed file'),
2376 _(b'forcibly copy over an existing managed file'),
2377 ),
2377 ),
2378 ]
2378 ]
2379 + walkopts
2379 + walkopts
2380 + dryrunopts,
2380 + dryrunopts,
2381 _(b'[OPTION]... (SOURCE... DEST | --forget DEST...)'),
2381 _(b'[OPTION]... (SOURCE... DEST | --forget DEST...)'),
2382 helpcategory=command.CATEGORY_FILE_CONTENTS,
2382 helpcategory=command.CATEGORY_FILE_CONTENTS,
2383 )
2383 )
2384 def copy(ui, repo, *pats, **opts):
2384 def copy(ui, repo, *pats, **opts):
2385 """mark files as copied for the next commit
2385 """mark files as copied for the next commit
2386
2386
2387 Mark dest as having copies of source files. If dest is a
2387 Mark dest as having copies of source files. If dest is a
2388 directory, copies are put in that directory. If dest is a file,
2388 directory, copies are put in that directory. If dest is a file,
2389 the source must be a single file.
2389 the source must be a single file.
2390
2390
2391 By default, this command copies the contents of files as they
2391 By default, this command copies the contents of files as they
2392 exist in the working directory. If invoked with -A/--after, the
2392 exist in the working directory. If invoked with -A/--after, the
2393 operation is recorded, but no copying is performed.
2393 operation is recorded, but no copying is performed.
2394
2394
2395 To undo marking a destination file as copied, use --forget. With that
2395 To undo marking a destination file as copied, use --forget. With that
2396 option, all given (positional) arguments are unmarked as copies. The
2396 option, all given (positional) arguments are unmarked as copies. The
2397 destination file(s) will be left in place (still tracked).
2397 destination file(s) will be left in place (still tracked).
2398
2398
2399 This command takes effect with the next commit by default.
2399 This command takes effect with the next commit by default.
2400
2400
2401 Returns 0 on success, 1 if errors are encountered.
2401 Returns 0 on success, 1 if errors are encountered.
2402 """
2402 """
2403 opts = pycompat.byteskwargs(opts)
2403 opts = pycompat.byteskwargs(opts)
2404 with repo.wlock():
2404 with repo.wlock():
2405 return cmdutil.copy(ui, repo, pats, opts)
2405 return cmdutil.copy(ui, repo, pats, opts)
2406
2406
2407
2407
2408 @command(
2408 @command(
2409 b'debugcommands',
2409 b'debugcommands',
2410 [],
2410 [],
2411 _(b'[COMMAND]'),
2411 _(b'[COMMAND]'),
2412 helpcategory=command.CATEGORY_HELP,
2412 helpcategory=command.CATEGORY_HELP,
2413 norepo=True,
2413 norepo=True,
2414 )
2414 )
2415 def debugcommands(ui, cmd=b'', *args):
2415 def debugcommands(ui, cmd=b'', *args):
2416 """list all available commands and options"""
2416 """list all available commands and options"""
2417 for cmd, vals in sorted(pycompat.iteritems(table)):
2417 for cmd, vals in sorted(pycompat.iteritems(table)):
2418 cmd = cmd.split(b'|')[0]
2418 cmd = cmd.split(b'|')[0]
2419 opts = b', '.join([i[1] for i in vals[1]])
2419 opts = b', '.join([i[1] for i in vals[1]])
2420 ui.write(b'%s: %s\n' % (cmd, opts))
2420 ui.write(b'%s: %s\n' % (cmd, opts))
2421
2421
2422
2422
2423 @command(
2423 @command(
2424 b'debugcomplete',
2424 b'debugcomplete',
2425 [(b'o', b'options', None, _(b'show the command options'))],
2425 [(b'o', b'options', None, _(b'show the command options'))],
2426 _(b'[-o] CMD'),
2426 _(b'[-o] CMD'),
2427 helpcategory=command.CATEGORY_HELP,
2427 helpcategory=command.CATEGORY_HELP,
2428 norepo=True,
2428 norepo=True,
2429 )
2429 )
2430 def debugcomplete(ui, cmd=b'', **opts):
2430 def debugcomplete(ui, cmd=b'', **opts):
2431 """returns the completion list associated with the given command"""
2431 """returns the completion list associated with the given command"""
2432
2432
2433 if opts.get('options'):
2433 if opts.get('options'):
2434 options = []
2434 options = []
2435 otables = [globalopts]
2435 otables = [globalopts]
2436 if cmd:
2436 if cmd:
2437 aliases, entry = cmdutil.findcmd(cmd, table, False)
2437 aliases, entry = cmdutil.findcmd(cmd, table, False)
2438 otables.append(entry[1])
2438 otables.append(entry[1])
2439 for t in otables:
2439 for t in otables:
2440 for o in t:
2440 for o in t:
2441 if b"(DEPRECATED)" in o[3]:
2441 if b"(DEPRECATED)" in o[3]:
2442 continue
2442 continue
2443 if o[0]:
2443 if o[0]:
2444 options.append(b'-%s' % o[0])
2444 options.append(b'-%s' % o[0])
2445 options.append(b'--%s' % o[1])
2445 options.append(b'--%s' % o[1])
2446 ui.write(b"%s\n" % b"\n".join(options))
2446 ui.write(b"%s\n" % b"\n".join(options))
2447 return
2447 return
2448
2448
2449 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table)
2449 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table)
2450 if ui.verbose:
2450 if ui.verbose:
2451 cmdlist = [b' '.join(c[0]) for c in cmdlist.values()]
2451 cmdlist = [b' '.join(c[0]) for c in cmdlist.values()]
2452 ui.write(b"%s\n" % b"\n".join(sorted(cmdlist)))
2452 ui.write(b"%s\n" % b"\n".join(sorted(cmdlist)))
2453
2453
2454
2454
2455 @command(
2455 @command(
2456 b'diff',
2456 b'diff',
2457 [
2457 [
2458 (b'r', b'rev', [], _(b'revision'), _(b'REV')),
2458 (b'r', b'rev', [], _(b'revision'), _(b'REV')),
2459 (b'', b'from', b'', _(b'revision to diff from'), _(b'REV')),
2459 (b'', b'from', b'', _(b'revision to diff from'), _(b'REV')),
2460 (b'', b'to', b'', _(b'revision to diff to'), _(b'REV')),
2460 (b'', b'to', b'', _(b'revision to diff to'), _(b'REV')),
2461 (b'c', b'change', b'', _(b'change made by revision'), _(b'REV')),
2461 (b'c', b'change', b'', _(b'change made by revision'), _(b'REV')),
2462 ]
2462 ]
2463 + diffopts
2463 + diffopts
2464 + diffopts2
2464 + diffopts2
2465 + walkopts
2465 + walkopts
2466 + subrepoopts,
2466 + subrepoopts,
2467 _(b'[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'),
2467 _(b'[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'),
2468 helpcategory=command.CATEGORY_FILE_CONTENTS,
2468 helpcategory=command.CATEGORY_FILE_CONTENTS,
2469 helpbasic=True,
2469 helpbasic=True,
2470 inferrepo=True,
2470 inferrepo=True,
2471 intents={INTENT_READONLY},
2471 intents={INTENT_READONLY},
2472 )
2472 )
2473 def diff(ui, repo, *pats, **opts):
2473 def diff(ui, repo, *pats, **opts):
2474 """diff repository (or selected files)
2474 """diff repository (or selected files)
2475
2475
2476 Show differences between revisions for the specified files.
2476 Show differences between revisions for the specified files.
2477
2477
2478 Differences between files are shown using the unified diff format.
2478 Differences between files are shown using the unified diff format.
2479
2479
2480 .. note::
2480 .. note::
2481
2481
2482 :hg:`diff` may generate unexpected results for merges, as it will
2482 :hg:`diff` may generate unexpected results for merges, as it will
2483 default to comparing against the working directory's first
2483 default to comparing against the working directory's first
2484 parent changeset if no revisions are specified.
2484 parent changeset if no revisions are specified.
2485
2485
2486 When two revision arguments are given, then changes are shown
2486 By default, the working directory files are compared to its first parent. To
2487 between those revisions. If only one revision is specified then
2487 see the differences from another revision, use --from. To see the difference
2488 that revision is compared to the working directory, and, when no
2488 to another revision, use --to. For example, :hg:`diff --from .^` will show
2489 revisions are specified, the working directory files are compared
2489 the differences from the working copy's grandparent to the working copy,
2490 to its first parent.
2490 :hg:`diff --to .` will show the diff from the working copy to its parent
2491
2491 (i.e. the reverse of the default), and :hg:`diff --from 1.0 --to 1.2` will
2492 Alternatively you can specify -c/--change with a revision to see
2492 show the diff between those two revisions.
2493 the changes in that changeset relative to its first parent.
2493
2494 Alternatively you can specify -c/--change with a revision to see the changes
2495 in that changeset relative to its first parent (i.e. :hg:`diff -c 42` is
2496 equivalent to :hg:`diff --from 42^ --to 42`)
2494
2497
2495 Without the -a/--text option, diff will avoid generating diffs of
2498 Without the -a/--text option, diff will avoid generating diffs of
2496 files it detects as binary. With -a, diff will generate a diff
2499 files it detects as binary. With -a, diff will generate a diff
2497 anyway, probably with undesirable results.
2500 anyway, probably with undesirable results.
2498
2501
2499 Use the -g/--git option to generate diffs in the git extended diff
2502 Use the -g/--git option to generate diffs in the git extended diff
2500 format. For more information, read :hg:`help diffs`.
2503 format. For more information, read :hg:`help diffs`.
2501
2504
2502 .. container:: verbose
2505 .. container:: verbose
2503
2506
2504 Examples:
2507 Examples:
2505
2508
2506 - compare a file in the current working directory to its parent::
2509 - compare a file in the current working directory to its parent::
2507
2510
2508 hg diff foo.c
2511 hg diff foo.c
2509
2512
2510 - compare two historical versions of a directory, with rename info::
2513 - compare two historical versions of a directory, with rename info::
2511
2514
2512 hg diff --git --from 1.0 --to 1.2 lib/
2515 hg diff --git --from 1.0 --to 1.2 lib/
2513
2516
2514 - get change stats relative to the last change on some date::
2517 - get change stats relative to the last change on some date::
2515
2518
2516 hg diff --stat --from "date('may 2')"
2519 hg diff --stat --from "date('may 2')"
2517
2520
2518 - diff all newly-added files that contain a keyword::
2521 - diff all newly-added files that contain a keyword::
2519
2522
2520 hg diff "set:added() and grep(GNU)"
2523 hg diff "set:added() and grep(GNU)"
2521
2524
2522 - compare a revision and its parents::
2525 - compare a revision and its parents::
2523
2526
2524 hg diff -c 9353 # compare against first parent
2527 hg diff -c 9353 # compare against first parent
2525 hg diff --from 9353^ --to 9353 # same using revset syntax
2528 hg diff --from 9353^ --to 9353 # same using revset syntax
2526 hg diff --from 9353^2 --to 9353 # compare against the second parent
2529 hg diff --from 9353^2 --to 9353 # compare against the second parent
2527
2530
2528 Returns 0 on success.
2531 Returns 0 on success.
2529 """
2532 """
2530
2533
2531 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
2534 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
2532 opts = pycompat.byteskwargs(opts)
2535 opts = pycompat.byteskwargs(opts)
2533 revs = opts.get(b'rev')
2536 revs = opts.get(b'rev')
2534 change = opts.get(b'change')
2537 change = opts.get(b'change')
2535 from_rev = opts.get(b'from')
2538 from_rev = opts.get(b'from')
2536 to_rev = opts.get(b'to')
2539 to_rev = opts.get(b'to')
2537 stat = opts.get(b'stat')
2540 stat = opts.get(b'stat')
2538 reverse = opts.get(b'reverse')
2541 reverse = opts.get(b'reverse')
2539
2542
2540 cmdutil.check_incompatible_arguments(opts, b'from', [b'rev', b'change'])
2543 cmdutil.check_incompatible_arguments(opts, b'from', [b'rev', b'change'])
2541 cmdutil.check_incompatible_arguments(opts, b'to', [b'rev', b'change'])
2544 cmdutil.check_incompatible_arguments(opts, b'to', [b'rev', b'change'])
2542 if change:
2545 if change:
2543 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
2546 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
2544 ctx2 = scmutil.revsingle(repo, change, None)
2547 ctx2 = scmutil.revsingle(repo, change, None)
2545 ctx1 = ctx2.p1()
2548 ctx1 = ctx2.p1()
2546 elif from_rev or to_rev:
2549 elif from_rev or to_rev:
2547 repo = scmutil.unhidehashlikerevs(
2550 repo = scmutil.unhidehashlikerevs(
2548 repo, [from_rev] + [to_rev], b'nowarn'
2551 repo, [from_rev] + [to_rev], b'nowarn'
2549 )
2552 )
2550 ctx1 = scmutil.revsingle(repo, from_rev, None)
2553 ctx1 = scmutil.revsingle(repo, from_rev, None)
2551 ctx2 = scmutil.revsingle(repo, to_rev, None)
2554 ctx2 = scmutil.revsingle(repo, to_rev, None)
2552 else:
2555 else:
2553 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
2556 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
2554 ctx1, ctx2 = scmutil.revpair(repo, revs)
2557 ctx1, ctx2 = scmutil.revpair(repo, revs)
2555
2558
2556 if reverse:
2559 if reverse:
2557 ctxleft = ctx2
2560 ctxleft = ctx2
2558 ctxright = ctx1
2561 ctxright = ctx1
2559 else:
2562 else:
2560 ctxleft = ctx1
2563 ctxleft = ctx1
2561 ctxright = ctx2
2564 ctxright = ctx2
2562
2565
2563 diffopts = patch.diffallopts(ui, opts)
2566 diffopts = patch.diffallopts(ui, opts)
2564 m = scmutil.match(ctx2, pats, opts)
2567 m = scmutil.match(ctx2, pats, opts)
2565 m = repo.narrowmatch(m)
2568 m = repo.narrowmatch(m)
2566 ui.pager(b'diff')
2569 ui.pager(b'diff')
2567 logcmdutil.diffordiffstat(
2570 logcmdutil.diffordiffstat(
2568 ui,
2571 ui,
2569 repo,
2572 repo,
2570 diffopts,
2573 diffopts,
2571 ctxleft,
2574 ctxleft,
2572 ctxright,
2575 ctxright,
2573 m,
2576 m,
2574 stat=stat,
2577 stat=stat,
2575 listsubrepos=opts.get(b'subrepos'),
2578 listsubrepos=opts.get(b'subrepos'),
2576 root=opts.get(b'root'),
2579 root=opts.get(b'root'),
2577 )
2580 )
2578
2581
2579
2582
2580 @command(
2583 @command(
2581 b'export',
2584 b'export',
2582 [
2585 [
2583 (
2586 (
2584 b'B',
2587 b'B',
2585 b'bookmark',
2588 b'bookmark',
2586 b'',
2589 b'',
2587 _(b'export changes only reachable by given bookmark'),
2590 _(b'export changes only reachable by given bookmark'),
2588 _(b'BOOKMARK'),
2591 _(b'BOOKMARK'),
2589 ),
2592 ),
2590 (
2593 (
2591 b'o',
2594 b'o',
2592 b'output',
2595 b'output',
2593 b'',
2596 b'',
2594 _(b'print output to file with formatted name'),
2597 _(b'print output to file with formatted name'),
2595 _(b'FORMAT'),
2598 _(b'FORMAT'),
2596 ),
2599 ),
2597 (b'', b'switch-parent', None, _(b'diff against the second parent')),
2600 (b'', b'switch-parent', None, _(b'diff against the second parent')),
2598 (b'r', b'rev', [], _(b'revisions to export'), _(b'REV')),
2601 (b'r', b'rev', [], _(b'revisions to export'), _(b'REV')),
2599 ]
2602 ]
2600 + diffopts
2603 + diffopts
2601 + formatteropts,
2604 + formatteropts,
2602 _(b'[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'),
2605 _(b'[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'),
2603 helpcategory=command.CATEGORY_IMPORT_EXPORT,
2606 helpcategory=command.CATEGORY_IMPORT_EXPORT,
2604 helpbasic=True,
2607 helpbasic=True,
2605 intents={INTENT_READONLY},
2608 intents={INTENT_READONLY},
2606 )
2609 )
2607 def export(ui, repo, *changesets, **opts):
2610 def export(ui, repo, *changesets, **opts):
2608 """dump the header and diffs for one or more changesets
2611 """dump the header and diffs for one or more changesets
2609
2612
2610 Print the changeset header and diffs for one or more revisions.
2613 Print the changeset header and diffs for one or more revisions.
2611 If no revision is given, the parent of the working directory is used.
2614 If no revision is given, the parent of the working directory is used.
2612
2615
2613 The information shown in the changeset header is: author, date,
2616 The information shown in the changeset header is: author, date,
2614 branch name (if non-default), changeset hash, parent(s) and commit
2617 branch name (if non-default), changeset hash, parent(s) and commit
2615 comment.
2618 comment.
2616
2619
2617 .. note::
2620 .. note::
2618
2621
2619 :hg:`export` may generate unexpected diff output for merge
2622 :hg:`export` may generate unexpected diff output for merge
2620 changesets, as it will compare the merge changeset against its
2623 changesets, as it will compare the merge changeset against its
2621 first parent only.
2624 first parent only.
2622
2625
2623 Output may be to a file, in which case the name of the file is
2626 Output may be to a file, in which case the name of the file is
2624 given using a template string. See :hg:`help templates`. In addition
2627 given using a template string. See :hg:`help templates`. In addition
2625 to the common template keywords, the following formatting rules are
2628 to the common template keywords, the following formatting rules are
2626 supported:
2629 supported:
2627
2630
2628 :``%%``: literal "%" character
2631 :``%%``: literal "%" character
2629 :``%H``: changeset hash (40 hexadecimal digits)
2632 :``%H``: changeset hash (40 hexadecimal digits)
2630 :``%N``: number of patches being generated
2633 :``%N``: number of patches being generated
2631 :``%R``: changeset revision number
2634 :``%R``: changeset revision number
2632 :``%b``: basename of the exporting repository
2635 :``%b``: basename of the exporting repository
2633 :``%h``: short-form changeset hash (12 hexadecimal digits)
2636 :``%h``: short-form changeset hash (12 hexadecimal digits)
2634 :``%m``: first line of the commit message (only alphanumeric characters)
2637 :``%m``: first line of the commit message (only alphanumeric characters)
2635 :``%n``: zero-padded sequence number, starting at 1
2638 :``%n``: zero-padded sequence number, starting at 1
2636 :``%r``: zero-padded changeset revision number
2639 :``%r``: zero-padded changeset revision number
2637 :``\\``: literal "\\" character
2640 :``\\``: literal "\\" character
2638
2641
2639 Without the -a/--text option, export will avoid generating diffs
2642 Without the -a/--text option, export will avoid generating diffs
2640 of files it detects as binary. With -a, export will generate a
2643 of files it detects as binary. With -a, export will generate a
2641 diff anyway, probably with undesirable results.
2644 diff anyway, probably with undesirable results.
2642
2645
2643 With -B/--bookmark changesets reachable by the given bookmark are
2646 With -B/--bookmark changesets reachable by the given bookmark are
2644 selected.
2647 selected.
2645
2648
2646 Use the -g/--git option to generate diffs in the git extended diff
2649 Use the -g/--git option to generate diffs in the git extended diff
2647 format. See :hg:`help diffs` for more information.
2650 format. See :hg:`help diffs` for more information.
2648
2651
2649 With the --switch-parent option, the diff will be against the
2652 With the --switch-parent option, the diff will be against the
2650 second parent. It can be useful to review a merge.
2653 second parent. It can be useful to review a merge.
2651
2654
2652 .. container:: verbose
2655 .. container:: verbose
2653
2656
2654 Template:
2657 Template:
2655
2658
2656 The following keywords are supported in addition to the common template
2659 The following keywords are supported in addition to the common template
2657 keywords and functions. See also :hg:`help templates`.
2660 keywords and functions. See also :hg:`help templates`.
2658
2661
2659 :diff: String. Diff content.
2662 :diff: String. Diff content.
2660 :parents: List of strings. Parent nodes of the changeset.
2663 :parents: List of strings. Parent nodes of the changeset.
2661
2664
2662 Examples:
2665 Examples:
2663
2666
2664 - use export and import to transplant a bugfix to the current
2667 - use export and import to transplant a bugfix to the current
2665 branch::
2668 branch::
2666
2669
2667 hg export -r 9353 | hg import -
2670 hg export -r 9353 | hg import -
2668
2671
2669 - export all the changesets between two revisions to a file with
2672 - export all the changesets between two revisions to a file with
2670 rename information::
2673 rename information::
2671
2674
2672 hg export --git -r 123:150 > changes.txt
2675 hg export --git -r 123:150 > changes.txt
2673
2676
2674 - split outgoing changes into a series of patches with
2677 - split outgoing changes into a series of patches with
2675 descriptive names::
2678 descriptive names::
2676
2679
2677 hg export -r "outgoing()" -o "%n-%m.patch"
2680 hg export -r "outgoing()" -o "%n-%m.patch"
2678
2681
2679 Returns 0 on success.
2682 Returns 0 on success.
2680 """
2683 """
2681 opts = pycompat.byteskwargs(opts)
2684 opts = pycompat.byteskwargs(opts)
2682 bookmark = opts.get(b'bookmark')
2685 bookmark = opts.get(b'bookmark')
2683 changesets += tuple(opts.get(b'rev', []))
2686 changesets += tuple(opts.get(b'rev', []))
2684
2687
2685 cmdutil.check_at_most_one_arg(opts, b'rev', b'bookmark')
2688 cmdutil.check_at_most_one_arg(opts, b'rev', b'bookmark')
2686
2689
2687 if bookmark:
2690 if bookmark:
2688 if bookmark not in repo._bookmarks:
2691 if bookmark not in repo._bookmarks:
2689 raise error.InputError(_(b"bookmark '%s' not found") % bookmark)
2692 raise error.InputError(_(b"bookmark '%s' not found") % bookmark)
2690
2693
2691 revs = scmutil.bookmarkrevs(repo, bookmark)
2694 revs = scmutil.bookmarkrevs(repo, bookmark)
2692 else:
2695 else:
2693 if not changesets:
2696 if not changesets:
2694 changesets = [b'.']
2697 changesets = [b'.']
2695
2698
2696 repo = scmutil.unhidehashlikerevs(repo, changesets, b'nowarn')
2699 repo = scmutil.unhidehashlikerevs(repo, changesets, b'nowarn')
2697 revs = scmutil.revrange(repo, changesets)
2700 revs = scmutil.revrange(repo, changesets)
2698
2701
2699 if not revs:
2702 if not revs:
2700 raise error.InputError(_(b"export requires at least one changeset"))
2703 raise error.InputError(_(b"export requires at least one changeset"))
2701 if len(revs) > 1:
2704 if len(revs) > 1:
2702 ui.note(_(b'exporting patches:\n'))
2705 ui.note(_(b'exporting patches:\n'))
2703 else:
2706 else:
2704 ui.note(_(b'exporting patch:\n'))
2707 ui.note(_(b'exporting patch:\n'))
2705
2708
2706 fntemplate = opts.get(b'output')
2709 fntemplate = opts.get(b'output')
2707 if cmdutil.isstdiofilename(fntemplate):
2710 if cmdutil.isstdiofilename(fntemplate):
2708 fntemplate = b''
2711 fntemplate = b''
2709
2712
2710 if fntemplate:
2713 if fntemplate:
2711 fm = formatter.nullformatter(ui, b'export', opts)
2714 fm = formatter.nullformatter(ui, b'export', opts)
2712 else:
2715 else:
2713 ui.pager(b'export')
2716 ui.pager(b'export')
2714 fm = ui.formatter(b'export', opts)
2717 fm = ui.formatter(b'export', opts)
2715 with fm:
2718 with fm:
2716 cmdutil.export(
2719 cmdutil.export(
2717 repo,
2720 repo,
2718 revs,
2721 revs,
2719 fm,
2722 fm,
2720 fntemplate=fntemplate,
2723 fntemplate=fntemplate,
2721 switch_parent=opts.get(b'switch_parent'),
2724 switch_parent=opts.get(b'switch_parent'),
2722 opts=patch.diffallopts(ui, opts),
2725 opts=patch.diffallopts(ui, opts),
2723 )
2726 )
2724
2727
2725
2728
2726 @command(
2729 @command(
2727 b'files',
2730 b'files',
2728 [
2731 [
2729 (
2732 (
2730 b'r',
2733 b'r',
2731 b'rev',
2734 b'rev',
2732 b'',
2735 b'',
2733 _(b'search the repository as it is in REV'),
2736 _(b'search the repository as it is in REV'),
2734 _(b'REV'),
2737 _(b'REV'),
2735 ),
2738 ),
2736 (
2739 (
2737 b'0',
2740 b'0',
2738 b'print0',
2741 b'print0',
2739 None,
2742 None,
2740 _(b'end filenames with NUL, for use with xargs'),
2743 _(b'end filenames with NUL, for use with xargs'),
2741 ),
2744 ),
2742 ]
2745 ]
2743 + walkopts
2746 + walkopts
2744 + formatteropts
2747 + formatteropts
2745 + subrepoopts,
2748 + subrepoopts,
2746 _(b'[OPTION]... [FILE]...'),
2749 _(b'[OPTION]... [FILE]...'),
2747 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2750 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2748 intents={INTENT_READONLY},
2751 intents={INTENT_READONLY},
2749 )
2752 )
2750 def files(ui, repo, *pats, **opts):
2753 def files(ui, repo, *pats, **opts):
2751 """list tracked files
2754 """list tracked files
2752
2755
2753 Print files under Mercurial control in the working directory or
2756 Print files under Mercurial control in the working directory or
2754 specified revision for given files (excluding removed files).
2757 specified revision for given files (excluding removed files).
2755 Files can be specified as filenames or filesets.
2758 Files can be specified as filenames or filesets.
2756
2759
2757 If no files are given to match, this command prints the names
2760 If no files are given to match, this command prints the names
2758 of all files under Mercurial control.
2761 of all files under Mercurial control.
2759
2762
2760 .. container:: verbose
2763 .. container:: verbose
2761
2764
2762 Template:
2765 Template:
2763
2766
2764 The following keywords are supported in addition to the common template
2767 The following keywords are supported in addition to the common template
2765 keywords and functions. See also :hg:`help templates`.
2768 keywords and functions. See also :hg:`help templates`.
2766
2769
2767 :flags: String. Character denoting file's symlink and executable bits.
2770 :flags: String. Character denoting file's symlink and executable bits.
2768 :path: String. Repository-absolute path of the file.
2771 :path: String. Repository-absolute path of the file.
2769 :size: Integer. Size of the file in bytes.
2772 :size: Integer. Size of the file in bytes.
2770
2773
2771 Examples:
2774 Examples:
2772
2775
2773 - list all files under the current directory::
2776 - list all files under the current directory::
2774
2777
2775 hg files .
2778 hg files .
2776
2779
2777 - shows sizes and flags for current revision::
2780 - shows sizes and flags for current revision::
2778
2781
2779 hg files -vr .
2782 hg files -vr .
2780
2783
2781 - list all files named README::
2784 - list all files named README::
2782
2785
2783 hg files -I "**/README"
2786 hg files -I "**/README"
2784
2787
2785 - list all binary files::
2788 - list all binary files::
2786
2789
2787 hg files "set:binary()"
2790 hg files "set:binary()"
2788
2791
2789 - find files containing a regular expression::
2792 - find files containing a regular expression::
2790
2793
2791 hg files "set:grep('bob')"
2794 hg files "set:grep('bob')"
2792
2795
2793 - search tracked file contents with xargs and grep::
2796 - search tracked file contents with xargs and grep::
2794
2797
2795 hg files -0 | xargs -0 grep foo
2798 hg files -0 | xargs -0 grep foo
2796
2799
2797 See :hg:`help patterns` and :hg:`help filesets` for more information
2800 See :hg:`help patterns` and :hg:`help filesets` for more information
2798 on specifying file patterns.
2801 on specifying file patterns.
2799
2802
2800 Returns 0 if a match is found, 1 otherwise.
2803 Returns 0 if a match is found, 1 otherwise.
2801
2804
2802 """
2805 """
2803
2806
2804 opts = pycompat.byteskwargs(opts)
2807 opts = pycompat.byteskwargs(opts)
2805 rev = opts.get(b'rev')
2808 rev = opts.get(b'rev')
2806 if rev:
2809 if rev:
2807 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
2810 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
2808 ctx = scmutil.revsingle(repo, rev, None)
2811 ctx = scmutil.revsingle(repo, rev, None)
2809
2812
2810 end = b'\n'
2813 end = b'\n'
2811 if opts.get(b'print0'):
2814 if opts.get(b'print0'):
2812 end = b'\0'
2815 end = b'\0'
2813 fmt = b'%s' + end
2816 fmt = b'%s' + end
2814
2817
2815 m = scmutil.match(ctx, pats, opts)
2818 m = scmutil.match(ctx, pats, opts)
2816 ui.pager(b'files')
2819 ui.pager(b'files')
2817 uipathfn = scmutil.getuipathfn(ctx.repo(), legacyrelativevalue=True)
2820 uipathfn = scmutil.getuipathfn(ctx.repo(), legacyrelativevalue=True)
2818 with ui.formatter(b'files', opts) as fm:
2821 with ui.formatter(b'files', opts) as fm:
2819 return cmdutil.files(
2822 return cmdutil.files(
2820 ui, ctx, m, uipathfn, fm, fmt, opts.get(b'subrepos')
2823 ui, ctx, m, uipathfn, fm, fmt, opts.get(b'subrepos')
2821 )
2824 )
2822
2825
2823
2826
2824 @command(
2827 @command(
2825 b'forget',
2828 b'forget',
2826 [
2829 [
2827 (b'i', b'interactive', None, _(b'use interactive mode')),
2830 (b'i', b'interactive', None, _(b'use interactive mode')),
2828 ]
2831 ]
2829 + walkopts
2832 + walkopts
2830 + dryrunopts,
2833 + dryrunopts,
2831 _(b'[OPTION]... FILE...'),
2834 _(b'[OPTION]... FILE...'),
2832 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2835 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2833 helpbasic=True,
2836 helpbasic=True,
2834 inferrepo=True,
2837 inferrepo=True,
2835 )
2838 )
2836 def forget(ui, repo, *pats, **opts):
2839 def forget(ui, repo, *pats, **opts):
2837 """forget the specified files on the next commit
2840 """forget the specified files on the next commit
2838
2841
2839 Mark the specified files so they will no longer be tracked
2842 Mark the specified files so they will no longer be tracked
2840 after the next commit.
2843 after the next commit.
2841
2844
2842 This only removes files from the current branch, not from the
2845 This only removes files from the current branch, not from the
2843 entire project history, and it does not delete them from the
2846 entire project history, and it does not delete them from the
2844 working directory.
2847 working directory.
2845
2848
2846 To delete the file from the working directory, see :hg:`remove`.
2849 To delete the file from the working directory, see :hg:`remove`.
2847
2850
2848 To undo a forget before the next commit, see :hg:`add`.
2851 To undo a forget before the next commit, see :hg:`add`.
2849
2852
2850 .. container:: verbose
2853 .. container:: verbose
2851
2854
2852 Examples:
2855 Examples:
2853
2856
2854 - forget newly-added binary files::
2857 - forget newly-added binary files::
2855
2858
2856 hg forget "set:added() and binary()"
2859 hg forget "set:added() and binary()"
2857
2860
2858 - forget files that would be excluded by .hgignore::
2861 - forget files that would be excluded by .hgignore::
2859
2862
2860 hg forget "set:hgignore()"
2863 hg forget "set:hgignore()"
2861
2864
2862 Returns 0 on success.
2865 Returns 0 on success.
2863 """
2866 """
2864
2867
2865 opts = pycompat.byteskwargs(opts)
2868 opts = pycompat.byteskwargs(opts)
2866 if not pats:
2869 if not pats:
2867 raise error.InputError(_(b'no files specified'))
2870 raise error.InputError(_(b'no files specified'))
2868
2871
2869 m = scmutil.match(repo[None], pats, opts)
2872 m = scmutil.match(repo[None], pats, opts)
2870 dryrun, interactive = opts.get(b'dry_run'), opts.get(b'interactive')
2873 dryrun, interactive = opts.get(b'dry_run'), opts.get(b'interactive')
2871 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
2874 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
2872 rejected = cmdutil.forget(
2875 rejected = cmdutil.forget(
2873 ui,
2876 ui,
2874 repo,
2877 repo,
2875 m,
2878 m,
2876 prefix=b"",
2879 prefix=b"",
2877 uipathfn=uipathfn,
2880 uipathfn=uipathfn,
2878 explicitonly=False,
2881 explicitonly=False,
2879 dryrun=dryrun,
2882 dryrun=dryrun,
2880 interactive=interactive,
2883 interactive=interactive,
2881 )[0]
2884 )[0]
2882 return rejected and 1 or 0
2885 return rejected and 1 or 0
2883
2886
2884
2887
2885 @command(
2888 @command(
2886 b'graft',
2889 b'graft',
2887 [
2890 [
2888 (b'r', b'rev', [], _(b'revisions to graft'), _(b'REV')),
2891 (b'r', b'rev', [], _(b'revisions to graft'), _(b'REV')),
2889 (
2892 (
2890 b'',
2893 b'',
2891 b'base',
2894 b'base',
2892 b'',
2895 b'',
2893 _(b'base revision when doing the graft merge (ADVANCED)'),
2896 _(b'base revision when doing the graft merge (ADVANCED)'),
2894 _(b'REV'),
2897 _(b'REV'),
2895 ),
2898 ),
2896 (b'c', b'continue', False, _(b'resume interrupted graft')),
2899 (b'c', b'continue', False, _(b'resume interrupted graft')),
2897 (b'', b'stop', False, _(b'stop interrupted graft')),
2900 (b'', b'stop', False, _(b'stop interrupted graft')),
2898 (b'', b'abort', False, _(b'abort interrupted graft')),
2901 (b'', b'abort', False, _(b'abort interrupted graft')),
2899 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
2902 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
2900 (b'', b'log', None, _(b'append graft info to log message')),
2903 (b'', b'log', None, _(b'append graft info to log message')),
2901 (
2904 (
2902 b'',
2905 b'',
2903 b'no-commit',
2906 b'no-commit',
2904 None,
2907 None,
2905 _(b"don't commit, just apply the changes in working directory"),
2908 _(b"don't commit, just apply the changes in working directory"),
2906 ),
2909 ),
2907 (b'f', b'force', False, _(b'force graft')),
2910 (b'f', b'force', False, _(b'force graft')),
2908 (
2911 (
2909 b'D',
2912 b'D',
2910 b'currentdate',
2913 b'currentdate',
2911 False,
2914 False,
2912 _(b'record the current date as commit date'),
2915 _(b'record the current date as commit date'),
2913 ),
2916 ),
2914 (
2917 (
2915 b'U',
2918 b'U',
2916 b'currentuser',
2919 b'currentuser',
2917 False,
2920 False,
2918 _(b'record the current user as committer'),
2921 _(b'record the current user as committer'),
2919 ),
2922 ),
2920 ]
2923 ]
2921 + commitopts2
2924 + commitopts2
2922 + mergetoolopts
2925 + mergetoolopts
2923 + dryrunopts,
2926 + dryrunopts,
2924 _(b'[OPTION]... [-r REV]... REV...'),
2927 _(b'[OPTION]... [-r REV]... REV...'),
2925 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2928 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2926 )
2929 )
2927 def graft(ui, repo, *revs, **opts):
2930 def graft(ui, repo, *revs, **opts):
2928 """copy changes from other branches onto the current branch
2931 """copy changes from other branches onto the current branch
2929
2932
2930 This command uses Mercurial's merge logic to copy individual
2933 This command uses Mercurial's merge logic to copy individual
2931 changes from other branches without merging branches in the
2934 changes from other branches without merging branches in the
2932 history graph. This is sometimes known as 'backporting' or
2935 history graph. This is sometimes known as 'backporting' or
2933 'cherry-picking'. By default, graft will copy user, date, and
2936 'cherry-picking'. By default, graft will copy user, date, and
2934 description from the source changesets.
2937 description from the source changesets.
2935
2938
2936 Changesets that are ancestors of the current revision, that have
2939 Changesets that are ancestors of the current revision, that have
2937 already been grafted, or that are merges will be skipped.
2940 already been grafted, or that are merges will be skipped.
2938
2941
2939 If --log is specified, log messages will have a comment appended
2942 If --log is specified, log messages will have a comment appended
2940 of the form::
2943 of the form::
2941
2944
2942 (grafted from CHANGESETHASH)
2945 (grafted from CHANGESETHASH)
2943
2946
2944 If --force is specified, revisions will be grafted even if they
2947 If --force is specified, revisions will be grafted even if they
2945 are already ancestors of, or have been grafted to, the destination.
2948 are already ancestors of, or have been grafted to, the destination.
2946 This is useful when the revisions have since been backed out.
2949 This is useful when the revisions have since been backed out.
2947
2950
2948 If a graft merge results in conflicts, the graft process is
2951 If a graft merge results in conflicts, the graft process is
2949 interrupted so that the current merge can be manually resolved.
2952 interrupted so that the current merge can be manually resolved.
2950 Once all conflicts are addressed, the graft process can be
2953 Once all conflicts are addressed, the graft process can be
2951 continued with the -c/--continue option.
2954 continued with the -c/--continue option.
2952
2955
2953 The -c/--continue option reapplies all the earlier options.
2956 The -c/--continue option reapplies all the earlier options.
2954
2957
2955 .. container:: verbose
2958 .. container:: verbose
2956
2959
2957 The --base option exposes more of how graft internally uses merge with a
2960 The --base option exposes more of how graft internally uses merge with a
2958 custom base revision. --base can be used to specify another ancestor than
2961 custom base revision. --base can be used to specify another ancestor than
2959 the first and only parent.
2962 the first and only parent.
2960
2963
2961 The command::
2964 The command::
2962
2965
2963 hg graft -r 345 --base 234
2966 hg graft -r 345 --base 234
2964
2967
2965 is thus pretty much the same as::
2968 is thus pretty much the same as::
2966
2969
2967 hg diff --from 234 --to 345 | hg import
2970 hg diff --from 234 --to 345 | hg import
2968
2971
2969 but using merge to resolve conflicts and track moved files.
2972 but using merge to resolve conflicts and track moved files.
2970
2973
2971 The result of a merge can thus be backported as a single commit by
2974 The result of a merge can thus be backported as a single commit by
2972 specifying one of the merge parents as base, and thus effectively
2975 specifying one of the merge parents as base, and thus effectively
2973 grafting the changes from the other side.
2976 grafting the changes from the other side.
2974
2977
2975 It is also possible to collapse multiple changesets and clean up history
2978 It is also possible to collapse multiple changesets and clean up history
2976 by specifying another ancestor as base, much like rebase --collapse
2979 by specifying another ancestor as base, much like rebase --collapse
2977 --keep.
2980 --keep.
2978
2981
2979 The commit message can be tweaked after the fact using commit --amend .
2982 The commit message can be tweaked after the fact using commit --amend .
2980
2983
2981 For using non-ancestors as the base to backout changes, see the backout
2984 For using non-ancestors as the base to backout changes, see the backout
2982 command and the hidden --parent option.
2985 command and the hidden --parent option.
2983
2986
2984 .. container:: verbose
2987 .. container:: verbose
2985
2988
2986 Examples:
2989 Examples:
2987
2990
2988 - copy a single change to the stable branch and edit its description::
2991 - copy a single change to the stable branch and edit its description::
2989
2992
2990 hg update stable
2993 hg update stable
2991 hg graft --edit 9393
2994 hg graft --edit 9393
2992
2995
2993 - graft a range of changesets with one exception, updating dates::
2996 - graft a range of changesets with one exception, updating dates::
2994
2997
2995 hg graft -D "2085::2093 and not 2091"
2998 hg graft -D "2085::2093 and not 2091"
2996
2999
2997 - continue a graft after resolving conflicts::
3000 - continue a graft after resolving conflicts::
2998
3001
2999 hg graft -c
3002 hg graft -c
3000
3003
3001 - show the source of a grafted changeset::
3004 - show the source of a grafted changeset::
3002
3005
3003 hg log --debug -r .
3006 hg log --debug -r .
3004
3007
3005 - show revisions sorted by date::
3008 - show revisions sorted by date::
3006
3009
3007 hg log -r "sort(all(), date)"
3010 hg log -r "sort(all(), date)"
3008
3011
3009 - backport the result of a merge as a single commit::
3012 - backport the result of a merge as a single commit::
3010
3013
3011 hg graft -r 123 --base 123^
3014 hg graft -r 123 --base 123^
3012
3015
3013 - land a feature branch as one changeset::
3016 - land a feature branch as one changeset::
3014
3017
3015 hg up -cr default
3018 hg up -cr default
3016 hg graft -r featureX --base "ancestor('featureX', 'default')"
3019 hg graft -r featureX --base "ancestor('featureX', 'default')"
3017
3020
3018 See :hg:`help revisions` for more about specifying revisions.
3021 See :hg:`help revisions` for more about specifying revisions.
3019
3022
3020 Returns 0 on successful completion, 1 if there are unresolved files.
3023 Returns 0 on successful completion, 1 if there are unresolved files.
3021 """
3024 """
3022 with repo.wlock():
3025 with repo.wlock():
3023 return _dograft(ui, repo, *revs, **opts)
3026 return _dograft(ui, repo, *revs, **opts)
3024
3027
3025
3028
3026 def _dograft(ui, repo, *revs, **opts):
3029 def _dograft(ui, repo, *revs, **opts):
3027 opts = pycompat.byteskwargs(opts)
3030 opts = pycompat.byteskwargs(opts)
3028 if revs and opts.get(b'rev'):
3031 if revs and opts.get(b'rev'):
3029 ui.warn(
3032 ui.warn(
3030 _(
3033 _(
3031 b'warning: inconsistent use of --rev might give unexpected '
3034 b'warning: inconsistent use of --rev might give unexpected '
3032 b'revision ordering!\n'
3035 b'revision ordering!\n'
3033 )
3036 )
3034 )
3037 )
3035
3038
3036 revs = list(revs)
3039 revs = list(revs)
3037 revs.extend(opts.get(b'rev'))
3040 revs.extend(opts.get(b'rev'))
3038 # a dict of data to be stored in state file
3041 # a dict of data to be stored in state file
3039 statedata = {}
3042 statedata = {}
3040 # list of new nodes created by ongoing graft
3043 # list of new nodes created by ongoing graft
3041 statedata[b'newnodes'] = []
3044 statedata[b'newnodes'] = []
3042
3045
3043 cmdutil.resolvecommitoptions(ui, opts)
3046 cmdutil.resolvecommitoptions(ui, opts)
3044
3047
3045 editor = cmdutil.getcommiteditor(
3048 editor = cmdutil.getcommiteditor(
3046 editform=b'graft', **pycompat.strkwargs(opts)
3049 editform=b'graft', **pycompat.strkwargs(opts)
3047 )
3050 )
3048
3051
3049 cmdutil.check_at_most_one_arg(opts, b'abort', b'stop', b'continue')
3052 cmdutil.check_at_most_one_arg(opts, b'abort', b'stop', b'continue')
3050
3053
3051 cont = False
3054 cont = False
3052 if opts.get(b'no_commit'):
3055 if opts.get(b'no_commit'):
3053 cmdutil.check_incompatible_arguments(
3056 cmdutil.check_incompatible_arguments(
3054 opts,
3057 opts,
3055 b'no_commit',
3058 b'no_commit',
3056 [b'edit', b'currentuser', b'currentdate', b'log'],
3059 [b'edit', b'currentuser', b'currentdate', b'log'],
3057 )
3060 )
3058
3061
3059 graftstate = statemod.cmdstate(repo, b'graftstate')
3062 graftstate = statemod.cmdstate(repo, b'graftstate')
3060
3063
3061 if opts.get(b'stop'):
3064 if opts.get(b'stop'):
3062 cmdutil.check_incompatible_arguments(
3065 cmdutil.check_incompatible_arguments(
3063 opts,
3066 opts,
3064 b'stop',
3067 b'stop',
3065 [
3068 [
3066 b'edit',
3069 b'edit',
3067 b'log',
3070 b'log',
3068 b'user',
3071 b'user',
3069 b'date',
3072 b'date',
3070 b'currentdate',
3073 b'currentdate',
3071 b'currentuser',
3074 b'currentuser',
3072 b'rev',
3075 b'rev',
3073 ],
3076 ],
3074 )
3077 )
3075 return _stopgraft(ui, repo, graftstate)
3078 return _stopgraft(ui, repo, graftstate)
3076 elif opts.get(b'abort'):
3079 elif opts.get(b'abort'):
3077 cmdutil.check_incompatible_arguments(
3080 cmdutil.check_incompatible_arguments(
3078 opts,
3081 opts,
3079 b'abort',
3082 b'abort',
3080 [
3083 [
3081 b'edit',
3084 b'edit',
3082 b'log',
3085 b'log',
3083 b'user',
3086 b'user',
3084 b'date',
3087 b'date',
3085 b'currentdate',
3088 b'currentdate',
3086 b'currentuser',
3089 b'currentuser',
3087 b'rev',
3090 b'rev',
3088 ],
3091 ],
3089 )
3092 )
3090 return cmdutil.abortgraft(ui, repo, graftstate)
3093 return cmdutil.abortgraft(ui, repo, graftstate)
3091 elif opts.get(b'continue'):
3094 elif opts.get(b'continue'):
3092 cont = True
3095 cont = True
3093 if revs:
3096 if revs:
3094 raise error.InputError(_(b"can't specify --continue and revisions"))
3097 raise error.InputError(_(b"can't specify --continue and revisions"))
3095 # read in unfinished revisions
3098 # read in unfinished revisions
3096 if graftstate.exists():
3099 if graftstate.exists():
3097 statedata = cmdutil.readgraftstate(repo, graftstate)
3100 statedata = cmdutil.readgraftstate(repo, graftstate)
3098 if statedata.get(b'date'):
3101 if statedata.get(b'date'):
3099 opts[b'date'] = statedata[b'date']
3102 opts[b'date'] = statedata[b'date']
3100 if statedata.get(b'user'):
3103 if statedata.get(b'user'):
3101 opts[b'user'] = statedata[b'user']
3104 opts[b'user'] = statedata[b'user']
3102 if statedata.get(b'log'):
3105 if statedata.get(b'log'):
3103 opts[b'log'] = True
3106 opts[b'log'] = True
3104 if statedata.get(b'no_commit'):
3107 if statedata.get(b'no_commit'):
3105 opts[b'no_commit'] = statedata.get(b'no_commit')
3108 opts[b'no_commit'] = statedata.get(b'no_commit')
3106 if statedata.get(b'base'):
3109 if statedata.get(b'base'):
3107 opts[b'base'] = statedata.get(b'base')
3110 opts[b'base'] = statedata.get(b'base')
3108 nodes = statedata[b'nodes']
3111 nodes = statedata[b'nodes']
3109 revs = [repo[node].rev() for node in nodes]
3112 revs = [repo[node].rev() for node in nodes]
3110 else:
3113 else:
3111 cmdutil.wrongtooltocontinue(repo, _(b'graft'))
3114 cmdutil.wrongtooltocontinue(repo, _(b'graft'))
3112 else:
3115 else:
3113 if not revs:
3116 if not revs:
3114 raise error.InputError(_(b'no revisions specified'))
3117 raise error.InputError(_(b'no revisions specified'))
3115 cmdutil.checkunfinished(repo)
3118 cmdutil.checkunfinished(repo)
3116 cmdutil.bailifchanged(repo)
3119 cmdutil.bailifchanged(repo)
3117 revs = scmutil.revrange(repo, revs)
3120 revs = scmutil.revrange(repo, revs)
3118
3121
3119 skipped = set()
3122 skipped = set()
3120 basectx = None
3123 basectx = None
3121 if opts.get(b'base'):
3124 if opts.get(b'base'):
3122 basectx = scmutil.revsingle(repo, opts[b'base'], None)
3125 basectx = scmutil.revsingle(repo, opts[b'base'], None)
3123 if basectx is None:
3126 if basectx is None:
3124 # check for merges
3127 # check for merges
3125 for rev in repo.revs(b'%ld and merge()', revs):
3128 for rev in repo.revs(b'%ld and merge()', revs):
3126 ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
3129 ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
3127 skipped.add(rev)
3130 skipped.add(rev)
3128 revs = [r for r in revs if r not in skipped]
3131 revs = [r for r in revs if r not in skipped]
3129 if not revs:
3132 if not revs:
3130 return -1
3133 return -1
3131 if basectx is not None and len(revs) != 1:
3134 if basectx is not None and len(revs) != 1:
3132 raise error.InputError(_(b'only one revision allowed with --base '))
3135 raise error.InputError(_(b'only one revision allowed with --base '))
3133
3136
3134 # Don't check in the --continue case, in effect retaining --force across
3137 # Don't check in the --continue case, in effect retaining --force across
3135 # --continues. That's because without --force, any revisions we decided to
3138 # --continues. That's because without --force, any revisions we decided to
3136 # skip would have been filtered out here, so they wouldn't have made their
3139 # skip would have been filtered out here, so they wouldn't have made their
3137 # way to the graftstate. With --force, any revisions we would have otherwise
3140 # way to the graftstate. With --force, any revisions we would have otherwise
3138 # skipped would not have been filtered out, and if they hadn't been applied
3141 # skipped would not have been filtered out, and if they hadn't been applied
3139 # already, they'd have been in the graftstate.
3142 # already, they'd have been in the graftstate.
3140 if not (cont or opts.get(b'force')) and basectx is None:
3143 if not (cont or opts.get(b'force')) and basectx is None:
3141 # check for ancestors of dest branch
3144 # check for ancestors of dest branch
3142 ancestors = repo.revs(b'%ld & (::.)', revs)
3145 ancestors = repo.revs(b'%ld & (::.)', revs)
3143 for rev in ancestors:
3146 for rev in ancestors:
3144 ui.warn(_(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev]))
3147 ui.warn(_(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev]))
3145
3148
3146 revs = [r for r in revs if r not in ancestors]
3149 revs = [r for r in revs if r not in ancestors]
3147
3150
3148 if not revs:
3151 if not revs:
3149 return -1
3152 return -1
3150
3153
3151 # analyze revs for earlier grafts
3154 # analyze revs for earlier grafts
3152 ids = {}
3155 ids = {}
3153 for ctx in repo.set(b"%ld", revs):
3156 for ctx in repo.set(b"%ld", revs):
3154 ids[ctx.hex()] = ctx.rev()
3157 ids[ctx.hex()] = ctx.rev()
3155 n = ctx.extra().get(b'source')
3158 n = ctx.extra().get(b'source')
3156 if n:
3159 if n:
3157 ids[n] = ctx.rev()
3160 ids[n] = ctx.rev()
3158
3161
3159 # check ancestors for earlier grafts
3162 # check ancestors for earlier grafts
3160 ui.debug(b'scanning for duplicate grafts\n')
3163 ui.debug(b'scanning for duplicate grafts\n')
3161
3164
3162 # The only changesets we can be sure doesn't contain grafts of any
3165 # The only changesets we can be sure doesn't contain grafts of any
3163 # revs, are the ones that are common ancestors of *all* revs:
3166 # revs, are the ones that are common ancestors of *all* revs:
3164 for rev in repo.revs(b'only(%d,ancestor(%ld))', repo[b'.'].rev(), revs):
3167 for rev in repo.revs(b'only(%d,ancestor(%ld))', repo[b'.'].rev(), revs):
3165 ctx = repo[rev]
3168 ctx = repo[rev]
3166 n = ctx.extra().get(b'source')
3169 n = ctx.extra().get(b'source')
3167 if n in ids:
3170 if n in ids:
3168 try:
3171 try:
3169 r = repo[n].rev()
3172 r = repo[n].rev()
3170 except error.RepoLookupError:
3173 except error.RepoLookupError:
3171 r = None
3174 r = None
3172 if r in revs:
3175 if r in revs:
3173 ui.warn(
3176 ui.warn(
3174 _(
3177 _(
3175 b'skipping revision %d:%s '
3178 b'skipping revision %d:%s '
3176 b'(already grafted to %d:%s)\n'
3179 b'(already grafted to %d:%s)\n'
3177 )
3180 )
3178 % (r, repo[r], rev, ctx)
3181 % (r, repo[r], rev, ctx)
3179 )
3182 )
3180 revs.remove(r)
3183 revs.remove(r)
3181 elif ids[n] in revs:
3184 elif ids[n] in revs:
3182 if r is None:
3185 if r is None:
3183 ui.warn(
3186 ui.warn(
3184 _(
3187 _(
3185 b'skipping already grafted revision %d:%s '
3188 b'skipping already grafted revision %d:%s '
3186 b'(%d:%s also has unknown origin %s)\n'
3189 b'(%d:%s also has unknown origin %s)\n'
3187 )
3190 )
3188 % (ids[n], repo[ids[n]], rev, ctx, n[:12])
3191 % (ids[n], repo[ids[n]], rev, ctx, n[:12])
3189 )
3192 )
3190 else:
3193 else:
3191 ui.warn(
3194 ui.warn(
3192 _(
3195 _(
3193 b'skipping already grafted revision %d:%s '
3196 b'skipping already grafted revision %d:%s '
3194 b'(%d:%s also has origin %d:%s)\n'
3197 b'(%d:%s also has origin %d:%s)\n'
3195 )
3198 )
3196 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12])
3199 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12])
3197 )
3200 )
3198 revs.remove(ids[n])
3201 revs.remove(ids[n])
3199 elif ctx.hex() in ids:
3202 elif ctx.hex() in ids:
3200 r = ids[ctx.hex()]
3203 r = ids[ctx.hex()]
3201 if r in revs:
3204 if r in revs:
3202 ui.warn(
3205 ui.warn(
3203 _(
3206 _(
3204 b'skipping already grafted revision %d:%s '
3207 b'skipping already grafted revision %d:%s '
3205 b'(was grafted from %d:%s)\n'
3208 b'(was grafted from %d:%s)\n'
3206 )
3209 )
3207 % (r, repo[r], rev, ctx)
3210 % (r, repo[r], rev, ctx)
3208 )
3211 )
3209 revs.remove(r)
3212 revs.remove(r)
3210 if not revs:
3213 if not revs:
3211 return -1
3214 return -1
3212
3215
3213 if opts.get(b'no_commit'):
3216 if opts.get(b'no_commit'):
3214 statedata[b'no_commit'] = True
3217 statedata[b'no_commit'] = True
3215 if opts.get(b'base'):
3218 if opts.get(b'base'):
3216 statedata[b'base'] = opts[b'base']
3219 statedata[b'base'] = opts[b'base']
3217 for pos, ctx in enumerate(repo.set(b"%ld", revs)):
3220 for pos, ctx in enumerate(repo.set(b"%ld", revs)):
3218 desc = b'%d:%s "%s"' % (
3221 desc = b'%d:%s "%s"' % (
3219 ctx.rev(),
3222 ctx.rev(),
3220 ctx,
3223 ctx,
3221 ctx.description().split(b'\n', 1)[0],
3224 ctx.description().split(b'\n', 1)[0],
3222 )
3225 )
3223 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3226 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3224 if names:
3227 if names:
3225 desc += b' (%s)' % b' '.join(names)
3228 desc += b' (%s)' % b' '.join(names)
3226 ui.status(_(b'grafting %s\n') % desc)
3229 ui.status(_(b'grafting %s\n') % desc)
3227 if opts.get(b'dry_run'):
3230 if opts.get(b'dry_run'):
3228 continue
3231 continue
3229
3232
3230 source = ctx.extra().get(b'source')
3233 source = ctx.extra().get(b'source')
3231 extra = {}
3234 extra = {}
3232 if source:
3235 if source:
3233 extra[b'source'] = source
3236 extra[b'source'] = source
3234 extra[b'intermediate-source'] = ctx.hex()
3237 extra[b'intermediate-source'] = ctx.hex()
3235 else:
3238 else:
3236 extra[b'source'] = ctx.hex()
3239 extra[b'source'] = ctx.hex()
3237 user = ctx.user()
3240 user = ctx.user()
3238 if opts.get(b'user'):
3241 if opts.get(b'user'):
3239 user = opts[b'user']
3242 user = opts[b'user']
3240 statedata[b'user'] = user
3243 statedata[b'user'] = user
3241 date = ctx.date()
3244 date = ctx.date()
3242 if opts.get(b'date'):
3245 if opts.get(b'date'):
3243 date = opts[b'date']
3246 date = opts[b'date']
3244 statedata[b'date'] = date
3247 statedata[b'date'] = date
3245 message = ctx.description()
3248 message = ctx.description()
3246 if opts.get(b'log'):
3249 if opts.get(b'log'):
3247 message += b'\n(grafted from %s)' % ctx.hex()
3250 message += b'\n(grafted from %s)' % ctx.hex()
3248 statedata[b'log'] = True
3251 statedata[b'log'] = True
3249
3252
3250 # we don't merge the first commit when continuing
3253 # we don't merge the first commit when continuing
3251 if not cont:
3254 if not cont:
3252 # perform the graft merge with p1(rev) as 'ancestor'
3255 # perform the graft merge with p1(rev) as 'ancestor'
3253 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
3256 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
3254 base = ctx.p1() if basectx is None else basectx
3257 base = ctx.p1() if basectx is None else basectx
3255 with ui.configoverride(overrides, b'graft'):
3258 with ui.configoverride(overrides, b'graft'):
3256 stats = mergemod.graft(repo, ctx, base, [b'local', b'graft'])
3259 stats = mergemod.graft(repo, ctx, base, [b'local', b'graft'])
3257 # report any conflicts
3260 # report any conflicts
3258 if stats.unresolvedcount > 0:
3261 if stats.unresolvedcount > 0:
3259 # write out state for --continue
3262 # write out state for --continue
3260 nodes = [repo[rev].hex() for rev in revs[pos:]]
3263 nodes = [repo[rev].hex() for rev in revs[pos:]]
3261 statedata[b'nodes'] = nodes
3264 statedata[b'nodes'] = nodes
3262 stateversion = 1
3265 stateversion = 1
3263 graftstate.save(stateversion, statedata)
3266 graftstate.save(stateversion, statedata)
3264 ui.error(_(b"abort: unresolved conflicts, can't continue\n"))
3267 ui.error(_(b"abort: unresolved conflicts, can't continue\n"))
3265 ui.error(_(b"(use 'hg resolve' and 'hg graft --continue')\n"))
3268 ui.error(_(b"(use 'hg resolve' and 'hg graft --continue')\n"))
3266 return 1
3269 return 1
3267 else:
3270 else:
3268 cont = False
3271 cont = False
3269
3272
3270 # commit if --no-commit is false
3273 # commit if --no-commit is false
3271 if not opts.get(b'no_commit'):
3274 if not opts.get(b'no_commit'):
3272 node = repo.commit(
3275 node = repo.commit(
3273 text=message, user=user, date=date, extra=extra, editor=editor
3276 text=message, user=user, date=date, extra=extra, editor=editor
3274 )
3277 )
3275 if node is None:
3278 if node is None:
3276 ui.warn(
3279 ui.warn(
3277 _(b'note: graft of %d:%s created no changes to commit\n')
3280 _(b'note: graft of %d:%s created no changes to commit\n')
3278 % (ctx.rev(), ctx)
3281 % (ctx.rev(), ctx)
3279 )
3282 )
3280 # checking that newnodes exist because old state files won't have it
3283 # checking that newnodes exist because old state files won't have it
3281 elif statedata.get(b'newnodes') is not None:
3284 elif statedata.get(b'newnodes') is not None:
3282 statedata[b'newnodes'].append(node)
3285 statedata[b'newnodes'].append(node)
3283
3286
3284 # remove state when we complete successfully
3287 # remove state when we complete successfully
3285 if not opts.get(b'dry_run'):
3288 if not opts.get(b'dry_run'):
3286 graftstate.delete()
3289 graftstate.delete()
3287
3290
3288 return 0
3291 return 0
3289
3292
3290
3293
3291 def _stopgraft(ui, repo, graftstate):
3294 def _stopgraft(ui, repo, graftstate):
3292 """stop the interrupted graft"""
3295 """stop the interrupted graft"""
3293 if not graftstate.exists():
3296 if not graftstate.exists():
3294 raise error.StateError(_(b"no interrupted graft found"))
3297 raise error.StateError(_(b"no interrupted graft found"))
3295 pctx = repo[b'.']
3298 pctx = repo[b'.']
3296 mergemod.clean_update(pctx)
3299 mergemod.clean_update(pctx)
3297 graftstate.delete()
3300 graftstate.delete()
3298 ui.status(_(b"stopped the interrupted graft\n"))
3301 ui.status(_(b"stopped the interrupted graft\n"))
3299 ui.status(_(b"working directory is now at %s\n") % pctx.hex()[:12])
3302 ui.status(_(b"working directory is now at %s\n") % pctx.hex()[:12])
3300 return 0
3303 return 0
3301
3304
3302
3305
3303 statemod.addunfinished(
3306 statemod.addunfinished(
3304 b'graft',
3307 b'graft',
3305 fname=b'graftstate',
3308 fname=b'graftstate',
3306 clearable=True,
3309 clearable=True,
3307 stopflag=True,
3310 stopflag=True,
3308 continueflag=True,
3311 continueflag=True,
3309 abortfunc=cmdutil.hgabortgraft,
3312 abortfunc=cmdutil.hgabortgraft,
3310 cmdhint=_(b"use 'hg graft --continue' or 'hg graft --stop' to stop"),
3313 cmdhint=_(b"use 'hg graft --continue' or 'hg graft --stop' to stop"),
3311 )
3314 )
3312
3315
3313
3316
3314 @command(
3317 @command(
3315 b'grep',
3318 b'grep',
3316 [
3319 [
3317 (b'0', b'print0', None, _(b'end fields with NUL')),
3320 (b'0', b'print0', None, _(b'end fields with NUL')),
3318 (b'', b'all', None, _(b'an alias to --diff (DEPRECATED)')),
3321 (b'', b'all', None, _(b'an alias to --diff (DEPRECATED)')),
3319 (
3322 (
3320 b'',
3323 b'',
3321 b'diff',
3324 b'diff',
3322 None,
3325 None,
3323 _(
3326 _(
3324 b'search revision differences for when the pattern was added '
3327 b'search revision differences for when the pattern was added '
3325 b'or removed'
3328 b'or removed'
3326 ),
3329 ),
3327 ),
3330 ),
3328 (b'a', b'text', None, _(b'treat all files as text')),
3331 (b'a', b'text', None, _(b'treat all files as text')),
3329 (
3332 (
3330 b'f',
3333 b'f',
3331 b'follow',
3334 b'follow',
3332 None,
3335 None,
3333 _(
3336 _(
3334 b'follow changeset history,'
3337 b'follow changeset history,'
3335 b' or file history across copies and renames'
3338 b' or file history across copies and renames'
3336 ),
3339 ),
3337 ),
3340 ),
3338 (b'i', b'ignore-case', None, _(b'ignore case when matching')),
3341 (b'i', b'ignore-case', None, _(b'ignore case when matching')),
3339 (
3342 (
3340 b'l',
3343 b'l',
3341 b'files-with-matches',
3344 b'files-with-matches',
3342 None,
3345 None,
3343 _(b'print only filenames and revisions that match'),
3346 _(b'print only filenames and revisions that match'),
3344 ),
3347 ),
3345 (b'n', b'line-number', None, _(b'print matching line numbers')),
3348 (b'n', b'line-number', None, _(b'print matching line numbers')),
3346 (
3349 (
3347 b'r',
3350 b'r',
3348 b'rev',
3351 b'rev',
3349 [],
3352 [],
3350 _(b'search files changed within revision range'),
3353 _(b'search files changed within revision range'),
3351 _(b'REV'),
3354 _(b'REV'),
3352 ),
3355 ),
3353 (
3356 (
3354 b'',
3357 b'',
3355 b'all-files',
3358 b'all-files',
3356 None,
3359 None,
3357 _(
3360 _(
3358 b'include all files in the changeset while grepping (DEPRECATED)'
3361 b'include all files in the changeset while grepping (DEPRECATED)'
3359 ),
3362 ),
3360 ),
3363 ),
3361 (b'u', b'user', None, _(b'list the author (long with -v)')),
3364 (b'u', b'user', None, _(b'list the author (long with -v)')),
3362 (b'd', b'date', None, _(b'list the date (short with -q)')),
3365 (b'd', b'date', None, _(b'list the date (short with -q)')),
3363 ]
3366 ]
3364 + formatteropts
3367 + formatteropts
3365 + walkopts,
3368 + walkopts,
3366 _(b'[--diff] [OPTION]... PATTERN [FILE]...'),
3369 _(b'[--diff] [OPTION]... PATTERN [FILE]...'),
3367 helpcategory=command.CATEGORY_FILE_CONTENTS,
3370 helpcategory=command.CATEGORY_FILE_CONTENTS,
3368 inferrepo=True,
3371 inferrepo=True,
3369 intents={INTENT_READONLY},
3372 intents={INTENT_READONLY},
3370 )
3373 )
3371 def grep(ui, repo, pattern, *pats, **opts):
3374 def grep(ui, repo, pattern, *pats, **opts):
3372 """search for a pattern in specified files
3375 """search for a pattern in specified files
3373
3376
3374 Search the working directory or revision history for a regular
3377 Search the working directory or revision history for a regular
3375 expression in the specified files for the entire repository.
3378 expression in the specified files for the entire repository.
3376
3379
3377 By default, grep searches the repository files in the working
3380 By default, grep searches the repository files in the working
3378 directory and prints the files where it finds a match. To specify
3381 directory and prints the files where it finds a match. To specify
3379 historical revisions instead of the working directory, use the
3382 historical revisions instead of the working directory, use the
3380 --rev flag.
3383 --rev flag.
3381
3384
3382 To search instead historical revision differences that contains a
3385 To search instead historical revision differences that contains a
3383 change in match status ("-" for a match that becomes a non-match,
3386 change in match status ("-" for a match that becomes a non-match,
3384 or "+" for a non-match that becomes a match), use the --diff flag.
3387 or "+" for a non-match that becomes a match), use the --diff flag.
3385
3388
3386 PATTERN can be any Python (roughly Perl-compatible) regular
3389 PATTERN can be any Python (roughly Perl-compatible) regular
3387 expression.
3390 expression.
3388
3391
3389 If no FILEs are specified and the --rev flag isn't supplied, all
3392 If no FILEs are specified and the --rev flag isn't supplied, all
3390 files in the working directory are searched. When using the --rev
3393 files in the working directory are searched. When using the --rev
3391 flag and specifying FILEs, use the --follow argument to also
3394 flag and specifying FILEs, use the --follow argument to also
3392 follow the specified FILEs across renames and copies.
3395 follow the specified FILEs across renames and copies.
3393
3396
3394 .. container:: verbose
3397 .. container:: verbose
3395
3398
3396 Template:
3399 Template:
3397
3400
3398 The following keywords are supported in addition to the common template
3401 The following keywords are supported in addition to the common template
3399 keywords and functions. See also :hg:`help templates`.
3402 keywords and functions. See also :hg:`help templates`.
3400
3403
3401 :change: String. Character denoting insertion ``+`` or removal ``-``.
3404 :change: String. Character denoting insertion ``+`` or removal ``-``.
3402 Available if ``--diff`` is specified.
3405 Available if ``--diff`` is specified.
3403 :lineno: Integer. Line number of the match.
3406 :lineno: Integer. Line number of the match.
3404 :path: String. Repository-absolute path of the file.
3407 :path: String. Repository-absolute path of the file.
3405 :texts: List of text chunks.
3408 :texts: List of text chunks.
3406
3409
3407 And each entry of ``{texts}`` provides the following sub-keywords.
3410 And each entry of ``{texts}`` provides the following sub-keywords.
3408
3411
3409 :matched: Boolean. True if the chunk matches the specified pattern.
3412 :matched: Boolean. True if the chunk matches the specified pattern.
3410 :text: String. Chunk content.
3413 :text: String. Chunk content.
3411
3414
3412 See :hg:`help templates.operators` for the list expansion syntax.
3415 See :hg:`help templates.operators` for the list expansion syntax.
3413
3416
3414 Returns 0 if a match is found, 1 otherwise.
3417 Returns 0 if a match is found, 1 otherwise.
3415
3418
3416 """
3419 """
3417 cmdutil.check_incompatible_arguments(opts, 'all_files', ['all', 'diff'])
3420 cmdutil.check_incompatible_arguments(opts, 'all_files', ['all', 'diff'])
3418 opts = pycompat.byteskwargs(opts)
3421 opts = pycompat.byteskwargs(opts)
3419 diff = opts.get(b'all') or opts.get(b'diff')
3422 diff = opts.get(b'all') or opts.get(b'diff')
3420 follow = opts.get(b'follow')
3423 follow = opts.get(b'follow')
3421 if opts.get(b'all_files') is None and not diff:
3424 if opts.get(b'all_files') is None and not diff:
3422 opts[b'all_files'] = True
3425 opts[b'all_files'] = True
3423 plaingrep = (
3426 plaingrep = (
3424 opts.get(b'all_files')
3427 opts.get(b'all_files')
3425 and not opts.get(b'rev')
3428 and not opts.get(b'rev')
3426 and not opts.get(b'follow')
3429 and not opts.get(b'follow')
3427 )
3430 )
3428 all_files = opts.get(b'all_files')
3431 all_files = opts.get(b'all_files')
3429 if plaingrep:
3432 if plaingrep:
3430 opts[b'rev'] = [b'wdir()']
3433 opts[b'rev'] = [b'wdir()']
3431
3434
3432 reflags = re.M
3435 reflags = re.M
3433 if opts.get(b'ignore_case'):
3436 if opts.get(b'ignore_case'):
3434 reflags |= re.I
3437 reflags |= re.I
3435 try:
3438 try:
3436 regexp = util.re.compile(pattern, reflags)
3439 regexp = util.re.compile(pattern, reflags)
3437 except re.error as inst:
3440 except re.error as inst:
3438 ui.warn(
3441 ui.warn(
3439 _(b"grep: invalid match pattern: %s\n") % pycompat.bytestr(inst)
3442 _(b"grep: invalid match pattern: %s\n") % pycompat.bytestr(inst)
3440 )
3443 )
3441 return 1
3444 return 1
3442 sep, eol = b':', b'\n'
3445 sep, eol = b':', b'\n'
3443 if opts.get(b'print0'):
3446 if opts.get(b'print0'):
3444 sep = eol = b'\0'
3447 sep = eol = b'\0'
3445
3448
3446 searcher = grepmod.grepsearcher(
3449 searcher = grepmod.grepsearcher(
3447 ui, repo, regexp, all_files=all_files, diff=diff, follow=follow
3450 ui, repo, regexp, all_files=all_files, diff=diff, follow=follow
3448 )
3451 )
3449
3452
3450 getfile = searcher._getfile
3453 getfile = searcher._getfile
3451
3454
3452 uipathfn = scmutil.getuipathfn(repo)
3455 uipathfn = scmutil.getuipathfn(repo)
3453
3456
3454 def display(fm, fn, ctx, pstates, states):
3457 def display(fm, fn, ctx, pstates, states):
3455 rev = scmutil.intrev(ctx)
3458 rev = scmutil.intrev(ctx)
3456 if fm.isplain():
3459 if fm.isplain():
3457 formatuser = ui.shortuser
3460 formatuser = ui.shortuser
3458 else:
3461 else:
3459 formatuser = pycompat.bytestr
3462 formatuser = pycompat.bytestr
3460 if ui.quiet:
3463 if ui.quiet:
3461 datefmt = b'%Y-%m-%d'
3464 datefmt = b'%Y-%m-%d'
3462 else:
3465 else:
3463 datefmt = b'%a %b %d %H:%M:%S %Y %1%2'
3466 datefmt = b'%a %b %d %H:%M:%S %Y %1%2'
3464 found = False
3467 found = False
3465
3468
3466 @util.cachefunc
3469 @util.cachefunc
3467 def binary():
3470 def binary():
3468 flog = getfile(fn)
3471 flog = getfile(fn)
3469 try:
3472 try:
3470 return stringutil.binary(flog.read(ctx.filenode(fn)))
3473 return stringutil.binary(flog.read(ctx.filenode(fn)))
3471 except error.WdirUnsupported:
3474 except error.WdirUnsupported:
3472 return ctx[fn].isbinary()
3475 return ctx[fn].isbinary()
3473
3476
3474 fieldnamemap = {b'linenumber': b'lineno'}
3477 fieldnamemap = {b'linenumber': b'lineno'}
3475 if diff:
3478 if diff:
3476 iter = grepmod.difflinestates(pstates, states)
3479 iter = grepmod.difflinestates(pstates, states)
3477 else:
3480 else:
3478 iter = [(b'', l) for l in states]
3481 iter = [(b'', l) for l in states]
3479 for change, l in iter:
3482 for change, l in iter:
3480 fm.startitem()
3483 fm.startitem()
3481 fm.context(ctx=ctx)
3484 fm.context(ctx=ctx)
3482 fm.data(node=fm.hexfunc(scmutil.binnode(ctx)), path=fn)
3485 fm.data(node=fm.hexfunc(scmutil.binnode(ctx)), path=fn)
3483 fm.plain(uipathfn(fn), label=b'grep.filename')
3486 fm.plain(uipathfn(fn), label=b'grep.filename')
3484
3487
3485 cols = [
3488 cols = [
3486 (b'rev', b'%d', rev, not plaingrep, b''),
3489 (b'rev', b'%d', rev, not plaingrep, b''),
3487 (
3490 (
3488 b'linenumber',
3491 b'linenumber',
3489 b'%d',
3492 b'%d',
3490 l.linenum,
3493 l.linenum,
3491 opts.get(b'line_number'),
3494 opts.get(b'line_number'),
3492 b'',
3495 b'',
3493 ),
3496 ),
3494 ]
3497 ]
3495 if diff:
3498 if diff:
3496 cols.append(
3499 cols.append(
3497 (
3500 (
3498 b'change',
3501 b'change',
3499 b'%s',
3502 b'%s',
3500 change,
3503 change,
3501 True,
3504 True,
3502 b'grep.inserted '
3505 b'grep.inserted '
3503 if change == b'+'
3506 if change == b'+'
3504 else b'grep.deleted ',
3507 else b'grep.deleted ',
3505 )
3508 )
3506 )
3509 )
3507 cols.extend(
3510 cols.extend(
3508 [
3511 [
3509 (
3512 (
3510 b'user',
3513 b'user',
3511 b'%s',
3514 b'%s',
3512 formatuser(ctx.user()),
3515 formatuser(ctx.user()),
3513 opts.get(b'user'),
3516 opts.get(b'user'),
3514 b'',
3517 b'',
3515 ),
3518 ),
3516 (
3519 (
3517 b'date',
3520 b'date',
3518 b'%s',
3521 b'%s',
3519 fm.formatdate(ctx.date(), datefmt),
3522 fm.formatdate(ctx.date(), datefmt),
3520 opts.get(b'date'),
3523 opts.get(b'date'),
3521 b'',
3524 b'',
3522 ),
3525 ),
3523 ]
3526 ]
3524 )
3527 )
3525 for name, fmt, data, cond, extra_label in cols:
3528 for name, fmt, data, cond, extra_label in cols:
3526 if cond:
3529 if cond:
3527 fm.plain(sep, label=b'grep.sep')
3530 fm.plain(sep, label=b'grep.sep')
3528 field = fieldnamemap.get(name, name)
3531 field = fieldnamemap.get(name, name)
3529 label = extra_label + (b'grep.%s' % name)
3532 label = extra_label + (b'grep.%s' % name)
3530 fm.condwrite(cond, field, fmt, data, label=label)
3533 fm.condwrite(cond, field, fmt, data, label=label)
3531 if not opts.get(b'files_with_matches'):
3534 if not opts.get(b'files_with_matches'):
3532 fm.plain(sep, label=b'grep.sep')
3535 fm.plain(sep, label=b'grep.sep')
3533 if not opts.get(b'text') and binary():
3536 if not opts.get(b'text') and binary():
3534 fm.plain(_(b" Binary file matches"))
3537 fm.plain(_(b" Binary file matches"))
3535 else:
3538 else:
3536 displaymatches(fm.nested(b'texts', tmpl=b'{text}'), l)
3539 displaymatches(fm.nested(b'texts', tmpl=b'{text}'), l)
3537 fm.plain(eol)
3540 fm.plain(eol)
3538 found = True
3541 found = True
3539 if opts.get(b'files_with_matches'):
3542 if opts.get(b'files_with_matches'):
3540 break
3543 break
3541 return found
3544 return found
3542
3545
3543 def displaymatches(fm, l):
3546 def displaymatches(fm, l):
3544 p = 0
3547 p = 0
3545 for s, e in l.findpos(regexp):
3548 for s, e in l.findpos(regexp):
3546 if p < s:
3549 if p < s:
3547 fm.startitem()
3550 fm.startitem()
3548 fm.write(b'text', b'%s', l.line[p:s])
3551 fm.write(b'text', b'%s', l.line[p:s])
3549 fm.data(matched=False)
3552 fm.data(matched=False)
3550 fm.startitem()
3553 fm.startitem()
3551 fm.write(b'text', b'%s', l.line[s:e], label=b'grep.match')
3554 fm.write(b'text', b'%s', l.line[s:e], label=b'grep.match')
3552 fm.data(matched=True)
3555 fm.data(matched=True)
3553 p = e
3556 p = e
3554 if p < len(l.line):
3557 if p < len(l.line):
3555 fm.startitem()
3558 fm.startitem()
3556 fm.write(b'text', b'%s', l.line[p:])
3559 fm.write(b'text', b'%s', l.line[p:])
3557 fm.data(matched=False)
3560 fm.data(matched=False)
3558 fm.end()
3561 fm.end()
3559
3562
3560 found = False
3563 found = False
3561
3564
3562 wopts = logcmdutil.walkopts(
3565 wopts = logcmdutil.walkopts(
3563 pats=pats,
3566 pats=pats,
3564 opts=opts,
3567 opts=opts,
3565 revspec=opts[b'rev'],
3568 revspec=opts[b'rev'],
3566 include_pats=opts[b'include'],
3569 include_pats=opts[b'include'],
3567 exclude_pats=opts[b'exclude'],
3570 exclude_pats=opts[b'exclude'],
3568 follow=follow,
3571 follow=follow,
3569 force_changelog_traversal=all_files,
3572 force_changelog_traversal=all_files,
3570 filter_revisions_by_pats=not all_files,
3573 filter_revisions_by_pats=not all_files,
3571 )
3574 )
3572 revs, makefilematcher = logcmdutil.makewalker(repo, wopts)
3575 revs, makefilematcher = logcmdutil.makewalker(repo, wopts)
3573
3576
3574 ui.pager(b'grep')
3577 ui.pager(b'grep')
3575 fm = ui.formatter(b'grep', opts)
3578 fm = ui.formatter(b'grep', opts)
3576 for fn, ctx, pstates, states in searcher.searchfiles(revs, makefilematcher):
3579 for fn, ctx, pstates, states in searcher.searchfiles(revs, makefilematcher):
3577 r = display(fm, fn, ctx, pstates, states)
3580 r = display(fm, fn, ctx, pstates, states)
3578 found = found or r
3581 found = found or r
3579 if r and not diff and not all_files:
3582 if r and not diff and not all_files:
3580 searcher.skipfile(fn, ctx.rev())
3583 searcher.skipfile(fn, ctx.rev())
3581 fm.end()
3584 fm.end()
3582
3585
3583 return not found
3586 return not found
3584
3587
3585
3588
3586 @command(
3589 @command(
3587 b'heads',
3590 b'heads',
3588 [
3591 [
3589 (
3592 (
3590 b'r',
3593 b'r',
3591 b'rev',
3594 b'rev',
3592 b'',
3595 b'',
3593 _(b'show only heads which are descendants of STARTREV'),
3596 _(b'show only heads which are descendants of STARTREV'),
3594 _(b'STARTREV'),
3597 _(b'STARTREV'),
3595 ),
3598 ),
3596 (b't', b'topo', False, _(b'show topological heads only')),
3599 (b't', b'topo', False, _(b'show topological heads only')),
3597 (
3600 (
3598 b'a',
3601 b'a',
3599 b'active',
3602 b'active',
3600 False,
3603 False,
3601 _(b'show active branchheads only (DEPRECATED)'),
3604 _(b'show active branchheads only (DEPRECATED)'),
3602 ),
3605 ),
3603 (b'c', b'closed', False, _(b'show normal and closed branch heads')),
3606 (b'c', b'closed', False, _(b'show normal and closed branch heads')),
3604 ]
3607 ]
3605 + templateopts,
3608 + templateopts,
3606 _(b'[-ct] [-r STARTREV] [REV]...'),
3609 _(b'[-ct] [-r STARTREV] [REV]...'),
3607 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3610 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3608 intents={INTENT_READONLY},
3611 intents={INTENT_READONLY},
3609 )
3612 )
3610 def heads(ui, repo, *branchrevs, **opts):
3613 def heads(ui, repo, *branchrevs, **opts):
3611 """show branch heads
3614 """show branch heads
3612
3615
3613 With no arguments, show all open branch heads in the repository.
3616 With no arguments, show all open branch heads in the repository.
3614 Branch heads are changesets that have no descendants on the
3617 Branch heads are changesets that have no descendants on the
3615 same branch. They are where development generally takes place and
3618 same branch. They are where development generally takes place and
3616 are the usual targets for update and merge operations.
3619 are the usual targets for update and merge operations.
3617
3620
3618 If one or more REVs are given, only open branch heads on the
3621 If one or more REVs are given, only open branch heads on the
3619 branches associated with the specified changesets are shown. This
3622 branches associated with the specified changesets are shown. This
3620 means that you can use :hg:`heads .` to see the heads on the
3623 means that you can use :hg:`heads .` to see the heads on the
3621 currently checked-out branch.
3624 currently checked-out branch.
3622
3625
3623 If -c/--closed is specified, also show branch heads marked closed
3626 If -c/--closed is specified, also show branch heads marked closed
3624 (see :hg:`commit --close-branch`).
3627 (see :hg:`commit --close-branch`).
3625
3628
3626 If STARTREV is specified, only those heads that are descendants of
3629 If STARTREV is specified, only those heads that are descendants of
3627 STARTREV will be displayed.
3630 STARTREV will be displayed.
3628
3631
3629 If -t/--topo is specified, named branch mechanics will be ignored and only
3632 If -t/--topo is specified, named branch mechanics will be ignored and only
3630 topological heads (changesets with no children) will be shown.
3633 topological heads (changesets with no children) will be shown.
3631
3634
3632 Returns 0 if matching heads are found, 1 if not.
3635 Returns 0 if matching heads are found, 1 if not.
3633 """
3636 """
3634
3637
3635 opts = pycompat.byteskwargs(opts)
3638 opts = pycompat.byteskwargs(opts)
3636 start = None
3639 start = None
3637 rev = opts.get(b'rev')
3640 rev = opts.get(b'rev')
3638 if rev:
3641 if rev:
3639 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3642 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3640 start = scmutil.revsingle(repo, rev, None).node()
3643 start = scmutil.revsingle(repo, rev, None).node()
3641
3644
3642 if opts.get(b'topo'):
3645 if opts.get(b'topo'):
3643 heads = [repo[h] for h in repo.heads(start)]
3646 heads = [repo[h] for h in repo.heads(start)]
3644 else:
3647 else:
3645 heads = []
3648 heads = []
3646 for branch in repo.branchmap():
3649 for branch in repo.branchmap():
3647 heads += repo.branchheads(branch, start, opts.get(b'closed'))
3650 heads += repo.branchheads(branch, start, opts.get(b'closed'))
3648 heads = [repo[h] for h in heads]
3651 heads = [repo[h] for h in heads]
3649
3652
3650 if branchrevs:
3653 if branchrevs:
3651 branches = {
3654 branches = {
3652 repo[r].branch() for r in scmutil.revrange(repo, branchrevs)
3655 repo[r].branch() for r in scmutil.revrange(repo, branchrevs)
3653 }
3656 }
3654 heads = [h for h in heads if h.branch() in branches]
3657 heads = [h for h in heads if h.branch() in branches]
3655
3658
3656 if opts.get(b'active') and branchrevs:
3659 if opts.get(b'active') and branchrevs:
3657 dagheads = repo.heads(start)
3660 dagheads = repo.heads(start)
3658 heads = [h for h in heads if h.node() in dagheads]
3661 heads = [h for h in heads if h.node() in dagheads]
3659
3662
3660 if branchrevs:
3663 if branchrevs:
3661 haveheads = {h.branch() for h in heads}
3664 haveheads = {h.branch() for h in heads}
3662 if branches - haveheads:
3665 if branches - haveheads:
3663 headless = b', '.join(b for b in branches - haveheads)
3666 headless = b', '.join(b for b in branches - haveheads)
3664 msg = _(b'no open branch heads found on branches %s')
3667 msg = _(b'no open branch heads found on branches %s')
3665 if opts.get(b'rev'):
3668 if opts.get(b'rev'):
3666 msg += _(b' (started at %s)') % opts[b'rev']
3669 msg += _(b' (started at %s)') % opts[b'rev']
3667 ui.warn((msg + b'\n') % headless)
3670 ui.warn((msg + b'\n') % headless)
3668
3671
3669 if not heads:
3672 if not heads:
3670 return 1
3673 return 1
3671
3674
3672 ui.pager(b'heads')
3675 ui.pager(b'heads')
3673 heads = sorted(heads, key=lambda x: -(x.rev()))
3676 heads = sorted(heads, key=lambda x: -(x.rev()))
3674 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
3677 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
3675 for ctx in heads:
3678 for ctx in heads:
3676 displayer.show(ctx)
3679 displayer.show(ctx)
3677 displayer.close()
3680 displayer.close()
3678
3681
3679
3682
3680 @command(
3683 @command(
3681 b'help',
3684 b'help',
3682 [
3685 [
3683 (b'e', b'extension', None, _(b'show only help for extensions')),
3686 (b'e', b'extension', None, _(b'show only help for extensions')),
3684 (b'c', b'command', None, _(b'show only help for commands')),
3687 (b'c', b'command', None, _(b'show only help for commands')),
3685 (b'k', b'keyword', None, _(b'show topics matching keyword')),
3688 (b'k', b'keyword', None, _(b'show topics matching keyword')),
3686 (
3689 (
3687 b's',
3690 b's',
3688 b'system',
3691 b'system',
3689 [],
3692 [],
3690 _(b'show help for specific platform(s)'),
3693 _(b'show help for specific platform(s)'),
3691 _(b'PLATFORM'),
3694 _(b'PLATFORM'),
3692 ),
3695 ),
3693 ],
3696 ],
3694 _(b'[-eck] [-s PLATFORM] [TOPIC]'),
3697 _(b'[-eck] [-s PLATFORM] [TOPIC]'),
3695 helpcategory=command.CATEGORY_HELP,
3698 helpcategory=command.CATEGORY_HELP,
3696 norepo=True,
3699 norepo=True,
3697 intents={INTENT_READONLY},
3700 intents={INTENT_READONLY},
3698 )
3701 )
3699 def help_(ui, name=None, **opts):
3702 def help_(ui, name=None, **opts):
3700 """show help for a given topic or a help overview
3703 """show help for a given topic or a help overview
3701
3704
3702 With no arguments, print a list of commands with short help messages.
3705 With no arguments, print a list of commands with short help messages.
3703
3706
3704 Given a topic, extension, or command name, print help for that
3707 Given a topic, extension, or command name, print help for that
3705 topic.
3708 topic.
3706
3709
3707 Returns 0 if successful.
3710 Returns 0 if successful.
3708 """
3711 """
3709
3712
3710 keep = opts.get('system') or []
3713 keep = opts.get('system') or []
3711 if len(keep) == 0:
3714 if len(keep) == 0:
3712 if pycompat.sysplatform.startswith(b'win'):
3715 if pycompat.sysplatform.startswith(b'win'):
3713 keep.append(b'windows')
3716 keep.append(b'windows')
3714 elif pycompat.sysplatform == b'OpenVMS':
3717 elif pycompat.sysplatform == b'OpenVMS':
3715 keep.append(b'vms')
3718 keep.append(b'vms')
3716 elif pycompat.sysplatform == b'plan9':
3719 elif pycompat.sysplatform == b'plan9':
3717 keep.append(b'plan9')
3720 keep.append(b'plan9')
3718 else:
3721 else:
3719 keep.append(b'unix')
3722 keep.append(b'unix')
3720 keep.append(pycompat.sysplatform.lower())
3723 keep.append(pycompat.sysplatform.lower())
3721 if ui.verbose:
3724 if ui.verbose:
3722 keep.append(b'verbose')
3725 keep.append(b'verbose')
3723
3726
3724 commands = sys.modules[__name__]
3727 commands = sys.modules[__name__]
3725 formatted = help.formattedhelp(ui, commands, name, keep=keep, **opts)
3728 formatted = help.formattedhelp(ui, commands, name, keep=keep, **opts)
3726 ui.pager(b'help')
3729 ui.pager(b'help')
3727 ui.write(formatted)
3730 ui.write(formatted)
3728
3731
3729
3732
3730 @command(
3733 @command(
3731 b'identify|id',
3734 b'identify|id',
3732 [
3735 [
3733 (b'r', b'rev', b'', _(b'identify the specified revision'), _(b'REV')),
3736 (b'r', b'rev', b'', _(b'identify the specified revision'), _(b'REV')),
3734 (b'n', b'num', None, _(b'show local revision number')),
3737 (b'n', b'num', None, _(b'show local revision number')),
3735 (b'i', b'id', None, _(b'show global revision id')),
3738 (b'i', b'id', None, _(b'show global revision id')),
3736 (b'b', b'branch', None, _(b'show branch')),
3739 (b'b', b'branch', None, _(b'show branch')),
3737 (b't', b'tags', None, _(b'show tags')),
3740 (b't', b'tags', None, _(b'show tags')),
3738 (b'B', b'bookmarks', None, _(b'show bookmarks')),
3741 (b'B', b'bookmarks', None, _(b'show bookmarks')),
3739 ]
3742 ]
3740 + remoteopts
3743 + remoteopts
3741 + formatteropts,
3744 + formatteropts,
3742 _(b'[-nibtB] [-r REV] [SOURCE]'),
3745 _(b'[-nibtB] [-r REV] [SOURCE]'),
3743 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3746 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3744 optionalrepo=True,
3747 optionalrepo=True,
3745 intents={INTENT_READONLY},
3748 intents={INTENT_READONLY},
3746 )
3749 )
3747 def identify(
3750 def identify(
3748 ui,
3751 ui,
3749 repo,
3752 repo,
3750 source=None,
3753 source=None,
3751 rev=None,
3754 rev=None,
3752 num=None,
3755 num=None,
3753 id=None,
3756 id=None,
3754 branch=None,
3757 branch=None,
3755 tags=None,
3758 tags=None,
3756 bookmarks=None,
3759 bookmarks=None,
3757 **opts
3760 **opts
3758 ):
3761 ):
3759 """identify the working directory or specified revision
3762 """identify the working directory or specified revision
3760
3763
3761 Print a summary identifying the repository state at REV using one or
3764 Print a summary identifying the repository state at REV using one or
3762 two parent hash identifiers, followed by a "+" if the working
3765 two parent hash identifiers, followed by a "+" if the working
3763 directory has uncommitted changes, the branch name (if not default),
3766 directory has uncommitted changes, the branch name (if not default),
3764 a list of tags, and a list of bookmarks.
3767 a list of tags, and a list of bookmarks.
3765
3768
3766 When REV is not given, print a summary of the current state of the
3769 When REV is not given, print a summary of the current state of the
3767 repository including the working directory. Specify -r. to get information
3770 repository including the working directory. Specify -r. to get information
3768 of the working directory parent without scanning uncommitted changes.
3771 of the working directory parent without scanning uncommitted changes.
3769
3772
3770 Specifying a path to a repository root or Mercurial bundle will
3773 Specifying a path to a repository root or Mercurial bundle will
3771 cause lookup to operate on that repository/bundle.
3774 cause lookup to operate on that repository/bundle.
3772
3775
3773 .. container:: verbose
3776 .. container:: verbose
3774
3777
3775 Template:
3778 Template:
3776
3779
3777 The following keywords are supported in addition to the common template
3780 The following keywords are supported in addition to the common template
3778 keywords and functions. See also :hg:`help templates`.
3781 keywords and functions. See also :hg:`help templates`.
3779
3782
3780 :dirty: String. Character ``+`` denoting if the working directory has
3783 :dirty: String. Character ``+`` denoting if the working directory has
3781 uncommitted changes.
3784 uncommitted changes.
3782 :id: String. One or two nodes, optionally followed by ``+``.
3785 :id: String. One or two nodes, optionally followed by ``+``.
3783 :parents: List of strings. Parent nodes of the changeset.
3786 :parents: List of strings. Parent nodes of the changeset.
3784
3787
3785 Examples:
3788 Examples:
3786
3789
3787 - generate a build identifier for the working directory::
3790 - generate a build identifier for the working directory::
3788
3791
3789 hg id --id > build-id.dat
3792 hg id --id > build-id.dat
3790
3793
3791 - find the revision corresponding to a tag::
3794 - find the revision corresponding to a tag::
3792
3795
3793 hg id -n -r 1.3
3796 hg id -n -r 1.3
3794
3797
3795 - check the most recent revision of a remote repository::
3798 - check the most recent revision of a remote repository::
3796
3799
3797 hg id -r tip https://www.mercurial-scm.org/repo/hg/
3800 hg id -r tip https://www.mercurial-scm.org/repo/hg/
3798
3801
3799 See :hg:`log` for generating more information about specific revisions,
3802 See :hg:`log` for generating more information about specific revisions,
3800 including full hash identifiers.
3803 including full hash identifiers.
3801
3804
3802 Returns 0 if successful.
3805 Returns 0 if successful.
3803 """
3806 """
3804
3807
3805 opts = pycompat.byteskwargs(opts)
3808 opts = pycompat.byteskwargs(opts)
3806 if not repo and not source:
3809 if not repo and not source:
3807 raise error.InputError(
3810 raise error.InputError(
3808 _(b"there is no Mercurial repository here (.hg not found)")
3811 _(b"there is no Mercurial repository here (.hg not found)")
3809 )
3812 )
3810
3813
3811 default = not (num or id or branch or tags or bookmarks)
3814 default = not (num or id or branch or tags or bookmarks)
3812 output = []
3815 output = []
3813 revs = []
3816 revs = []
3814
3817
3815 if source:
3818 if source:
3816 source, branches = hg.parseurl(ui.expandpath(source))
3819 source, branches = hg.parseurl(ui.expandpath(source))
3817 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
3820 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
3818 repo = peer.local()
3821 repo = peer.local()
3819 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3822 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3820
3823
3821 fm = ui.formatter(b'identify', opts)
3824 fm = ui.formatter(b'identify', opts)
3822 fm.startitem()
3825 fm.startitem()
3823
3826
3824 if not repo:
3827 if not repo:
3825 if num or branch or tags:
3828 if num or branch or tags:
3826 raise error.InputError(
3829 raise error.InputError(
3827 _(b"can't query remote revision number, branch, or tags")
3830 _(b"can't query remote revision number, branch, or tags")
3828 )
3831 )
3829 if not rev and revs:
3832 if not rev and revs:
3830 rev = revs[0]
3833 rev = revs[0]
3831 if not rev:
3834 if not rev:
3832 rev = b"tip"
3835 rev = b"tip"
3833
3836
3834 remoterev = peer.lookup(rev)
3837 remoterev = peer.lookup(rev)
3835 hexrev = fm.hexfunc(remoterev)
3838 hexrev = fm.hexfunc(remoterev)
3836 if default or id:
3839 if default or id:
3837 output = [hexrev]
3840 output = [hexrev]
3838 fm.data(id=hexrev)
3841 fm.data(id=hexrev)
3839
3842
3840 @util.cachefunc
3843 @util.cachefunc
3841 def getbms():
3844 def getbms():
3842 bms = []
3845 bms = []
3843
3846
3844 if b'bookmarks' in peer.listkeys(b'namespaces'):
3847 if b'bookmarks' in peer.listkeys(b'namespaces'):
3845 hexremoterev = hex(remoterev)
3848 hexremoterev = hex(remoterev)
3846 bms = [
3849 bms = [
3847 bm
3850 bm
3848 for bm, bmr in pycompat.iteritems(
3851 for bm, bmr in pycompat.iteritems(
3849 peer.listkeys(b'bookmarks')
3852 peer.listkeys(b'bookmarks')
3850 )
3853 )
3851 if bmr == hexremoterev
3854 if bmr == hexremoterev
3852 ]
3855 ]
3853
3856
3854 return sorted(bms)
3857 return sorted(bms)
3855
3858
3856 if fm.isplain():
3859 if fm.isplain():
3857 if bookmarks:
3860 if bookmarks:
3858 output.extend(getbms())
3861 output.extend(getbms())
3859 elif default and not ui.quiet:
3862 elif default and not ui.quiet:
3860 # multiple bookmarks for a single parent separated by '/'
3863 # multiple bookmarks for a single parent separated by '/'
3861 bm = b'/'.join(getbms())
3864 bm = b'/'.join(getbms())
3862 if bm:
3865 if bm:
3863 output.append(bm)
3866 output.append(bm)
3864 else:
3867 else:
3865 fm.data(node=hex(remoterev))
3868 fm.data(node=hex(remoterev))
3866 if bookmarks or b'bookmarks' in fm.datahint():
3869 if bookmarks or b'bookmarks' in fm.datahint():
3867 fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
3870 fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
3868 else:
3871 else:
3869 if rev:
3872 if rev:
3870 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3873 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3871 ctx = scmutil.revsingle(repo, rev, None)
3874 ctx = scmutil.revsingle(repo, rev, None)
3872
3875
3873 if ctx.rev() is None:
3876 if ctx.rev() is None:
3874 ctx = repo[None]
3877 ctx = repo[None]
3875 parents = ctx.parents()
3878 parents = ctx.parents()
3876 taglist = []
3879 taglist = []
3877 for p in parents:
3880 for p in parents:
3878 taglist.extend(p.tags())
3881 taglist.extend(p.tags())
3879
3882
3880 dirty = b""
3883 dirty = b""
3881 if ctx.dirty(missing=True, merge=False, branch=False):
3884 if ctx.dirty(missing=True, merge=False, branch=False):
3882 dirty = b'+'
3885 dirty = b'+'
3883 fm.data(dirty=dirty)
3886 fm.data(dirty=dirty)
3884
3887
3885 hexoutput = [fm.hexfunc(p.node()) for p in parents]
3888 hexoutput = [fm.hexfunc(p.node()) for p in parents]
3886 if default or id:
3889 if default or id:
3887 output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
3890 output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
3888 fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
3891 fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
3889
3892
3890 if num:
3893 if num:
3891 numoutput = [b"%d" % p.rev() for p in parents]
3894 numoutput = [b"%d" % p.rev() for p in parents]
3892 output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
3895 output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
3893
3896
3894 fm.data(
3897 fm.data(
3895 parents=fm.formatlist(
3898 parents=fm.formatlist(
3896 [fm.hexfunc(p.node()) for p in parents], name=b'node'
3899 [fm.hexfunc(p.node()) for p in parents], name=b'node'
3897 )
3900 )
3898 )
3901 )
3899 else:
3902 else:
3900 hexoutput = fm.hexfunc(ctx.node())
3903 hexoutput = fm.hexfunc(ctx.node())
3901 if default or id:
3904 if default or id:
3902 output = [hexoutput]
3905 output = [hexoutput]
3903 fm.data(id=hexoutput)
3906 fm.data(id=hexoutput)
3904
3907
3905 if num:
3908 if num:
3906 output.append(pycompat.bytestr(ctx.rev()))
3909 output.append(pycompat.bytestr(ctx.rev()))
3907 taglist = ctx.tags()
3910 taglist = ctx.tags()
3908
3911
3909 if default and not ui.quiet:
3912 if default and not ui.quiet:
3910 b = ctx.branch()
3913 b = ctx.branch()
3911 if b != b'default':
3914 if b != b'default':
3912 output.append(b"(%s)" % b)
3915 output.append(b"(%s)" % b)
3913
3916
3914 # multiple tags for a single parent separated by '/'
3917 # multiple tags for a single parent separated by '/'
3915 t = b'/'.join(taglist)
3918 t = b'/'.join(taglist)
3916 if t:
3919 if t:
3917 output.append(t)
3920 output.append(t)
3918
3921
3919 # multiple bookmarks for a single parent separated by '/'
3922 # multiple bookmarks for a single parent separated by '/'
3920 bm = b'/'.join(ctx.bookmarks())
3923 bm = b'/'.join(ctx.bookmarks())
3921 if bm:
3924 if bm:
3922 output.append(bm)
3925 output.append(bm)
3923 else:
3926 else:
3924 if branch:
3927 if branch:
3925 output.append(ctx.branch())
3928 output.append(ctx.branch())
3926
3929
3927 if tags:
3930 if tags:
3928 output.extend(taglist)
3931 output.extend(taglist)
3929
3932
3930 if bookmarks:
3933 if bookmarks:
3931 output.extend(ctx.bookmarks())
3934 output.extend(ctx.bookmarks())
3932
3935
3933 fm.data(node=ctx.hex())
3936 fm.data(node=ctx.hex())
3934 fm.data(branch=ctx.branch())
3937 fm.data(branch=ctx.branch())
3935 fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
3938 fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
3936 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
3939 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
3937 fm.context(ctx=ctx)
3940 fm.context(ctx=ctx)
3938
3941
3939 fm.plain(b"%s\n" % b' '.join(output))
3942 fm.plain(b"%s\n" % b' '.join(output))
3940 fm.end()
3943 fm.end()
3941
3944
3942
3945
3943 @command(
3946 @command(
3944 b'import|patch',
3947 b'import|patch',
3945 [
3948 [
3946 (
3949 (
3947 b'p',
3950 b'p',
3948 b'strip',
3951 b'strip',
3949 1,
3952 1,
3950 _(
3953 _(
3951 b'directory strip option for patch. This has the same '
3954 b'directory strip option for patch. This has the same '
3952 b'meaning as the corresponding patch option'
3955 b'meaning as the corresponding patch option'
3953 ),
3956 ),
3954 _(b'NUM'),
3957 _(b'NUM'),
3955 ),
3958 ),
3956 (b'b', b'base', b'', _(b'base path (DEPRECATED)'), _(b'PATH')),
3959 (b'b', b'base', b'', _(b'base path (DEPRECATED)'), _(b'PATH')),
3957 (b'', b'secret', None, _(b'use the secret phase for committing')),
3960 (b'', b'secret', None, _(b'use the secret phase for committing')),
3958 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
3961 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
3959 (
3962 (
3960 b'f',
3963 b'f',
3961 b'force',
3964 b'force',
3962 None,
3965 None,
3963 _(b'skip check for outstanding uncommitted changes (DEPRECATED)'),
3966 _(b'skip check for outstanding uncommitted changes (DEPRECATED)'),
3964 ),
3967 ),
3965 (
3968 (
3966 b'',
3969 b'',
3967 b'no-commit',
3970 b'no-commit',
3968 None,
3971 None,
3969 _(b"don't commit, just update the working directory"),
3972 _(b"don't commit, just update the working directory"),
3970 ),
3973 ),
3971 (
3974 (
3972 b'',
3975 b'',
3973 b'bypass',
3976 b'bypass',
3974 None,
3977 None,
3975 _(b"apply patch without touching the working directory"),
3978 _(b"apply patch without touching the working directory"),
3976 ),
3979 ),
3977 (b'', b'partial', None, _(b'commit even if some hunks fail')),
3980 (b'', b'partial', None, _(b'commit even if some hunks fail')),
3978 (b'', b'exact', None, _(b'abort if patch would apply lossily')),
3981 (b'', b'exact', None, _(b'abort if patch would apply lossily')),
3979 (b'', b'prefix', b'', _(b'apply patch to subdirectory'), _(b'DIR')),
3982 (b'', b'prefix', b'', _(b'apply patch to subdirectory'), _(b'DIR')),
3980 (
3983 (
3981 b'',
3984 b'',
3982 b'import-branch',
3985 b'import-branch',
3983 None,
3986 None,
3984 _(b'use any branch information in patch (implied by --exact)'),
3987 _(b'use any branch information in patch (implied by --exact)'),
3985 ),
3988 ),
3986 ]
3989 ]
3987 + commitopts
3990 + commitopts
3988 + commitopts2
3991 + commitopts2
3989 + similarityopts,
3992 + similarityopts,
3990 _(b'[OPTION]... PATCH...'),
3993 _(b'[OPTION]... PATCH...'),
3991 helpcategory=command.CATEGORY_IMPORT_EXPORT,
3994 helpcategory=command.CATEGORY_IMPORT_EXPORT,
3992 )
3995 )
3993 def import_(ui, repo, patch1=None, *patches, **opts):
3996 def import_(ui, repo, patch1=None, *patches, **opts):
3994 """import an ordered set of patches
3997 """import an ordered set of patches
3995
3998
3996 Import a list of patches and commit them individually (unless
3999 Import a list of patches and commit them individually (unless
3997 --no-commit is specified).
4000 --no-commit is specified).
3998
4001
3999 To read a patch from standard input (stdin), use "-" as the patch
4002 To read a patch from standard input (stdin), use "-" as the patch
4000 name. If a URL is specified, the patch will be downloaded from
4003 name. If a URL is specified, the patch will be downloaded from
4001 there.
4004 there.
4002
4005
4003 Import first applies changes to the working directory (unless
4006 Import first applies changes to the working directory (unless
4004 --bypass is specified), import will abort if there are outstanding
4007 --bypass is specified), import will abort if there are outstanding
4005 changes.
4008 changes.
4006
4009
4007 Use --bypass to apply and commit patches directly to the
4010 Use --bypass to apply and commit patches directly to the
4008 repository, without affecting the working directory. Without
4011 repository, without affecting the working directory. Without
4009 --exact, patches will be applied on top of the working directory
4012 --exact, patches will be applied on top of the working directory
4010 parent revision.
4013 parent revision.
4011
4014
4012 You can import a patch straight from a mail message. Even patches
4015 You can import a patch straight from a mail message. Even patches
4013 as attachments work (to use the body part, it must have type
4016 as attachments work (to use the body part, it must have type
4014 text/plain or text/x-patch). From and Subject headers of email
4017 text/plain or text/x-patch). From and Subject headers of email
4015 message are used as default committer and commit message. All
4018 message are used as default committer and commit message. All
4016 text/plain body parts before first diff are added to the commit
4019 text/plain body parts before first diff are added to the commit
4017 message.
4020 message.
4018
4021
4019 If the imported patch was generated by :hg:`export`, user and
4022 If the imported patch was generated by :hg:`export`, user and
4020 description from patch override values from message headers and
4023 description from patch override values from message headers and
4021 body. Values given on command line with -m/--message and -u/--user
4024 body. Values given on command line with -m/--message and -u/--user
4022 override these.
4025 override these.
4023
4026
4024 If --exact is specified, import will set the working directory to
4027 If --exact is specified, import will set the working directory to
4025 the parent of each patch before applying it, and will abort if the
4028 the parent of each patch before applying it, and will abort if the
4026 resulting changeset has a different ID than the one recorded in
4029 resulting changeset has a different ID than the one recorded in
4027 the patch. This will guard against various ways that portable
4030 the patch. This will guard against various ways that portable
4028 patch formats and mail systems might fail to transfer Mercurial
4031 patch formats and mail systems might fail to transfer Mercurial
4029 data or metadata. See :hg:`bundle` for lossless transmission.
4032 data or metadata. See :hg:`bundle` for lossless transmission.
4030
4033
4031 Use --partial to ensure a changeset will be created from the patch
4034 Use --partial to ensure a changeset will be created from the patch
4032 even if some hunks fail to apply. Hunks that fail to apply will be
4035 even if some hunks fail to apply. Hunks that fail to apply will be
4033 written to a <target-file>.rej file. Conflicts can then be resolved
4036 written to a <target-file>.rej file. Conflicts can then be resolved
4034 by hand before :hg:`commit --amend` is run to update the created
4037 by hand before :hg:`commit --amend` is run to update the created
4035 changeset. This flag exists to let people import patches that
4038 changeset. This flag exists to let people import patches that
4036 partially apply without losing the associated metadata (author,
4039 partially apply without losing the associated metadata (author,
4037 date, description, ...).
4040 date, description, ...).
4038
4041
4039 .. note::
4042 .. note::
4040
4043
4041 When no hunks apply cleanly, :hg:`import --partial` will create
4044 When no hunks apply cleanly, :hg:`import --partial` will create
4042 an empty changeset, importing only the patch metadata.
4045 an empty changeset, importing only the patch metadata.
4043
4046
4044 With -s/--similarity, hg will attempt to discover renames and
4047 With -s/--similarity, hg will attempt to discover renames and
4045 copies in the patch in the same way as :hg:`addremove`.
4048 copies in the patch in the same way as :hg:`addremove`.
4046
4049
4047 It is possible to use external patch programs to perform the patch
4050 It is possible to use external patch programs to perform the patch
4048 by setting the ``ui.patch`` configuration option. For the default
4051 by setting the ``ui.patch`` configuration option. For the default
4049 internal tool, the fuzz can also be configured via ``patch.fuzz``.
4052 internal tool, the fuzz can also be configured via ``patch.fuzz``.
4050 See :hg:`help config` for more information about configuration
4053 See :hg:`help config` for more information about configuration
4051 files and how to use these options.
4054 files and how to use these options.
4052
4055
4053 See :hg:`help dates` for a list of formats valid for -d/--date.
4056 See :hg:`help dates` for a list of formats valid for -d/--date.
4054
4057
4055 .. container:: verbose
4058 .. container:: verbose
4056
4059
4057 Examples:
4060 Examples:
4058
4061
4059 - import a traditional patch from a website and detect renames::
4062 - import a traditional patch from a website and detect renames::
4060
4063
4061 hg import -s 80 http://example.com/bugfix.patch
4064 hg import -s 80 http://example.com/bugfix.patch
4062
4065
4063 - import a changeset from an hgweb server::
4066 - import a changeset from an hgweb server::
4064
4067
4065 hg import https://www.mercurial-scm.org/repo/hg/rev/5ca8c111e9aa
4068 hg import https://www.mercurial-scm.org/repo/hg/rev/5ca8c111e9aa
4066
4069
4067 - import all the patches in an Unix-style mbox::
4070 - import all the patches in an Unix-style mbox::
4068
4071
4069 hg import incoming-patches.mbox
4072 hg import incoming-patches.mbox
4070
4073
4071 - import patches from stdin::
4074 - import patches from stdin::
4072
4075
4073 hg import -
4076 hg import -
4074
4077
4075 - attempt to exactly restore an exported changeset (not always
4078 - attempt to exactly restore an exported changeset (not always
4076 possible)::
4079 possible)::
4077
4080
4078 hg import --exact proposed-fix.patch
4081 hg import --exact proposed-fix.patch
4079
4082
4080 - use an external tool to apply a patch which is too fuzzy for
4083 - use an external tool to apply a patch which is too fuzzy for
4081 the default internal tool.
4084 the default internal tool.
4082
4085
4083 hg import --config ui.patch="patch --merge" fuzzy.patch
4086 hg import --config ui.patch="patch --merge" fuzzy.patch
4084
4087
4085 - change the default fuzzing from 2 to a less strict 7
4088 - change the default fuzzing from 2 to a less strict 7
4086
4089
4087 hg import --config ui.fuzz=7 fuzz.patch
4090 hg import --config ui.fuzz=7 fuzz.patch
4088
4091
4089 Returns 0 on success, 1 on partial success (see --partial).
4092 Returns 0 on success, 1 on partial success (see --partial).
4090 """
4093 """
4091
4094
4092 cmdutil.check_incompatible_arguments(
4095 cmdutil.check_incompatible_arguments(
4093 opts, 'no_commit', ['bypass', 'secret']
4096 opts, 'no_commit', ['bypass', 'secret']
4094 )
4097 )
4095 cmdutil.check_incompatible_arguments(opts, 'exact', ['edit', 'prefix'])
4098 cmdutil.check_incompatible_arguments(opts, 'exact', ['edit', 'prefix'])
4096 opts = pycompat.byteskwargs(opts)
4099 opts = pycompat.byteskwargs(opts)
4097 if not patch1:
4100 if not patch1:
4098 raise error.InputError(_(b'need at least one patch to import'))
4101 raise error.InputError(_(b'need at least one patch to import'))
4099
4102
4100 patches = (patch1,) + patches
4103 patches = (patch1,) + patches
4101
4104
4102 date = opts.get(b'date')
4105 date = opts.get(b'date')
4103 if date:
4106 if date:
4104 opts[b'date'] = dateutil.parsedate(date)
4107 opts[b'date'] = dateutil.parsedate(date)
4105
4108
4106 exact = opts.get(b'exact')
4109 exact = opts.get(b'exact')
4107 update = not opts.get(b'bypass')
4110 update = not opts.get(b'bypass')
4108 try:
4111 try:
4109 sim = float(opts.get(b'similarity') or 0)
4112 sim = float(opts.get(b'similarity') or 0)
4110 except ValueError:
4113 except ValueError:
4111 raise error.InputError(_(b'similarity must be a number'))
4114 raise error.InputError(_(b'similarity must be a number'))
4112 if sim < 0 or sim > 100:
4115 if sim < 0 or sim > 100:
4113 raise error.InputError(_(b'similarity must be between 0 and 100'))
4116 raise error.InputError(_(b'similarity must be between 0 and 100'))
4114 if sim and not update:
4117 if sim and not update:
4115 raise error.InputError(_(b'cannot use --similarity with --bypass'))
4118 raise error.InputError(_(b'cannot use --similarity with --bypass'))
4116
4119
4117 base = opts[b"base"]
4120 base = opts[b"base"]
4118 msgs = []
4121 msgs = []
4119 ret = 0
4122 ret = 0
4120
4123
4121 with repo.wlock():
4124 with repo.wlock():
4122 if update:
4125 if update:
4123 cmdutil.checkunfinished(repo)
4126 cmdutil.checkunfinished(repo)
4124 if exact or not opts.get(b'force'):
4127 if exact or not opts.get(b'force'):
4125 cmdutil.bailifchanged(repo)
4128 cmdutil.bailifchanged(repo)
4126
4129
4127 if not opts.get(b'no_commit'):
4130 if not opts.get(b'no_commit'):
4128 lock = repo.lock
4131 lock = repo.lock
4129 tr = lambda: repo.transaction(b'import')
4132 tr = lambda: repo.transaction(b'import')
4130 dsguard = util.nullcontextmanager
4133 dsguard = util.nullcontextmanager
4131 else:
4134 else:
4132 lock = util.nullcontextmanager
4135 lock = util.nullcontextmanager
4133 tr = util.nullcontextmanager
4136 tr = util.nullcontextmanager
4134 dsguard = lambda: dirstateguard.dirstateguard(repo, b'import')
4137 dsguard = lambda: dirstateguard.dirstateguard(repo, b'import')
4135 with lock(), tr(), dsguard():
4138 with lock(), tr(), dsguard():
4136 parents = repo[None].parents()
4139 parents = repo[None].parents()
4137 for patchurl in patches:
4140 for patchurl in patches:
4138 if patchurl == b'-':
4141 if patchurl == b'-':
4139 ui.status(_(b'applying patch from stdin\n'))
4142 ui.status(_(b'applying patch from stdin\n'))
4140 patchfile = ui.fin
4143 patchfile = ui.fin
4141 patchurl = b'stdin' # for error message
4144 patchurl = b'stdin' # for error message
4142 else:
4145 else:
4143 patchurl = os.path.join(base, patchurl)
4146 patchurl = os.path.join(base, patchurl)
4144 ui.status(_(b'applying %s\n') % patchurl)
4147 ui.status(_(b'applying %s\n') % patchurl)
4145 patchfile = hg.openpath(ui, patchurl, sendaccept=False)
4148 patchfile = hg.openpath(ui, patchurl, sendaccept=False)
4146
4149
4147 haspatch = False
4150 haspatch = False
4148 for hunk in patch.split(patchfile):
4151 for hunk in patch.split(patchfile):
4149 with patch.extract(ui, hunk) as patchdata:
4152 with patch.extract(ui, hunk) as patchdata:
4150 msg, node, rej = cmdutil.tryimportone(
4153 msg, node, rej = cmdutil.tryimportone(
4151 ui, repo, patchdata, parents, opts, msgs, hg.clean
4154 ui, repo, patchdata, parents, opts, msgs, hg.clean
4152 )
4155 )
4153 if msg:
4156 if msg:
4154 haspatch = True
4157 haspatch = True
4155 ui.note(msg + b'\n')
4158 ui.note(msg + b'\n')
4156 if update or exact:
4159 if update or exact:
4157 parents = repo[None].parents()
4160 parents = repo[None].parents()
4158 else:
4161 else:
4159 parents = [repo[node]]
4162 parents = [repo[node]]
4160 if rej:
4163 if rej:
4161 ui.write_err(_(b"patch applied partially\n"))
4164 ui.write_err(_(b"patch applied partially\n"))
4162 ui.write_err(
4165 ui.write_err(
4163 _(
4166 _(
4164 b"(fix the .rej files and run "
4167 b"(fix the .rej files and run "
4165 b"`hg commit --amend`)\n"
4168 b"`hg commit --amend`)\n"
4166 )
4169 )
4167 )
4170 )
4168 ret = 1
4171 ret = 1
4169 break
4172 break
4170
4173
4171 if not haspatch:
4174 if not haspatch:
4172 raise error.InputError(_(b'%s: no diffs found') % patchurl)
4175 raise error.InputError(_(b'%s: no diffs found') % patchurl)
4173
4176
4174 if msgs:
4177 if msgs:
4175 repo.savecommitmessage(b'\n* * *\n'.join(msgs))
4178 repo.savecommitmessage(b'\n* * *\n'.join(msgs))
4176 return ret
4179 return ret
4177
4180
4178
4181
4179 @command(
4182 @command(
4180 b'incoming|in',
4183 b'incoming|in',
4181 [
4184 [
4182 (
4185 (
4183 b'f',
4186 b'f',
4184 b'force',
4187 b'force',
4185 None,
4188 None,
4186 _(b'run even if remote repository is unrelated'),
4189 _(b'run even if remote repository is unrelated'),
4187 ),
4190 ),
4188 (b'n', b'newest-first', None, _(b'show newest record first')),
4191 (b'n', b'newest-first', None, _(b'show newest record first')),
4189 (b'', b'bundle', b'', _(b'file to store the bundles into'), _(b'FILE')),
4192 (b'', b'bundle', b'', _(b'file to store the bundles into'), _(b'FILE')),
4190 (
4193 (
4191 b'r',
4194 b'r',
4192 b'rev',
4195 b'rev',
4193 [],
4196 [],
4194 _(b'a remote changeset intended to be added'),
4197 _(b'a remote changeset intended to be added'),
4195 _(b'REV'),
4198 _(b'REV'),
4196 ),
4199 ),
4197 (b'B', b'bookmarks', False, _(b"compare bookmarks")),
4200 (b'B', b'bookmarks', False, _(b"compare bookmarks")),
4198 (
4201 (
4199 b'b',
4202 b'b',
4200 b'branch',
4203 b'branch',
4201 [],
4204 [],
4202 _(b'a specific branch you would like to pull'),
4205 _(b'a specific branch you would like to pull'),
4203 _(b'BRANCH'),
4206 _(b'BRANCH'),
4204 ),
4207 ),
4205 ]
4208 ]
4206 + logopts
4209 + logopts
4207 + remoteopts
4210 + remoteopts
4208 + subrepoopts,
4211 + subrepoopts,
4209 _(b'[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'),
4212 _(b'[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'),
4210 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4213 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4211 )
4214 )
4212 def incoming(ui, repo, source=b"default", **opts):
4215 def incoming(ui, repo, source=b"default", **opts):
4213 """show new changesets found in source
4216 """show new changesets found in source
4214
4217
4215 Show new changesets found in the specified path/URL or the default
4218 Show new changesets found in the specified path/URL or the default
4216 pull location. These are the changesets that would have been pulled
4219 pull location. These are the changesets that would have been pulled
4217 by :hg:`pull` at the time you issued this command.
4220 by :hg:`pull` at the time you issued this command.
4218
4221
4219 See pull for valid source format details.
4222 See pull for valid source format details.
4220
4223
4221 .. container:: verbose
4224 .. container:: verbose
4222
4225
4223 With -B/--bookmarks, the result of bookmark comparison between
4226 With -B/--bookmarks, the result of bookmark comparison between
4224 local and remote repositories is displayed. With -v/--verbose,
4227 local and remote repositories is displayed. With -v/--verbose,
4225 status is also displayed for each bookmark like below::
4228 status is also displayed for each bookmark like below::
4226
4229
4227 BM1 01234567890a added
4230 BM1 01234567890a added
4228 BM2 1234567890ab advanced
4231 BM2 1234567890ab advanced
4229 BM3 234567890abc diverged
4232 BM3 234567890abc diverged
4230 BM4 34567890abcd changed
4233 BM4 34567890abcd changed
4231
4234
4232 The action taken locally when pulling depends on the
4235 The action taken locally when pulling depends on the
4233 status of each bookmark:
4236 status of each bookmark:
4234
4237
4235 :``added``: pull will create it
4238 :``added``: pull will create it
4236 :``advanced``: pull will update it
4239 :``advanced``: pull will update it
4237 :``diverged``: pull will create a divergent bookmark
4240 :``diverged``: pull will create a divergent bookmark
4238 :``changed``: result depends on remote changesets
4241 :``changed``: result depends on remote changesets
4239
4242
4240 From the point of view of pulling behavior, bookmark
4243 From the point of view of pulling behavior, bookmark
4241 existing only in the remote repository are treated as ``added``,
4244 existing only in the remote repository are treated as ``added``,
4242 even if it is in fact locally deleted.
4245 even if it is in fact locally deleted.
4243
4246
4244 .. container:: verbose
4247 .. container:: verbose
4245
4248
4246 For remote repository, using --bundle avoids downloading the
4249 For remote repository, using --bundle avoids downloading the
4247 changesets twice if the incoming is followed by a pull.
4250 changesets twice if the incoming is followed by a pull.
4248
4251
4249 Examples:
4252 Examples:
4250
4253
4251 - show incoming changes with patches and full description::
4254 - show incoming changes with patches and full description::
4252
4255
4253 hg incoming -vp
4256 hg incoming -vp
4254
4257
4255 - show incoming changes excluding merges, store a bundle::
4258 - show incoming changes excluding merges, store a bundle::
4256
4259
4257 hg in -vpM --bundle incoming.hg
4260 hg in -vpM --bundle incoming.hg
4258 hg pull incoming.hg
4261 hg pull incoming.hg
4259
4262
4260 - briefly list changes inside a bundle::
4263 - briefly list changes inside a bundle::
4261
4264
4262 hg in changes.hg -T "{desc|firstline}\\n"
4265 hg in changes.hg -T "{desc|firstline}\\n"
4263
4266
4264 Returns 0 if there are incoming changes, 1 otherwise.
4267 Returns 0 if there are incoming changes, 1 otherwise.
4265 """
4268 """
4266 opts = pycompat.byteskwargs(opts)
4269 opts = pycompat.byteskwargs(opts)
4267 if opts.get(b'graph'):
4270 if opts.get(b'graph'):
4268 logcmdutil.checkunsupportedgraphflags([], opts)
4271 logcmdutil.checkunsupportedgraphflags([], opts)
4269
4272
4270 def display(other, chlist, displayer):
4273 def display(other, chlist, displayer):
4271 revdag = logcmdutil.graphrevs(other, chlist, opts)
4274 revdag = logcmdutil.graphrevs(other, chlist, opts)
4272 logcmdutil.displaygraph(
4275 logcmdutil.displaygraph(
4273 ui, repo, revdag, displayer, graphmod.asciiedges
4276 ui, repo, revdag, displayer, graphmod.asciiedges
4274 )
4277 )
4275
4278
4276 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4279 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4277 return 0
4280 return 0
4278
4281
4279 cmdutil.check_incompatible_arguments(opts, b'subrepos', [b'bundle'])
4282 cmdutil.check_incompatible_arguments(opts, b'subrepos', [b'bundle'])
4280
4283
4281 if opts.get(b'bookmarks'):
4284 if opts.get(b'bookmarks'):
4282 source, branches = hg.parseurl(
4285 source, branches = hg.parseurl(
4283 ui.expandpath(source), opts.get(b'branch')
4286 ui.expandpath(source), opts.get(b'branch')
4284 )
4287 )
4285 other = hg.peer(repo, opts, source)
4288 other = hg.peer(repo, opts, source)
4286 if b'bookmarks' not in other.listkeys(b'namespaces'):
4289 if b'bookmarks' not in other.listkeys(b'namespaces'):
4287 ui.warn(_(b"remote doesn't support bookmarks\n"))
4290 ui.warn(_(b"remote doesn't support bookmarks\n"))
4288 return 0
4291 return 0
4289 ui.pager(b'incoming')
4292 ui.pager(b'incoming')
4290 ui.status(_(b'comparing with %s\n') % util.hidepassword(source))
4293 ui.status(_(b'comparing with %s\n') % util.hidepassword(source))
4291 return bookmarks.incoming(ui, repo, other)
4294 return bookmarks.incoming(ui, repo, other)
4292
4295
4293 repo._subtoppath = ui.expandpath(source)
4296 repo._subtoppath = ui.expandpath(source)
4294 try:
4297 try:
4295 return hg.incoming(ui, repo, source, opts)
4298 return hg.incoming(ui, repo, source, opts)
4296 finally:
4299 finally:
4297 del repo._subtoppath
4300 del repo._subtoppath
4298
4301
4299
4302
4300 @command(
4303 @command(
4301 b'init',
4304 b'init',
4302 remoteopts,
4305 remoteopts,
4303 _(b'[-e CMD] [--remotecmd CMD] [DEST]'),
4306 _(b'[-e CMD] [--remotecmd CMD] [DEST]'),
4304 helpcategory=command.CATEGORY_REPO_CREATION,
4307 helpcategory=command.CATEGORY_REPO_CREATION,
4305 helpbasic=True,
4308 helpbasic=True,
4306 norepo=True,
4309 norepo=True,
4307 )
4310 )
4308 def init(ui, dest=b".", **opts):
4311 def init(ui, dest=b".", **opts):
4309 """create a new repository in the given directory
4312 """create a new repository in the given directory
4310
4313
4311 Initialize a new repository in the given directory. If the given
4314 Initialize a new repository in the given directory. If the given
4312 directory does not exist, it will be created.
4315 directory does not exist, it will be created.
4313
4316
4314 If no directory is given, the current directory is used.
4317 If no directory is given, the current directory is used.
4315
4318
4316 It is possible to specify an ``ssh://`` URL as the destination.
4319 It is possible to specify an ``ssh://`` URL as the destination.
4317 See :hg:`help urls` for more information.
4320 See :hg:`help urls` for more information.
4318
4321
4319 Returns 0 on success.
4322 Returns 0 on success.
4320 """
4323 """
4321 opts = pycompat.byteskwargs(opts)
4324 opts = pycompat.byteskwargs(opts)
4322 hg.peer(ui, opts, ui.expandpath(dest), create=True)
4325 hg.peer(ui, opts, ui.expandpath(dest), create=True)
4323
4326
4324
4327
4325 @command(
4328 @command(
4326 b'locate',
4329 b'locate',
4327 [
4330 [
4328 (
4331 (
4329 b'r',
4332 b'r',
4330 b'rev',
4333 b'rev',
4331 b'',
4334 b'',
4332 _(b'search the repository as it is in REV'),
4335 _(b'search the repository as it is in REV'),
4333 _(b'REV'),
4336 _(b'REV'),
4334 ),
4337 ),
4335 (
4338 (
4336 b'0',
4339 b'0',
4337 b'print0',
4340 b'print0',
4338 None,
4341 None,
4339 _(b'end filenames with NUL, for use with xargs'),
4342 _(b'end filenames with NUL, for use with xargs'),
4340 ),
4343 ),
4341 (
4344 (
4342 b'f',
4345 b'f',
4343 b'fullpath',
4346 b'fullpath',
4344 None,
4347 None,
4345 _(b'print complete paths from the filesystem root'),
4348 _(b'print complete paths from the filesystem root'),
4346 ),
4349 ),
4347 ]
4350 ]
4348 + walkopts,
4351 + walkopts,
4349 _(b'[OPTION]... [PATTERN]...'),
4352 _(b'[OPTION]... [PATTERN]...'),
4350 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
4353 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
4351 )
4354 )
4352 def locate(ui, repo, *pats, **opts):
4355 def locate(ui, repo, *pats, **opts):
4353 """locate files matching specific patterns (DEPRECATED)
4356 """locate files matching specific patterns (DEPRECATED)
4354
4357
4355 Print files under Mercurial control in the working directory whose
4358 Print files under Mercurial control in the working directory whose
4356 names match the given patterns.
4359 names match the given patterns.
4357
4360
4358 By default, this command searches all directories in the working
4361 By default, this command searches all directories in the working
4359 directory. To search just the current directory and its
4362 directory. To search just the current directory and its
4360 subdirectories, use "--include .".
4363 subdirectories, use "--include .".
4361
4364
4362 If no patterns are given to match, this command prints the names
4365 If no patterns are given to match, this command prints the names
4363 of all files under Mercurial control in the working directory.
4366 of all files under Mercurial control in the working directory.
4364
4367
4365 If you want to feed the output of this command into the "xargs"
4368 If you want to feed the output of this command into the "xargs"
4366 command, use the -0 option to both this command and "xargs". This
4369 command, use the -0 option to both this command and "xargs". This
4367 will avoid the problem of "xargs" treating single filenames that
4370 will avoid the problem of "xargs" treating single filenames that
4368 contain whitespace as multiple filenames.
4371 contain whitespace as multiple filenames.
4369
4372
4370 See :hg:`help files` for a more versatile command.
4373 See :hg:`help files` for a more versatile command.
4371
4374
4372 Returns 0 if a match is found, 1 otherwise.
4375 Returns 0 if a match is found, 1 otherwise.
4373 """
4376 """
4374 opts = pycompat.byteskwargs(opts)
4377 opts = pycompat.byteskwargs(opts)
4375 if opts.get(b'print0'):
4378 if opts.get(b'print0'):
4376 end = b'\0'
4379 end = b'\0'
4377 else:
4380 else:
4378 end = b'\n'
4381 end = b'\n'
4379 ctx = scmutil.revsingle(repo, opts.get(b'rev'), None)
4382 ctx = scmutil.revsingle(repo, opts.get(b'rev'), None)
4380
4383
4381 ret = 1
4384 ret = 1
4382 m = scmutil.match(
4385 m = scmutil.match(
4383 ctx, pats, opts, default=b'relglob', badfn=lambda x, y: False
4386 ctx, pats, opts, default=b'relglob', badfn=lambda x, y: False
4384 )
4387 )
4385
4388
4386 ui.pager(b'locate')
4389 ui.pager(b'locate')
4387 if ctx.rev() is None:
4390 if ctx.rev() is None:
4388 # When run on the working copy, "locate" includes removed files, so
4391 # When run on the working copy, "locate" includes removed files, so
4389 # we get the list of files from the dirstate.
4392 # we get the list of files from the dirstate.
4390 filesgen = sorted(repo.dirstate.matches(m))
4393 filesgen = sorted(repo.dirstate.matches(m))
4391 else:
4394 else:
4392 filesgen = ctx.matches(m)
4395 filesgen = ctx.matches(m)
4393 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=bool(pats))
4396 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=bool(pats))
4394 for abs in filesgen:
4397 for abs in filesgen:
4395 if opts.get(b'fullpath'):
4398 if opts.get(b'fullpath'):
4396 ui.write(repo.wjoin(abs), end)
4399 ui.write(repo.wjoin(abs), end)
4397 else:
4400 else:
4398 ui.write(uipathfn(abs), end)
4401 ui.write(uipathfn(abs), end)
4399 ret = 0
4402 ret = 0
4400
4403
4401 return ret
4404 return ret
4402
4405
4403
4406
4404 @command(
4407 @command(
4405 b'log|history',
4408 b'log|history',
4406 [
4409 [
4407 (
4410 (
4408 b'f',
4411 b'f',
4409 b'follow',
4412 b'follow',
4410 None,
4413 None,
4411 _(
4414 _(
4412 b'follow changeset history, or file history across copies and renames'
4415 b'follow changeset history, or file history across copies and renames'
4413 ),
4416 ),
4414 ),
4417 ),
4415 (
4418 (
4416 b'',
4419 b'',
4417 b'follow-first',
4420 b'follow-first',
4418 None,
4421 None,
4419 _(b'only follow the first parent of merge changesets (DEPRECATED)'),
4422 _(b'only follow the first parent of merge changesets (DEPRECATED)'),
4420 ),
4423 ),
4421 (
4424 (
4422 b'd',
4425 b'd',
4423 b'date',
4426 b'date',
4424 b'',
4427 b'',
4425 _(b'show revisions matching date spec'),
4428 _(b'show revisions matching date spec'),
4426 _(b'DATE'),
4429 _(b'DATE'),
4427 ),
4430 ),
4428 (b'C', b'copies', None, _(b'show copied files')),
4431 (b'C', b'copies', None, _(b'show copied files')),
4429 (
4432 (
4430 b'k',
4433 b'k',
4431 b'keyword',
4434 b'keyword',
4432 [],
4435 [],
4433 _(b'do case-insensitive search for a given text'),
4436 _(b'do case-insensitive search for a given text'),
4434 _(b'TEXT'),
4437 _(b'TEXT'),
4435 ),
4438 ),
4436 (
4439 (
4437 b'r',
4440 b'r',
4438 b'rev',
4441 b'rev',
4439 [],
4442 [],
4440 _(b'show the specified revision or revset'),
4443 _(b'show the specified revision or revset'),
4441 _(b'REV'),
4444 _(b'REV'),
4442 ),
4445 ),
4443 (
4446 (
4444 b'L',
4447 b'L',
4445 b'line-range',
4448 b'line-range',
4446 [],
4449 [],
4447 _(b'follow line range of specified file (EXPERIMENTAL)'),
4450 _(b'follow line range of specified file (EXPERIMENTAL)'),
4448 _(b'FILE,RANGE'),
4451 _(b'FILE,RANGE'),
4449 ),
4452 ),
4450 (
4453 (
4451 b'',
4454 b'',
4452 b'removed',
4455 b'removed',
4453 None,
4456 None,
4454 _(b'include revisions where files were removed'),
4457 _(b'include revisions where files were removed'),
4455 ),
4458 ),
4456 (
4459 (
4457 b'm',
4460 b'm',
4458 b'only-merges',
4461 b'only-merges',
4459 None,
4462 None,
4460 _(b'show only merges (DEPRECATED) (use -r "merge()" instead)'),
4463 _(b'show only merges (DEPRECATED) (use -r "merge()" instead)'),
4461 ),
4464 ),
4462 (b'u', b'user', [], _(b'revisions committed by user'), _(b'USER')),
4465 (b'u', b'user', [], _(b'revisions committed by user'), _(b'USER')),
4463 (
4466 (
4464 b'',
4467 b'',
4465 b'only-branch',
4468 b'only-branch',
4466 [],
4469 [],
4467 _(
4470 _(
4468 b'show only changesets within the given named branch (DEPRECATED)'
4471 b'show only changesets within the given named branch (DEPRECATED)'
4469 ),
4472 ),
4470 _(b'BRANCH'),
4473 _(b'BRANCH'),
4471 ),
4474 ),
4472 (
4475 (
4473 b'b',
4476 b'b',
4474 b'branch',
4477 b'branch',
4475 [],
4478 [],
4476 _(b'show changesets within the given named branch'),
4479 _(b'show changesets within the given named branch'),
4477 _(b'BRANCH'),
4480 _(b'BRANCH'),
4478 ),
4481 ),
4479 (
4482 (
4480 b'B',
4483 b'B',
4481 b'bookmark',
4484 b'bookmark',
4482 [],
4485 [],
4483 _(b"show changesets within the given bookmark"),
4486 _(b"show changesets within the given bookmark"),
4484 _(b'BOOKMARK'),
4487 _(b'BOOKMARK'),
4485 ),
4488 ),
4486 (
4489 (
4487 b'P',
4490 b'P',
4488 b'prune',
4491 b'prune',
4489 [],
4492 [],
4490 _(b'do not display revision or any of its ancestors'),
4493 _(b'do not display revision or any of its ancestors'),
4491 _(b'REV'),
4494 _(b'REV'),
4492 ),
4495 ),
4493 ]
4496 ]
4494 + logopts
4497 + logopts
4495 + walkopts,
4498 + walkopts,
4496 _(b'[OPTION]... [FILE]'),
4499 _(b'[OPTION]... [FILE]'),
4497 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4500 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4498 helpbasic=True,
4501 helpbasic=True,
4499 inferrepo=True,
4502 inferrepo=True,
4500 intents={INTENT_READONLY},
4503 intents={INTENT_READONLY},
4501 )
4504 )
4502 def log(ui, repo, *pats, **opts):
4505 def log(ui, repo, *pats, **opts):
4503 """show revision history of entire repository or files
4506 """show revision history of entire repository or files
4504
4507
4505 Print the revision history of the specified files or the entire
4508 Print the revision history of the specified files or the entire
4506 project.
4509 project.
4507
4510
4508 If no revision range is specified, the default is ``tip:0`` unless
4511 If no revision range is specified, the default is ``tip:0`` unless
4509 --follow is set, in which case the working directory parent is
4512 --follow is set, in which case the working directory parent is
4510 used as the starting revision.
4513 used as the starting revision.
4511
4514
4512 File history is shown without following rename or copy history of
4515 File history is shown without following rename or copy history of
4513 files. Use -f/--follow with a filename to follow history across
4516 files. Use -f/--follow with a filename to follow history across
4514 renames and copies. --follow without a filename will only show
4517 renames and copies. --follow without a filename will only show
4515 ancestors of the starting revision.
4518 ancestors of the starting revision.
4516
4519
4517 By default this command prints revision number and changeset id,
4520 By default this command prints revision number and changeset id,
4518 tags, non-trivial parents, user, date and time, and a summary for
4521 tags, non-trivial parents, user, date and time, and a summary for
4519 each commit. When the -v/--verbose switch is used, the list of
4522 each commit. When the -v/--verbose switch is used, the list of
4520 changed files and full commit message are shown.
4523 changed files and full commit message are shown.
4521
4524
4522 With --graph the revisions are shown as an ASCII art DAG with the most
4525 With --graph the revisions are shown as an ASCII art DAG with the most
4523 recent changeset at the top.
4526 recent changeset at the top.
4524 'o' is a changeset, '@' is a working directory parent, '%' is a changeset
4527 'o' is a changeset, '@' is a working directory parent, '%' is a changeset
4525 involved in an unresolved merge conflict, '_' closes a branch,
4528 involved in an unresolved merge conflict, '_' closes a branch,
4526 'x' is obsolete, '*' is unstable, and '+' represents a fork where the
4529 'x' is obsolete, '*' is unstable, and '+' represents a fork where the
4527 changeset from the lines below is a parent of the 'o' merge on the same
4530 changeset from the lines below is a parent of the 'o' merge on the same
4528 line.
4531 line.
4529 Paths in the DAG are represented with '|', '/' and so forth. ':' in place
4532 Paths in the DAG are represented with '|', '/' and so forth. ':' in place
4530 of a '|' indicates one or more revisions in a path are omitted.
4533 of a '|' indicates one or more revisions in a path are omitted.
4531
4534
4532 .. container:: verbose
4535 .. container:: verbose
4533
4536
4534 Use -L/--line-range FILE,M:N options to follow the history of lines
4537 Use -L/--line-range FILE,M:N options to follow the history of lines
4535 from M to N in FILE. With -p/--patch only diff hunks affecting
4538 from M to N in FILE. With -p/--patch only diff hunks affecting
4536 specified line range will be shown. This option requires --follow;
4539 specified line range will be shown. This option requires --follow;
4537 it can be specified multiple times. Currently, this option is not
4540 it can be specified multiple times. Currently, this option is not
4538 compatible with --graph. This option is experimental.
4541 compatible with --graph. This option is experimental.
4539
4542
4540 .. note::
4543 .. note::
4541
4544
4542 :hg:`log --patch` may generate unexpected diff output for merge
4545 :hg:`log --patch` may generate unexpected diff output for merge
4543 changesets, as it will only compare the merge changeset against
4546 changesets, as it will only compare the merge changeset against
4544 its first parent. Also, only files different from BOTH parents
4547 its first parent. Also, only files different from BOTH parents
4545 will appear in files:.
4548 will appear in files:.
4546
4549
4547 .. note::
4550 .. note::
4548
4551
4549 For performance reasons, :hg:`log FILE` may omit duplicate changes
4552 For performance reasons, :hg:`log FILE` may omit duplicate changes
4550 made on branches and will not show removals or mode changes. To
4553 made on branches and will not show removals or mode changes. To
4551 see all such changes, use the --removed switch.
4554 see all such changes, use the --removed switch.
4552
4555
4553 .. container:: verbose
4556 .. container:: verbose
4554
4557
4555 .. note::
4558 .. note::
4556
4559
4557 The history resulting from -L/--line-range options depends on diff
4560 The history resulting from -L/--line-range options depends on diff
4558 options; for instance if white-spaces are ignored, respective changes
4561 options; for instance if white-spaces are ignored, respective changes
4559 with only white-spaces in specified line range will not be listed.
4562 with only white-spaces in specified line range will not be listed.
4560
4563
4561 .. container:: verbose
4564 .. container:: verbose
4562
4565
4563 Some examples:
4566 Some examples:
4564
4567
4565 - changesets with full descriptions and file lists::
4568 - changesets with full descriptions and file lists::
4566
4569
4567 hg log -v
4570 hg log -v
4568
4571
4569 - changesets ancestral to the working directory::
4572 - changesets ancestral to the working directory::
4570
4573
4571 hg log -f
4574 hg log -f
4572
4575
4573 - last 10 commits on the current branch::
4576 - last 10 commits on the current branch::
4574
4577
4575 hg log -l 10 -b .
4578 hg log -l 10 -b .
4576
4579
4577 - changesets showing all modifications of a file, including removals::
4580 - changesets showing all modifications of a file, including removals::
4578
4581
4579 hg log --removed file.c
4582 hg log --removed file.c
4580
4583
4581 - all changesets that touch a directory, with diffs, excluding merges::
4584 - all changesets that touch a directory, with diffs, excluding merges::
4582
4585
4583 hg log -Mp lib/
4586 hg log -Mp lib/
4584
4587
4585 - all revision numbers that match a keyword::
4588 - all revision numbers that match a keyword::
4586
4589
4587 hg log -k bug --template "{rev}\\n"
4590 hg log -k bug --template "{rev}\\n"
4588
4591
4589 - the full hash identifier of the working directory parent::
4592 - the full hash identifier of the working directory parent::
4590
4593
4591 hg log -r . --template "{node}\\n"
4594 hg log -r . --template "{node}\\n"
4592
4595
4593 - list available log templates::
4596 - list available log templates::
4594
4597
4595 hg log -T list
4598 hg log -T list
4596
4599
4597 - check if a given changeset is included in a tagged release::
4600 - check if a given changeset is included in a tagged release::
4598
4601
4599 hg log -r "a21ccf and ancestor(1.9)"
4602 hg log -r "a21ccf and ancestor(1.9)"
4600
4603
4601 - find all changesets by some user in a date range::
4604 - find all changesets by some user in a date range::
4602
4605
4603 hg log -k alice -d "may 2008 to jul 2008"
4606 hg log -k alice -d "may 2008 to jul 2008"
4604
4607
4605 - summary of all changesets after the last tag::
4608 - summary of all changesets after the last tag::
4606
4609
4607 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4610 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4608
4611
4609 - changesets touching lines 13 to 23 for file.c::
4612 - changesets touching lines 13 to 23 for file.c::
4610
4613
4611 hg log -L file.c,13:23
4614 hg log -L file.c,13:23
4612
4615
4613 - changesets touching lines 13 to 23 for file.c and lines 2 to 6 of
4616 - changesets touching lines 13 to 23 for file.c and lines 2 to 6 of
4614 main.c with patch::
4617 main.c with patch::
4615
4618
4616 hg log -L file.c,13:23 -L main.c,2:6 -p
4619 hg log -L file.c,13:23 -L main.c,2:6 -p
4617
4620
4618 See :hg:`help dates` for a list of formats valid for -d/--date.
4621 See :hg:`help dates` for a list of formats valid for -d/--date.
4619
4622
4620 See :hg:`help revisions` for more about specifying and ordering
4623 See :hg:`help revisions` for more about specifying and ordering
4621 revisions.
4624 revisions.
4622
4625
4623 See :hg:`help templates` for more about pre-packaged styles and
4626 See :hg:`help templates` for more about pre-packaged styles and
4624 specifying custom templates. The default template used by the log
4627 specifying custom templates. The default template used by the log
4625 command can be customized via the ``command-templates.log`` configuration
4628 command can be customized via the ``command-templates.log`` configuration
4626 setting.
4629 setting.
4627
4630
4628 Returns 0 on success.
4631 Returns 0 on success.
4629
4632
4630 """
4633 """
4631 opts = pycompat.byteskwargs(opts)
4634 opts = pycompat.byteskwargs(opts)
4632 linerange = opts.get(b'line_range')
4635 linerange = opts.get(b'line_range')
4633
4636
4634 if linerange and not opts.get(b'follow'):
4637 if linerange and not opts.get(b'follow'):
4635 raise error.InputError(_(b'--line-range requires --follow'))
4638 raise error.InputError(_(b'--line-range requires --follow'))
4636
4639
4637 if linerange and pats:
4640 if linerange and pats:
4638 # TODO: take pats as patterns with no line-range filter
4641 # TODO: take pats as patterns with no line-range filter
4639 raise error.InputError(
4642 raise error.InputError(
4640 _(b'FILE arguments are not compatible with --line-range option')
4643 _(b'FILE arguments are not compatible with --line-range option')
4641 )
4644 )
4642
4645
4643 repo = scmutil.unhidehashlikerevs(repo, opts.get(b'rev'), b'nowarn')
4646 repo = scmutil.unhidehashlikerevs(repo, opts.get(b'rev'), b'nowarn')
4644 walk_opts = logcmdutil.parseopts(ui, pats, opts)
4647 walk_opts = logcmdutil.parseopts(ui, pats, opts)
4645 revs, differ = logcmdutil.getrevs(repo, walk_opts)
4648 revs, differ = logcmdutil.getrevs(repo, walk_opts)
4646 if linerange:
4649 if linerange:
4647 # TODO: should follow file history from logcmdutil._initialrevs(),
4650 # TODO: should follow file history from logcmdutil._initialrevs(),
4648 # then filter the result by logcmdutil._makerevset() and --limit
4651 # then filter the result by logcmdutil._makerevset() and --limit
4649 revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts)
4652 revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts)
4650
4653
4651 getcopies = None
4654 getcopies = None
4652 if opts.get(b'copies'):
4655 if opts.get(b'copies'):
4653 endrev = None
4656 endrev = None
4654 if revs:
4657 if revs:
4655 endrev = revs.max() + 1
4658 endrev = revs.max() + 1
4656 getcopies = scmutil.getcopiesfn(repo, endrev=endrev)
4659 getcopies = scmutil.getcopiesfn(repo, endrev=endrev)
4657
4660
4658 ui.pager(b'log')
4661 ui.pager(b'log')
4659 displayer = logcmdutil.changesetdisplayer(
4662 displayer = logcmdutil.changesetdisplayer(
4660 ui, repo, opts, differ, buffered=True
4663 ui, repo, opts, differ, buffered=True
4661 )
4664 )
4662 if opts.get(b'graph'):
4665 if opts.get(b'graph'):
4663 displayfn = logcmdutil.displaygraphrevs
4666 displayfn = logcmdutil.displaygraphrevs
4664 else:
4667 else:
4665 displayfn = logcmdutil.displayrevs
4668 displayfn = logcmdutil.displayrevs
4666 displayfn(ui, repo, revs, displayer, getcopies)
4669 displayfn(ui, repo, revs, displayer, getcopies)
4667
4670
4668
4671
4669 @command(
4672 @command(
4670 b'manifest',
4673 b'manifest',
4671 [
4674 [
4672 (b'r', b'rev', b'', _(b'revision to display'), _(b'REV')),
4675 (b'r', b'rev', b'', _(b'revision to display'), _(b'REV')),
4673 (b'', b'all', False, _(b"list files from all revisions")),
4676 (b'', b'all', False, _(b"list files from all revisions")),
4674 ]
4677 ]
4675 + formatteropts,
4678 + formatteropts,
4676 _(b'[-r REV]'),
4679 _(b'[-r REV]'),
4677 helpcategory=command.CATEGORY_MAINTENANCE,
4680 helpcategory=command.CATEGORY_MAINTENANCE,
4678 intents={INTENT_READONLY},
4681 intents={INTENT_READONLY},
4679 )
4682 )
4680 def manifest(ui, repo, node=None, rev=None, **opts):
4683 def manifest(ui, repo, node=None, rev=None, **opts):
4681 """output the current or given revision of the project manifest
4684 """output the current or given revision of the project manifest
4682
4685
4683 Print a list of version controlled files for the given revision.
4686 Print a list of version controlled files for the given revision.
4684 If no revision is given, the first parent of the working directory
4687 If no revision is given, the first parent of the working directory
4685 is used, or the null revision if no revision is checked out.
4688 is used, or the null revision if no revision is checked out.
4686
4689
4687 With -v, print file permissions, symlink and executable bits.
4690 With -v, print file permissions, symlink and executable bits.
4688 With --debug, print file revision hashes.
4691 With --debug, print file revision hashes.
4689
4692
4690 If option --all is specified, the list of all files from all revisions
4693 If option --all is specified, the list of all files from all revisions
4691 is printed. This includes deleted and renamed files.
4694 is printed. This includes deleted and renamed files.
4692
4695
4693 Returns 0 on success.
4696 Returns 0 on success.
4694 """
4697 """
4695 opts = pycompat.byteskwargs(opts)
4698 opts = pycompat.byteskwargs(opts)
4696 fm = ui.formatter(b'manifest', opts)
4699 fm = ui.formatter(b'manifest', opts)
4697
4700
4698 if opts.get(b'all'):
4701 if opts.get(b'all'):
4699 if rev or node:
4702 if rev or node:
4700 raise error.InputError(_(b"can't specify a revision with --all"))
4703 raise error.InputError(_(b"can't specify a revision with --all"))
4701
4704
4702 res = set()
4705 res = set()
4703 for rev in repo:
4706 for rev in repo:
4704 ctx = repo[rev]
4707 ctx = repo[rev]
4705 res |= set(ctx.files())
4708 res |= set(ctx.files())
4706
4709
4707 ui.pager(b'manifest')
4710 ui.pager(b'manifest')
4708 for f in sorted(res):
4711 for f in sorted(res):
4709 fm.startitem()
4712 fm.startitem()
4710 fm.write(b"path", b'%s\n', f)
4713 fm.write(b"path", b'%s\n', f)
4711 fm.end()
4714 fm.end()
4712 return
4715 return
4713
4716
4714 if rev and node:
4717 if rev and node:
4715 raise error.InputError(_(b"please specify just one revision"))
4718 raise error.InputError(_(b"please specify just one revision"))
4716
4719
4717 if not node:
4720 if not node:
4718 node = rev
4721 node = rev
4719
4722
4720 char = {b'l': b'@', b'x': b'*', b'': b'', b't': b'd'}
4723 char = {b'l': b'@', b'x': b'*', b'': b'', b't': b'd'}
4721 mode = {b'l': b'644', b'x': b'755', b'': b'644', b't': b'755'}
4724 mode = {b'l': b'644', b'x': b'755', b'': b'644', b't': b'755'}
4722 if node:
4725 if node:
4723 repo = scmutil.unhidehashlikerevs(repo, [node], b'nowarn')
4726 repo = scmutil.unhidehashlikerevs(repo, [node], b'nowarn')
4724 ctx = scmutil.revsingle(repo, node)
4727 ctx = scmutil.revsingle(repo, node)
4725 mf = ctx.manifest()
4728 mf = ctx.manifest()
4726 ui.pager(b'manifest')
4729 ui.pager(b'manifest')
4727 for f in ctx:
4730 for f in ctx:
4728 fm.startitem()
4731 fm.startitem()
4729 fm.context(ctx=ctx)
4732 fm.context(ctx=ctx)
4730 fl = ctx[f].flags()
4733 fl = ctx[f].flags()
4731 fm.condwrite(ui.debugflag, b'hash', b'%s ', hex(mf[f]))
4734 fm.condwrite(ui.debugflag, b'hash', b'%s ', hex(mf[f]))
4732 fm.condwrite(ui.verbose, b'mode type', b'%s %1s ', mode[fl], char[fl])
4735 fm.condwrite(ui.verbose, b'mode type', b'%s %1s ', mode[fl], char[fl])
4733 fm.write(b'path', b'%s\n', f)
4736 fm.write(b'path', b'%s\n', f)
4734 fm.end()
4737 fm.end()
4735
4738
4736
4739
4737 @command(
4740 @command(
4738 b'merge',
4741 b'merge',
4739 [
4742 [
4740 (
4743 (
4741 b'f',
4744 b'f',
4742 b'force',
4745 b'force',
4743 None,
4746 None,
4744 _(b'force a merge including outstanding changes (DEPRECATED)'),
4747 _(b'force a merge including outstanding changes (DEPRECATED)'),
4745 ),
4748 ),
4746 (b'r', b'rev', b'', _(b'revision to merge'), _(b'REV')),
4749 (b'r', b'rev', b'', _(b'revision to merge'), _(b'REV')),
4747 (
4750 (
4748 b'P',
4751 b'P',
4749 b'preview',
4752 b'preview',
4750 None,
4753 None,
4751 _(b'review revisions to merge (no merge is performed)'),
4754 _(b'review revisions to merge (no merge is performed)'),
4752 ),
4755 ),
4753 (b'', b'abort', None, _(b'abort the ongoing merge')),
4756 (b'', b'abort', None, _(b'abort the ongoing merge')),
4754 ]
4757 ]
4755 + mergetoolopts,
4758 + mergetoolopts,
4756 _(b'[-P] [[-r] REV]'),
4759 _(b'[-P] [[-r] REV]'),
4757 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
4760 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
4758 helpbasic=True,
4761 helpbasic=True,
4759 )
4762 )
4760 def merge(ui, repo, node=None, **opts):
4763 def merge(ui, repo, node=None, **opts):
4761 """merge another revision into working directory
4764 """merge another revision into working directory
4762
4765
4763 The current working directory is updated with all changes made in
4766 The current working directory is updated with all changes made in
4764 the requested revision since the last common predecessor revision.
4767 the requested revision since the last common predecessor revision.
4765
4768
4766 Files that changed between either parent are marked as changed for
4769 Files that changed between either parent are marked as changed for
4767 the next commit and a commit must be performed before any further
4770 the next commit and a commit must be performed before any further
4768 updates to the repository are allowed. The next commit will have
4771 updates to the repository are allowed. The next commit will have
4769 two parents.
4772 two parents.
4770
4773
4771 ``--tool`` can be used to specify the merge tool used for file
4774 ``--tool`` can be used to specify the merge tool used for file
4772 merges. It overrides the HGMERGE environment variable and your
4775 merges. It overrides the HGMERGE environment variable and your
4773 configuration files. See :hg:`help merge-tools` for options.
4776 configuration files. See :hg:`help merge-tools` for options.
4774
4777
4775 If no revision is specified, the working directory's parent is a
4778 If no revision is specified, the working directory's parent is a
4776 head revision, and the current branch contains exactly one other
4779 head revision, and the current branch contains exactly one other
4777 head, the other head is merged with by default. Otherwise, an
4780 head, the other head is merged with by default. Otherwise, an
4778 explicit revision with which to merge must be provided.
4781 explicit revision with which to merge must be provided.
4779
4782
4780 See :hg:`help resolve` for information on handling file conflicts.
4783 See :hg:`help resolve` for information on handling file conflicts.
4781
4784
4782 To undo an uncommitted merge, use :hg:`merge --abort` which
4785 To undo an uncommitted merge, use :hg:`merge --abort` which
4783 will check out a clean copy of the original merge parent, losing
4786 will check out a clean copy of the original merge parent, losing
4784 all changes.
4787 all changes.
4785
4788
4786 Returns 0 on success, 1 if there are unresolved files.
4789 Returns 0 on success, 1 if there are unresolved files.
4787 """
4790 """
4788
4791
4789 opts = pycompat.byteskwargs(opts)
4792 opts = pycompat.byteskwargs(opts)
4790 abort = opts.get(b'abort')
4793 abort = opts.get(b'abort')
4791 if abort and repo.dirstate.p2() == nullid:
4794 if abort and repo.dirstate.p2() == nullid:
4792 cmdutil.wrongtooltocontinue(repo, _(b'merge'))
4795 cmdutil.wrongtooltocontinue(repo, _(b'merge'))
4793 cmdutil.check_incompatible_arguments(opts, b'abort', [b'rev', b'preview'])
4796 cmdutil.check_incompatible_arguments(opts, b'abort', [b'rev', b'preview'])
4794 if abort:
4797 if abort:
4795 state = cmdutil.getunfinishedstate(repo)
4798 state = cmdutil.getunfinishedstate(repo)
4796 if state and state._opname != b'merge':
4799 if state and state._opname != b'merge':
4797 raise error.StateError(
4800 raise error.StateError(
4798 _(b'cannot abort merge with %s in progress') % (state._opname),
4801 _(b'cannot abort merge with %s in progress') % (state._opname),
4799 hint=state.hint(),
4802 hint=state.hint(),
4800 )
4803 )
4801 if node:
4804 if node:
4802 raise error.InputError(_(b"cannot specify a node with --abort"))
4805 raise error.InputError(_(b"cannot specify a node with --abort"))
4803 return hg.abortmerge(repo.ui, repo)
4806 return hg.abortmerge(repo.ui, repo)
4804
4807
4805 if opts.get(b'rev') and node:
4808 if opts.get(b'rev') and node:
4806 raise error.InputError(_(b"please specify just one revision"))
4809 raise error.InputError(_(b"please specify just one revision"))
4807 if not node:
4810 if not node:
4808 node = opts.get(b'rev')
4811 node = opts.get(b'rev')
4809
4812
4810 if node:
4813 if node:
4811 ctx = scmutil.revsingle(repo, node)
4814 ctx = scmutil.revsingle(repo, node)
4812 else:
4815 else:
4813 if ui.configbool(b'commands', b'merge.require-rev'):
4816 if ui.configbool(b'commands', b'merge.require-rev'):
4814 raise error.InputError(
4817 raise error.InputError(
4815 _(
4818 _(
4816 b'configuration requires specifying revision to merge '
4819 b'configuration requires specifying revision to merge '
4817 b'with'
4820 b'with'
4818 )
4821 )
4819 )
4822 )
4820 ctx = repo[destutil.destmerge(repo)]
4823 ctx = repo[destutil.destmerge(repo)]
4821
4824
4822 if ctx.node() is None:
4825 if ctx.node() is None:
4823 raise error.InputError(
4826 raise error.InputError(
4824 _(b'merging with the working copy has no effect')
4827 _(b'merging with the working copy has no effect')
4825 )
4828 )
4826
4829
4827 if opts.get(b'preview'):
4830 if opts.get(b'preview'):
4828 # find nodes that are ancestors of p2 but not of p1
4831 # find nodes that are ancestors of p2 but not of p1
4829 p1 = repo[b'.'].node()
4832 p1 = repo[b'.'].node()
4830 p2 = ctx.node()
4833 p2 = ctx.node()
4831 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4834 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4832
4835
4833 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
4836 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
4834 for node in nodes:
4837 for node in nodes:
4835 displayer.show(repo[node])
4838 displayer.show(repo[node])
4836 displayer.close()
4839 displayer.close()
4837 return 0
4840 return 0
4838
4841
4839 # ui.forcemerge is an internal variable, do not document
4842 # ui.forcemerge is an internal variable, do not document
4840 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
4843 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
4841 with ui.configoverride(overrides, b'merge'):
4844 with ui.configoverride(overrides, b'merge'):
4842 force = opts.get(b'force')
4845 force = opts.get(b'force')
4843 labels = [b'working copy', b'merge rev']
4846 labels = [b'working copy', b'merge rev']
4844 return hg.merge(ctx, force=force, labels=labels)
4847 return hg.merge(ctx, force=force, labels=labels)
4845
4848
4846
4849
4847 statemod.addunfinished(
4850 statemod.addunfinished(
4848 b'merge',
4851 b'merge',
4849 fname=None,
4852 fname=None,
4850 clearable=True,
4853 clearable=True,
4851 allowcommit=True,
4854 allowcommit=True,
4852 cmdmsg=_(b'outstanding uncommitted merge'),
4855 cmdmsg=_(b'outstanding uncommitted merge'),
4853 abortfunc=hg.abortmerge,
4856 abortfunc=hg.abortmerge,
4854 statushint=_(
4857 statushint=_(
4855 b'To continue: hg commit\nTo abort: hg merge --abort'
4858 b'To continue: hg commit\nTo abort: hg merge --abort'
4856 ),
4859 ),
4857 cmdhint=_(b"use 'hg commit' or 'hg merge --abort'"),
4860 cmdhint=_(b"use 'hg commit' or 'hg merge --abort'"),
4858 )
4861 )
4859
4862
4860
4863
4861 @command(
4864 @command(
4862 b'outgoing|out',
4865 b'outgoing|out',
4863 [
4866 [
4864 (
4867 (
4865 b'f',
4868 b'f',
4866 b'force',
4869 b'force',
4867 None,
4870 None,
4868 _(b'run even when the destination is unrelated'),
4871 _(b'run even when the destination is unrelated'),
4869 ),
4872 ),
4870 (
4873 (
4871 b'r',
4874 b'r',
4872 b'rev',
4875 b'rev',
4873 [],
4876 [],
4874 _(b'a changeset intended to be included in the destination'),
4877 _(b'a changeset intended to be included in the destination'),
4875 _(b'REV'),
4878 _(b'REV'),
4876 ),
4879 ),
4877 (b'n', b'newest-first', None, _(b'show newest record first')),
4880 (b'n', b'newest-first', None, _(b'show newest record first')),
4878 (b'B', b'bookmarks', False, _(b'compare bookmarks')),
4881 (b'B', b'bookmarks', False, _(b'compare bookmarks')),
4879 (
4882 (
4880 b'b',
4883 b'b',
4881 b'branch',
4884 b'branch',
4882 [],
4885 [],
4883 _(b'a specific branch you would like to push'),
4886 _(b'a specific branch you would like to push'),
4884 _(b'BRANCH'),
4887 _(b'BRANCH'),
4885 ),
4888 ),
4886 ]
4889 ]
4887 + logopts
4890 + logopts
4888 + remoteopts
4891 + remoteopts
4889 + subrepoopts,
4892 + subrepoopts,
4890 _(b'[-M] [-p] [-n] [-f] [-r REV]... [DEST]'),
4893 _(b'[-M] [-p] [-n] [-f] [-r REV]... [DEST]'),
4891 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4894 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4892 )
4895 )
4893 def outgoing(ui, repo, dest=None, **opts):
4896 def outgoing(ui, repo, dest=None, **opts):
4894 """show changesets not found in the destination
4897 """show changesets not found in the destination
4895
4898
4896 Show changesets not found in the specified destination repository
4899 Show changesets not found in the specified destination repository
4897 or the default push location. These are the changesets that would
4900 or the default push location. These are the changesets that would
4898 be pushed if a push was requested.
4901 be pushed if a push was requested.
4899
4902
4900 See pull for details of valid destination formats.
4903 See pull for details of valid destination formats.
4901
4904
4902 .. container:: verbose
4905 .. container:: verbose
4903
4906
4904 With -B/--bookmarks, the result of bookmark comparison between
4907 With -B/--bookmarks, the result of bookmark comparison between
4905 local and remote repositories is displayed. With -v/--verbose,
4908 local and remote repositories is displayed. With -v/--verbose,
4906 status is also displayed for each bookmark like below::
4909 status is also displayed for each bookmark like below::
4907
4910
4908 BM1 01234567890a added
4911 BM1 01234567890a added
4909 BM2 deleted
4912 BM2 deleted
4910 BM3 234567890abc advanced
4913 BM3 234567890abc advanced
4911 BM4 34567890abcd diverged
4914 BM4 34567890abcd diverged
4912 BM5 4567890abcde changed
4915 BM5 4567890abcde changed
4913
4916
4914 The action taken when pushing depends on the
4917 The action taken when pushing depends on the
4915 status of each bookmark:
4918 status of each bookmark:
4916
4919
4917 :``added``: push with ``-B`` will create it
4920 :``added``: push with ``-B`` will create it
4918 :``deleted``: push with ``-B`` will delete it
4921 :``deleted``: push with ``-B`` will delete it
4919 :``advanced``: push will update it
4922 :``advanced``: push will update it
4920 :``diverged``: push with ``-B`` will update it
4923 :``diverged``: push with ``-B`` will update it
4921 :``changed``: push with ``-B`` will update it
4924 :``changed``: push with ``-B`` will update it
4922
4925
4923 From the point of view of pushing behavior, bookmarks
4926 From the point of view of pushing behavior, bookmarks
4924 existing only in the remote repository are treated as
4927 existing only in the remote repository are treated as
4925 ``deleted``, even if it is in fact added remotely.
4928 ``deleted``, even if it is in fact added remotely.
4926
4929
4927 Returns 0 if there are outgoing changes, 1 otherwise.
4930 Returns 0 if there are outgoing changes, 1 otherwise.
4928 """
4931 """
4929 # hg._outgoing() needs to re-resolve the path in order to handle #branch
4932 # hg._outgoing() needs to re-resolve the path in order to handle #branch
4930 # style URLs, so don't overwrite dest.
4933 # style URLs, so don't overwrite dest.
4931 path = ui.paths.getpath(dest, default=(b'default-push', b'default'))
4934 path = ui.paths.getpath(dest, default=(b'default-push', b'default'))
4932 if not path:
4935 if not path:
4933 raise error.ConfigError(
4936 raise error.ConfigError(
4934 _(b'default repository not configured!'),
4937 _(b'default repository not configured!'),
4935 hint=_(b"see 'hg help config.paths'"),
4938 hint=_(b"see 'hg help config.paths'"),
4936 )
4939 )
4937
4940
4938 opts = pycompat.byteskwargs(opts)
4941 opts = pycompat.byteskwargs(opts)
4939 if opts.get(b'graph'):
4942 if opts.get(b'graph'):
4940 logcmdutil.checkunsupportedgraphflags([], opts)
4943 logcmdutil.checkunsupportedgraphflags([], opts)
4941 o, other = hg._outgoing(ui, repo, dest, opts)
4944 o, other = hg._outgoing(ui, repo, dest, opts)
4942 if not o:
4945 if not o:
4943 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4946 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4944 return
4947 return
4945
4948
4946 revdag = logcmdutil.graphrevs(repo, o, opts)
4949 revdag = logcmdutil.graphrevs(repo, o, opts)
4947 ui.pager(b'outgoing')
4950 ui.pager(b'outgoing')
4948 displayer = logcmdutil.changesetdisplayer(ui, repo, opts, buffered=True)
4951 displayer = logcmdutil.changesetdisplayer(ui, repo, opts, buffered=True)
4949 logcmdutil.displaygraph(
4952 logcmdutil.displaygraph(
4950 ui, repo, revdag, displayer, graphmod.asciiedges
4953 ui, repo, revdag, displayer, graphmod.asciiedges
4951 )
4954 )
4952 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4955 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4953 return 0
4956 return 0
4954
4957
4955 if opts.get(b'bookmarks'):
4958 if opts.get(b'bookmarks'):
4956 dest = path.pushloc or path.loc
4959 dest = path.pushloc or path.loc
4957 other = hg.peer(repo, opts, dest)
4960 other = hg.peer(repo, opts, dest)
4958 if b'bookmarks' not in other.listkeys(b'namespaces'):
4961 if b'bookmarks' not in other.listkeys(b'namespaces'):
4959 ui.warn(_(b"remote doesn't support bookmarks\n"))
4962 ui.warn(_(b"remote doesn't support bookmarks\n"))
4960 return 0
4963 return 0
4961 ui.status(_(b'comparing with %s\n') % util.hidepassword(dest))
4964 ui.status(_(b'comparing with %s\n') % util.hidepassword(dest))
4962 ui.pager(b'outgoing')
4965 ui.pager(b'outgoing')
4963 return bookmarks.outgoing(ui, repo, other)
4966 return bookmarks.outgoing(ui, repo, other)
4964
4967
4965 repo._subtoppath = path.pushloc or path.loc
4968 repo._subtoppath = path.pushloc or path.loc
4966 try:
4969 try:
4967 return hg.outgoing(ui, repo, dest, opts)
4970 return hg.outgoing(ui, repo, dest, opts)
4968 finally:
4971 finally:
4969 del repo._subtoppath
4972 del repo._subtoppath
4970
4973
4971
4974
4972 @command(
4975 @command(
4973 b'parents',
4976 b'parents',
4974 [
4977 [
4975 (
4978 (
4976 b'r',
4979 b'r',
4977 b'rev',
4980 b'rev',
4978 b'',
4981 b'',
4979 _(b'show parents of the specified revision'),
4982 _(b'show parents of the specified revision'),
4980 _(b'REV'),
4983 _(b'REV'),
4981 ),
4984 ),
4982 ]
4985 ]
4983 + templateopts,
4986 + templateopts,
4984 _(b'[-r REV] [FILE]'),
4987 _(b'[-r REV] [FILE]'),
4985 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4988 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4986 inferrepo=True,
4989 inferrepo=True,
4987 )
4990 )
4988 def parents(ui, repo, file_=None, **opts):
4991 def parents(ui, repo, file_=None, **opts):
4989 """show the parents of the working directory or revision (DEPRECATED)
4992 """show the parents of the working directory or revision (DEPRECATED)
4990
4993
4991 Print the working directory's parent revisions. If a revision is
4994 Print the working directory's parent revisions. If a revision is
4992 given via -r/--rev, the parent of that revision will be printed.
4995 given via -r/--rev, the parent of that revision will be printed.
4993 If a file argument is given, the revision in which the file was
4996 If a file argument is given, the revision in which the file was
4994 last changed (before the working directory revision or the
4997 last changed (before the working directory revision or the
4995 argument to --rev if given) is printed.
4998 argument to --rev if given) is printed.
4996
4999
4997 This command is equivalent to::
5000 This command is equivalent to::
4998
5001
4999 hg log -r "p1()+p2()" or
5002 hg log -r "p1()+p2()" or
5000 hg log -r "p1(REV)+p2(REV)" or
5003 hg log -r "p1(REV)+p2(REV)" or
5001 hg log -r "max(::p1() and file(FILE))+max(::p2() and file(FILE))" or
5004 hg log -r "max(::p1() and file(FILE))+max(::p2() and file(FILE))" or
5002 hg log -r "max(::p1(REV) and file(FILE))+max(::p2(REV) and file(FILE))"
5005 hg log -r "max(::p1(REV) and file(FILE))+max(::p2(REV) and file(FILE))"
5003
5006
5004 See :hg:`summary` and :hg:`help revsets` for related information.
5007 See :hg:`summary` and :hg:`help revsets` for related information.
5005
5008
5006 Returns 0 on success.
5009 Returns 0 on success.
5007 """
5010 """
5008
5011
5009 opts = pycompat.byteskwargs(opts)
5012 opts = pycompat.byteskwargs(opts)
5010 rev = opts.get(b'rev')
5013 rev = opts.get(b'rev')
5011 if rev:
5014 if rev:
5012 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
5015 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
5013 ctx = scmutil.revsingle(repo, rev, None)
5016 ctx = scmutil.revsingle(repo, rev, None)
5014
5017
5015 if file_:
5018 if file_:
5016 m = scmutil.match(ctx, (file_,), opts)
5019 m = scmutil.match(ctx, (file_,), opts)
5017 if m.anypats() or len(m.files()) != 1:
5020 if m.anypats() or len(m.files()) != 1:
5018 raise error.InputError(_(b'can only specify an explicit filename'))
5021 raise error.InputError(_(b'can only specify an explicit filename'))
5019 file_ = m.files()[0]
5022 file_ = m.files()[0]
5020 filenodes = []
5023 filenodes = []
5021 for cp in ctx.parents():
5024 for cp in ctx.parents():
5022 if not cp:
5025 if not cp:
5023 continue
5026 continue
5024 try:
5027 try:
5025 filenodes.append(cp.filenode(file_))
5028 filenodes.append(cp.filenode(file_))
5026 except error.LookupError:
5029 except error.LookupError:
5027 pass
5030 pass
5028 if not filenodes:
5031 if not filenodes:
5029 raise error.InputError(_(b"'%s' not found in manifest") % file_)
5032 raise error.InputError(_(b"'%s' not found in manifest") % file_)
5030 p = []
5033 p = []
5031 for fn in filenodes:
5034 for fn in filenodes:
5032 fctx = repo.filectx(file_, fileid=fn)
5035 fctx = repo.filectx(file_, fileid=fn)
5033 p.append(fctx.node())
5036 p.append(fctx.node())
5034 else:
5037 else:
5035 p = [cp.node() for cp in ctx.parents()]
5038 p = [cp.node() for cp in ctx.parents()]
5036
5039
5037 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
5040 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
5038 for n in p:
5041 for n in p:
5039 if n != nullid:
5042 if n != nullid:
5040 displayer.show(repo[n])
5043 displayer.show(repo[n])
5041 displayer.close()
5044 displayer.close()
5042
5045
5043
5046
5044 @command(
5047 @command(
5045 b'paths',
5048 b'paths',
5046 formatteropts,
5049 formatteropts,
5047 _(b'[NAME]'),
5050 _(b'[NAME]'),
5048 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5051 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5049 optionalrepo=True,
5052 optionalrepo=True,
5050 intents={INTENT_READONLY},
5053 intents={INTENT_READONLY},
5051 )
5054 )
5052 def paths(ui, repo, search=None, **opts):
5055 def paths(ui, repo, search=None, **opts):
5053 """show aliases for remote repositories
5056 """show aliases for remote repositories
5054
5057
5055 Show definition of symbolic path name NAME. If no name is given,
5058 Show definition of symbolic path name NAME. If no name is given,
5056 show definition of all available names.
5059 show definition of all available names.
5057
5060
5058 Option -q/--quiet suppresses all output when searching for NAME
5061 Option -q/--quiet suppresses all output when searching for NAME
5059 and shows only the path names when listing all definitions.
5062 and shows only the path names when listing all definitions.
5060
5063
5061 Path names are defined in the [paths] section of your
5064 Path names are defined in the [paths] section of your
5062 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
5065 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
5063 repository, ``.hg/hgrc`` is used, too.
5066 repository, ``.hg/hgrc`` is used, too.
5064
5067
5065 The path names ``default`` and ``default-push`` have a special
5068 The path names ``default`` and ``default-push`` have a special
5066 meaning. When performing a push or pull operation, they are used
5069 meaning. When performing a push or pull operation, they are used
5067 as fallbacks if no location is specified on the command-line.
5070 as fallbacks if no location is specified on the command-line.
5068 When ``default-push`` is set, it will be used for push and
5071 When ``default-push`` is set, it will be used for push and
5069 ``default`` will be used for pull; otherwise ``default`` is used
5072 ``default`` will be used for pull; otherwise ``default`` is used
5070 as the fallback for both. When cloning a repository, the clone
5073 as the fallback for both. When cloning a repository, the clone
5071 source is written as ``default`` in ``.hg/hgrc``.
5074 source is written as ``default`` in ``.hg/hgrc``.
5072
5075
5073 .. note::
5076 .. note::
5074
5077
5075 ``default`` and ``default-push`` apply to all inbound (e.g.
5078 ``default`` and ``default-push`` apply to all inbound (e.g.
5076 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email`
5079 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email`
5077 and :hg:`bundle`) operations.
5080 and :hg:`bundle`) operations.
5078
5081
5079 See :hg:`help urls` for more information.
5082 See :hg:`help urls` for more information.
5080
5083
5081 .. container:: verbose
5084 .. container:: verbose
5082
5085
5083 Template:
5086 Template:
5084
5087
5085 The following keywords are supported. See also :hg:`help templates`.
5088 The following keywords are supported. See also :hg:`help templates`.
5086
5089
5087 :name: String. Symbolic name of the path alias.
5090 :name: String. Symbolic name of the path alias.
5088 :pushurl: String. URL for push operations.
5091 :pushurl: String. URL for push operations.
5089 :url: String. URL or directory path for the other operations.
5092 :url: String. URL or directory path for the other operations.
5090
5093
5091 Returns 0 on success.
5094 Returns 0 on success.
5092 """
5095 """
5093
5096
5094 opts = pycompat.byteskwargs(opts)
5097 opts = pycompat.byteskwargs(opts)
5095 ui.pager(b'paths')
5098 ui.pager(b'paths')
5096 if search:
5099 if search:
5097 pathitems = [
5100 pathitems = [
5098 (name, path)
5101 (name, path)
5099 for name, path in pycompat.iteritems(ui.paths)
5102 for name, path in pycompat.iteritems(ui.paths)
5100 if name == search
5103 if name == search
5101 ]
5104 ]
5102 else:
5105 else:
5103 pathitems = sorted(pycompat.iteritems(ui.paths))
5106 pathitems = sorted(pycompat.iteritems(ui.paths))
5104
5107
5105 fm = ui.formatter(b'paths', opts)
5108 fm = ui.formatter(b'paths', opts)
5106 if fm.isplain():
5109 if fm.isplain():
5107 hidepassword = util.hidepassword
5110 hidepassword = util.hidepassword
5108 else:
5111 else:
5109 hidepassword = bytes
5112 hidepassword = bytes
5110 if ui.quiet:
5113 if ui.quiet:
5111 namefmt = b'%s\n'
5114 namefmt = b'%s\n'
5112 else:
5115 else:
5113 namefmt = b'%s = '
5116 namefmt = b'%s = '
5114 showsubopts = not search and not ui.quiet
5117 showsubopts = not search and not ui.quiet
5115
5118
5116 for name, path in pathitems:
5119 for name, path in pathitems:
5117 fm.startitem()
5120 fm.startitem()
5118 fm.condwrite(not search, b'name', namefmt, name)
5121 fm.condwrite(not search, b'name', namefmt, name)
5119 fm.condwrite(not ui.quiet, b'url', b'%s\n', hidepassword(path.rawloc))
5122 fm.condwrite(not ui.quiet, b'url', b'%s\n', hidepassword(path.rawloc))
5120 for subopt, value in sorted(path.suboptions.items()):
5123 for subopt, value in sorted(path.suboptions.items()):
5121 assert subopt not in (b'name', b'url')
5124 assert subopt not in (b'name', b'url')
5122 if showsubopts:
5125 if showsubopts:
5123 fm.plain(b'%s:%s = ' % (name, subopt))
5126 fm.plain(b'%s:%s = ' % (name, subopt))
5124 fm.condwrite(showsubopts, subopt, b'%s\n', value)
5127 fm.condwrite(showsubopts, subopt, b'%s\n', value)
5125
5128
5126 fm.end()
5129 fm.end()
5127
5130
5128 if search and not pathitems:
5131 if search and not pathitems:
5129 if not ui.quiet:
5132 if not ui.quiet:
5130 ui.warn(_(b"not found!\n"))
5133 ui.warn(_(b"not found!\n"))
5131 return 1
5134 return 1
5132 else:
5135 else:
5133 return 0
5136 return 0
5134
5137
5135
5138
5136 @command(
5139 @command(
5137 b'phase',
5140 b'phase',
5138 [
5141 [
5139 (b'p', b'public', False, _(b'set changeset phase to public')),
5142 (b'p', b'public', False, _(b'set changeset phase to public')),
5140 (b'd', b'draft', False, _(b'set changeset phase to draft')),
5143 (b'd', b'draft', False, _(b'set changeset phase to draft')),
5141 (b's', b'secret', False, _(b'set changeset phase to secret')),
5144 (b's', b'secret', False, _(b'set changeset phase to secret')),
5142 (b'f', b'force', False, _(b'allow to move boundary backward')),
5145 (b'f', b'force', False, _(b'allow to move boundary backward')),
5143 (b'r', b'rev', [], _(b'target revision'), _(b'REV')),
5146 (b'r', b'rev', [], _(b'target revision'), _(b'REV')),
5144 ],
5147 ],
5145 _(b'[-p|-d|-s] [-f] [-r] [REV...]'),
5148 _(b'[-p|-d|-s] [-f] [-r] [REV...]'),
5146 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
5149 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
5147 )
5150 )
5148 def phase(ui, repo, *revs, **opts):
5151 def phase(ui, repo, *revs, **opts):
5149 """set or show the current phase name
5152 """set or show the current phase name
5150
5153
5151 With no argument, show the phase name of the current revision(s).
5154 With no argument, show the phase name of the current revision(s).
5152
5155
5153 With one of -p/--public, -d/--draft or -s/--secret, change the
5156 With one of -p/--public, -d/--draft or -s/--secret, change the
5154 phase value of the specified revisions.
5157 phase value of the specified revisions.
5155
5158
5156 Unless -f/--force is specified, :hg:`phase` won't move changesets from a
5159 Unless -f/--force is specified, :hg:`phase` won't move changesets from a
5157 lower phase to a higher phase. Phases are ordered as follows::
5160 lower phase to a higher phase. Phases are ordered as follows::
5158
5161
5159 public < draft < secret
5162 public < draft < secret
5160
5163
5161 Returns 0 on success, 1 if some phases could not be changed.
5164 Returns 0 on success, 1 if some phases could not be changed.
5162
5165
5163 (For more information about the phases concept, see :hg:`help phases`.)
5166 (For more information about the phases concept, see :hg:`help phases`.)
5164 """
5167 """
5165 opts = pycompat.byteskwargs(opts)
5168 opts = pycompat.byteskwargs(opts)
5166 # search for a unique phase argument
5169 # search for a unique phase argument
5167 targetphase = None
5170 targetphase = None
5168 for idx, name in enumerate(phases.cmdphasenames):
5171 for idx, name in enumerate(phases.cmdphasenames):
5169 if opts[name]:
5172 if opts[name]:
5170 if targetphase is not None:
5173 if targetphase is not None:
5171 raise error.InputError(_(b'only one phase can be specified'))
5174 raise error.InputError(_(b'only one phase can be specified'))
5172 targetphase = idx
5175 targetphase = idx
5173
5176
5174 # look for specified revision
5177 # look for specified revision
5175 revs = list(revs)
5178 revs = list(revs)
5176 revs.extend(opts[b'rev'])
5179 revs.extend(opts[b'rev'])
5177 if not revs:
5180 if not revs:
5178 # display both parents as the second parent phase can influence
5181 # display both parents as the second parent phase can influence
5179 # the phase of a merge commit
5182 # the phase of a merge commit
5180 revs = [c.rev() for c in repo[None].parents()]
5183 revs = [c.rev() for c in repo[None].parents()]
5181
5184
5182 revs = scmutil.revrange(repo, revs)
5185 revs = scmutil.revrange(repo, revs)
5183
5186
5184 ret = 0
5187 ret = 0
5185 if targetphase is None:
5188 if targetphase is None:
5186 # display
5189 # display
5187 for r in revs:
5190 for r in revs:
5188 ctx = repo[r]
5191 ctx = repo[r]
5189 ui.write(b'%i: %s\n' % (ctx.rev(), ctx.phasestr()))
5192 ui.write(b'%i: %s\n' % (ctx.rev(), ctx.phasestr()))
5190 else:
5193 else:
5191 with repo.lock(), repo.transaction(b"phase") as tr:
5194 with repo.lock(), repo.transaction(b"phase") as tr:
5192 # set phase
5195 # set phase
5193 if not revs:
5196 if not revs:
5194 raise error.InputError(_(b'empty revision set'))
5197 raise error.InputError(_(b'empty revision set'))
5195 nodes = [repo[r].node() for r in revs]
5198 nodes = [repo[r].node() for r in revs]
5196 # moving revision from public to draft may hide them
5199 # moving revision from public to draft may hide them
5197 # We have to check result on an unfiltered repository
5200 # We have to check result on an unfiltered repository
5198 unfi = repo.unfiltered()
5201 unfi = repo.unfiltered()
5199 getphase = unfi._phasecache.phase
5202 getphase = unfi._phasecache.phase
5200 olddata = [getphase(unfi, r) for r in unfi]
5203 olddata = [getphase(unfi, r) for r in unfi]
5201 phases.advanceboundary(repo, tr, targetphase, nodes)
5204 phases.advanceboundary(repo, tr, targetphase, nodes)
5202 if opts[b'force']:
5205 if opts[b'force']:
5203 phases.retractboundary(repo, tr, targetphase, nodes)
5206 phases.retractboundary(repo, tr, targetphase, nodes)
5204 getphase = unfi._phasecache.phase
5207 getphase = unfi._phasecache.phase
5205 newdata = [getphase(unfi, r) for r in unfi]
5208 newdata = [getphase(unfi, r) for r in unfi]
5206 changes = sum(newdata[r] != olddata[r] for r in unfi)
5209 changes = sum(newdata[r] != olddata[r] for r in unfi)
5207 cl = unfi.changelog
5210 cl = unfi.changelog
5208 rejected = [n for n in nodes if newdata[cl.rev(n)] < targetphase]
5211 rejected = [n for n in nodes if newdata[cl.rev(n)] < targetphase]
5209 if rejected:
5212 if rejected:
5210 ui.warn(
5213 ui.warn(
5211 _(
5214 _(
5212 b'cannot move %i changesets to a higher '
5215 b'cannot move %i changesets to a higher '
5213 b'phase, use --force\n'
5216 b'phase, use --force\n'
5214 )
5217 )
5215 % len(rejected)
5218 % len(rejected)
5216 )
5219 )
5217 ret = 1
5220 ret = 1
5218 if changes:
5221 if changes:
5219 msg = _(b'phase changed for %i changesets\n') % changes
5222 msg = _(b'phase changed for %i changesets\n') % changes
5220 if ret:
5223 if ret:
5221 ui.status(msg)
5224 ui.status(msg)
5222 else:
5225 else:
5223 ui.note(msg)
5226 ui.note(msg)
5224 else:
5227 else:
5225 ui.warn(_(b'no phases changed\n'))
5228 ui.warn(_(b'no phases changed\n'))
5226 return ret
5229 return ret
5227
5230
5228
5231
5229 def postincoming(ui, repo, modheads, optupdate, checkout, brev):
5232 def postincoming(ui, repo, modheads, optupdate, checkout, brev):
5230 """Run after a changegroup has been added via pull/unbundle
5233 """Run after a changegroup has been added via pull/unbundle
5231
5234
5232 This takes arguments below:
5235 This takes arguments below:
5233
5236
5234 :modheads: change of heads by pull/unbundle
5237 :modheads: change of heads by pull/unbundle
5235 :optupdate: updating working directory is needed or not
5238 :optupdate: updating working directory is needed or not
5236 :checkout: update destination revision (or None to default destination)
5239 :checkout: update destination revision (or None to default destination)
5237 :brev: a name, which might be a bookmark to be activated after updating
5240 :brev: a name, which might be a bookmark to be activated after updating
5238 """
5241 """
5239 if modheads == 0:
5242 if modheads == 0:
5240 return
5243 return
5241 if optupdate:
5244 if optupdate:
5242 try:
5245 try:
5243 return hg.updatetotally(ui, repo, checkout, brev)
5246 return hg.updatetotally(ui, repo, checkout, brev)
5244 except error.UpdateAbort as inst:
5247 except error.UpdateAbort as inst:
5245 msg = _(b"not updating: %s") % stringutil.forcebytestr(inst)
5248 msg = _(b"not updating: %s") % stringutil.forcebytestr(inst)
5246 hint = inst.hint
5249 hint = inst.hint
5247 raise error.UpdateAbort(msg, hint=hint)
5250 raise error.UpdateAbort(msg, hint=hint)
5248 if modheads is not None and modheads > 1:
5251 if modheads is not None and modheads > 1:
5249 currentbranchheads = len(repo.branchheads())
5252 currentbranchheads = len(repo.branchheads())
5250 if currentbranchheads == modheads:
5253 if currentbranchheads == modheads:
5251 ui.status(
5254 ui.status(
5252 _(b"(run 'hg heads' to see heads, 'hg merge' to merge)\n")
5255 _(b"(run 'hg heads' to see heads, 'hg merge' to merge)\n")
5253 )
5256 )
5254 elif currentbranchheads > 1:
5257 elif currentbranchheads > 1:
5255 ui.status(
5258 ui.status(
5256 _(b"(run 'hg heads .' to see heads, 'hg merge' to merge)\n")
5259 _(b"(run 'hg heads .' to see heads, 'hg merge' to merge)\n")
5257 )
5260 )
5258 else:
5261 else:
5259 ui.status(_(b"(run 'hg heads' to see heads)\n"))
5262 ui.status(_(b"(run 'hg heads' to see heads)\n"))
5260 elif not ui.configbool(b'commands', b'update.requiredest'):
5263 elif not ui.configbool(b'commands', b'update.requiredest'):
5261 ui.status(_(b"(run 'hg update' to get a working copy)\n"))
5264 ui.status(_(b"(run 'hg update' to get a working copy)\n"))
5262
5265
5263
5266
5264 @command(
5267 @command(
5265 b'pull',
5268 b'pull',
5266 [
5269 [
5267 (
5270 (
5268 b'u',
5271 b'u',
5269 b'update',
5272 b'update',
5270 None,
5273 None,
5271 _(b'update to new branch head if new descendants were pulled'),
5274 _(b'update to new branch head if new descendants were pulled'),
5272 ),
5275 ),
5273 (
5276 (
5274 b'f',
5277 b'f',
5275 b'force',
5278 b'force',
5276 None,
5279 None,
5277 _(b'run even when remote repository is unrelated'),
5280 _(b'run even when remote repository is unrelated'),
5278 ),
5281 ),
5279 (
5282 (
5280 b'',
5283 b'',
5281 b'confirm',
5284 b'confirm',
5282 None,
5285 None,
5283 _(b'confirm pull before applying changes'),
5286 _(b'confirm pull before applying changes'),
5284 ),
5287 ),
5285 (
5288 (
5286 b'r',
5289 b'r',
5287 b'rev',
5290 b'rev',
5288 [],
5291 [],
5289 _(b'a remote changeset intended to be added'),
5292 _(b'a remote changeset intended to be added'),
5290 _(b'REV'),
5293 _(b'REV'),
5291 ),
5294 ),
5292 (b'B', b'bookmark', [], _(b"bookmark to pull"), _(b'BOOKMARK')),
5295 (b'B', b'bookmark', [], _(b"bookmark to pull"), _(b'BOOKMARK')),
5293 (
5296 (
5294 b'b',
5297 b'b',
5295 b'branch',
5298 b'branch',
5296 [],
5299 [],
5297 _(b'a specific branch you would like to pull'),
5300 _(b'a specific branch you would like to pull'),
5298 _(b'BRANCH'),
5301 _(b'BRANCH'),
5299 ),
5302 ),
5300 ]
5303 ]
5301 + remoteopts,
5304 + remoteopts,
5302 _(b'[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'),
5305 _(b'[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'),
5303 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5306 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5304 helpbasic=True,
5307 helpbasic=True,
5305 )
5308 )
5306 def pull(ui, repo, source=b"default", **opts):
5309 def pull(ui, repo, source=b"default", **opts):
5307 """pull changes from the specified source
5310 """pull changes from the specified source
5308
5311
5309 Pull changes from a remote repository to a local one.
5312 Pull changes from a remote repository to a local one.
5310
5313
5311 This finds all changes from the repository at the specified path
5314 This finds all changes from the repository at the specified path
5312 or URL and adds them to a local repository (the current one unless
5315 or URL and adds them to a local repository (the current one unless
5313 -R is specified). By default, this does not update the copy of the
5316 -R is specified). By default, this does not update the copy of the
5314 project in the working directory.
5317 project in the working directory.
5315
5318
5316 When cloning from servers that support it, Mercurial may fetch
5319 When cloning from servers that support it, Mercurial may fetch
5317 pre-generated data. When this is done, hooks operating on incoming
5320 pre-generated data. When this is done, hooks operating on incoming
5318 changesets and changegroups may fire more than once, once for each
5321 changesets and changegroups may fire more than once, once for each
5319 pre-generated bundle and as well as for any additional remaining
5322 pre-generated bundle and as well as for any additional remaining
5320 data. See :hg:`help -e clonebundles` for more.
5323 data. See :hg:`help -e clonebundles` for more.
5321
5324
5322 Use :hg:`incoming` if you want to see what would have been added
5325 Use :hg:`incoming` if you want to see what would have been added
5323 by a pull at the time you issued this command. If you then decide
5326 by a pull at the time you issued this command. If you then decide
5324 to add those changes to the repository, you should use :hg:`pull
5327 to add those changes to the repository, you should use :hg:`pull
5325 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
5328 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
5326
5329
5327 If SOURCE is omitted, the 'default' path will be used.
5330 If SOURCE is omitted, the 'default' path will be used.
5328 See :hg:`help urls` for more information.
5331 See :hg:`help urls` for more information.
5329
5332
5330 Specifying bookmark as ``.`` is equivalent to specifying the active
5333 Specifying bookmark as ``.`` is equivalent to specifying the active
5331 bookmark's name.
5334 bookmark's name.
5332
5335
5333 Returns 0 on success, 1 if an update had unresolved files.
5336 Returns 0 on success, 1 if an update had unresolved files.
5334 """
5337 """
5335
5338
5336 opts = pycompat.byteskwargs(opts)
5339 opts = pycompat.byteskwargs(opts)
5337 if ui.configbool(b'commands', b'update.requiredest') and opts.get(
5340 if ui.configbool(b'commands', b'update.requiredest') and opts.get(
5338 b'update'
5341 b'update'
5339 ):
5342 ):
5340 msg = _(b'update destination required by configuration')
5343 msg = _(b'update destination required by configuration')
5341 hint = _(b'use hg pull followed by hg update DEST')
5344 hint = _(b'use hg pull followed by hg update DEST')
5342 raise error.InputError(msg, hint=hint)
5345 raise error.InputError(msg, hint=hint)
5343
5346
5344 source, branches = hg.parseurl(ui.expandpath(source), opts.get(b'branch'))
5347 source, branches = hg.parseurl(ui.expandpath(source), opts.get(b'branch'))
5345 ui.status(_(b'pulling from %s\n') % util.hidepassword(source))
5348 ui.status(_(b'pulling from %s\n') % util.hidepassword(source))
5346 ui.flush()
5349 ui.flush()
5347 other = hg.peer(repo, opts, source)
5350 other = hg.peer(repo, opts, source)
5348 try:
5351 try:
5349 revs, checkout = hg.addbranchrevs(
5352 revs, checkout = hg.addbranchrevs(
5350 repo, other, branches, opts.get(b'rev')
5353 repo, other, branches, opts.get(b'rev')
5351 )
5354 )
5352
5355
5353 pullopargs = {}
5356 pullopargs = {}
5354
5357
5355 nodes = None
5358 nodes = None
5356 if opts.get(b'bookmark') or revs:
5359 if opts.get(b'bookmark') or revs:
5357 # The list of bookmark used here is the same used to actually update
5360 # The list of bookmark used here is the same used to actually update
5358 # the bookmark names, to avoid the race from issue 4689 and we do
5361 # the bookmark names, to avoid the race from issue 4689 and we do
5359 # all lookup and bookmark queries in one go so they see the same
5362 # all lookup and bookmark queries in one go so they see the same
5360 # version of the server state (issue 4700).
5363 # version of the server state (issue 4700).
5361 nodes = []
5364 nodes = []
5362 fnodes = []
5365 fnodes = []
5363 revs = revs or []
5366 revs = revs or []
5364 if revs and not other.capable(b'lookup'):
5367 if revs and not other.capable(b'lookup'):
5365 err = _(
5368 err = _(
5366 b"other repository doesn't support revision lookup, "
5369 b"other repository doesn't support revision lookup, "
5367 b"so a rev cannot be specified."
5370 b"so a rev cannot be specified."
5368 )
5371 )
5369 raise error.Abort(err)
5372 raise error.Abort(err)
5370 with other.commandexecutor() as e:
5373 with other.commandexecutor() as e:
5371 fremotebookmarks = e.callcommand(
5374 fremotebookmarks = e.callcommand(
5372 b'listkeys', {b'namespace': b'bookmarks'}
5375 b'listkeys', {b'namespace': b'bookmarks'}
5373 )
5376 )
5374 for r in revs:
5377 for r in revs:
5375 fnodes.append(e.callcommand(b'lookup', {b'key': r}))
5378 fnodes.append(e.callcommand(b'lookup', {b'key': r}))
5376 remotebookmarks = fremotebookmarks.result()
5379 remotebookmarks = fremotebookmarks.result()
5377 remotebookmarks = bookmarks.unhexlifybookmarks(remotebookmarks)
5380 remotebookmarks = bookmarks.unhexlifybookmarks(remotebookmarks)
5378 pullopargs[b'remotebookmarks'] = remotebookmarks
5381 pullopargs[b'remotebookmarks'] = remotebookmarks
5379 for b in opts.get(b'bookmark', []):
5382 for b in opts.get(b'bookmark', []):
5380 b = repo._bookmarks.expandname(b)
5383 b = repo._bookmarks.expandname(b)
5381 if b not in remotebookmarks:
5384 if b not in remotebookmarks:
5382 raise error.InputError(
5385 raise error.InputError(
5383 _(b'remote bookmark %s not found!') % b
5386 _(b'remote bookmark %s not found!') % b
5384 )
5387 )
5385 nodes.append(remotebookmarks[b])
5388 nodes.append(remotebookmarks[b])
5386 for i, rev in enumerate(revs):
5389 for i, rev in enumerate(revs):
5387 node = fnodes[i].result()
5390 node = fnodes[i].result()
5388 nodes.append(node)
5391 nodes.append(node)
5389 if rev == checkout:
5392 if rev == checkout:
5390 checkout = node
5393 checkout = node
5391
5394
5392 wlock = util.nullcontextmanager()
5395 wlock = util.nullcontextmanager()
5393 if opts.get(b'update'):
5396 if opts.get(b'update'):
5394 wlock = repo.wlock()
5397 wlock = repo.wlock()
5395 with wlock:
5398 with wlock:
5396 pullopargs.update(opts.get(b'opargs', {}))
5399 pullopargs.update(opts.get(b'opargs', {}))
5397 modheads = exchange.pull(
5400 modheads = exchange.pull(
5398 repo,
5401 repo,
5399 other,
5402 other,
5400 heads=nodes,
5403 heads=nodes,
5401 force=opts.get(b'force'),
5404 force=opts.get(b'force'),
5402 bookmarks=opts.get(b'bookmark', ()),
5405 bookmarks=opts.get(b'bookmark', ()),
5403 opargs=pullopargs,
5406 opargs=pullopargs,
5404 confirm=opts.get(b'confirm'),
5407 confirm=opts.get(b'confirm'),
5405 ).cgresult
5408 ).cgresult
5406
5409
5407 # brev is a name, which might be a bookmark to be activated at
5410 # brev is a name, which might be a bookmark to be activated at
5408 # the end of the update. In other words, it is an explicit
5411 # the end of the update. In other words, it is an explicit
5409 # destination of the update
5412 # destination of the update
5410 brev = None
5413 brev = None
5411
5414
5412 if checkout:
5415 if checkout:
5413 checkout = repo.unfiltered().changelog.rev(checkout)
5416 checkout = repo.unfiltered().changelog.rev(checkout)
5414
5417
5415 # order below depends on implementation of
5418 # order below depends on implementation of
5416 # hg.addbranchrevs(). opts['bookmark'] is ignored,
5419 # hg.addbranchrevs(). opts['bookmark'] is ignored,
5417 # because 'checkout' is determined without it.
5420 # because 'checkout' is determined without it.
5418 if opts.get(b'rev'):
5421 if opts.get(b'rev'):
5419 brev = opts[b'rev'][0]
5422 brev = opts[b'rev'][0]
5420 elif opts.get(b'branch'):
5423 elif opts.get(b'branch'):
5421 brev = opts[b'branch'][0]
5424 brev = opts[b'branch'][0]
5422 else:
5425 else:
5423 brev = branches[0]
5426 brev = branches[0]
5424 repo._subtoppath = source
5427 repo._subtoppath = source
5425 try:
5428 try:
5426 ret = postincoming(
5429 ret = postincoming(
5427 ui, repo, modheads, opts.get(b'update'), checkout, brev
5430 ui, repo, modheads, opts.get(b'update'), checkout, brev
5428 )
5431 )
5429 except error.FilteredRepoLookupError as exc:
5432 except error.FilteredRepoLookupError as exc:
5430 msg = _(b'cannot update to target: %s') % exc.args[0]
5433 msg = _(b'cannot update to target: %s') % exc.args[0]
5431 exc.args = (msg,) + exc.args[1:]
5434 exc.args = (msg,) + exc.args[1:]
5432 raise
5435 raise
5433 finally:
5436 finally:
5434 del repo._subtoppath
5437 del repo._subtoppath
5435
5438
5436 finally:
5439 finally:
5437 other.close()
5440 other.close()
5438 return ret
5441 return ret
5439
5442
5440
5443
5441 @command(
5444 @command(
5442 b'push',
5445 b'push',
5443 [
5446 [
5444 (b'f', b'force', None, _(b'force push')),
5447 (b'f', b'force', None, _(b'force push')),
5445 (
5448 (
5446 b'r',
5449 b'r',
5447 b'rev',
5450 b'rev',
5448 [],
5451 [],
5449 _(b'a changeset intended to be included in the destination'),
5452 _(b'a changeset intended to be included in the destination'),
5450 _(b'REV'),
5453 _(b'REV'),
5451 ),
5454 ),
5452 (b'B', b'bookmark', [], _(b"bookmark to push"), _(b'BOOKMARK')),
5455 (b'B', b'bookmark', [], _(b"bookmark to push"), _(b'BOOKMARK')),
5453 (b'', b'all-bookmarks', None, _(b"push all bookmarks (EXPERIMENTAL)")),
5456 (b'', b'all-bookmarks', None, _(b"push all bookmarks (EXPERIMENTAL)")),
5454 (
5457 (
5455 b'b',
5458 b'b',
5456 b'branch',
5459 b'branch',
5457 [],
5460 [],
5458 _(b'a specific branch you would like to push'),
5461 _(b'a specific branch you would like to push'),
5459 _(b'BRANCH'),
5462 _(b'BRANCH'),
5460 ),
5463 ),
5461 (b'', b'new-branch', False, _(b'allow pushing a new branch')),
5464 (b'', b'new-branch', False, _(b'allow pushing a new branch')),
5462 (
5465 (
5463 b'',
5466 b'',
5464 b'pushvars',
5467 b'pushvars',
5465 [],
5468 [],
5466 _(b'variables that can be sent to server (ADVANCED)'),
5469 _(b'variables that can be sent to server (ADVANCED)'),
5467 ),
5470 ),
5468 (
5471 (
5469 b'',
5472 b'',
5470 b'publish',
5473 b'publish',
5471 False,
5474 False,
5472 _(b'push the changeset as public (EXPERIMENTAL)'),
5475 _(b'push the changeset as public (EXPERIMENTAL)'),
5473 ),
5476 ),
5474 ]
5477 ]
5475 + remoteopts,
5478 + remoteopts,
5476 _(b'[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'),
5479 _(b'[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'),
5477 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5480 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5478 helpbasic=True,
5481 helpbasic=True,
5479 )
5482 )
5480 def push(ui, repo, dest=None, **opts):
5483 def push(ui, repo, dest=None, **opts):
5481 """push changes to the specified destination
5484 """push changes to the specified destination
5482
5485
5483 Push changesets from the local repository to the specified
5486 Push changesets from the local repository to the specified
5484 destination.
5487 destination.
5485
5488
5486 This operation is symmetrical to pull: it is identical to a pull
5489 This operation is symmetrical to pull: it is identical to a pull
5487 in the destination repository from the current one.
5490 in the destination repository from the current one.
5488
5491
5489 By default, push will not allow creation of new heads at the
5492 By default, push will not allow creation of new heads at the
5490 destination, since multiple heads would make it unclear which head
5493 destination, since multiple heads would make it unclear which head
5491 to use. In this situation, it is recommended to pull and merge
5494 to use. In this situation, it is recommended to pull and merge
5492 before pushing.
5495 before pushing.
5493
5496
5494 Use --new-branch if you want to allow push to create a new named
5497 Use --new-branch if you want to allow push to create a new named
5495 branch that is not present at the destination. This allows you to
5498 branch that is not present at the destination. This allows you to
5496 only create a new branch without forcing other changes.
5499 only create a new branch without forcing other changes.
5497
5500
5498 .. note::
5501 .. note::
5499
5502
5500 Extra care should be taken with the -f/--force option,
5503 Extra care should be taken with the -f/--force option,
5501 which will push all new heads on all branches, an action which will
5504 which will push all new heads on all branches, an action which will
5502 almost always cause confusion for collaborators.
5505 almost always cause confusion for collaborators.
5503
5506
5504 If -r/--rev is used, the specified revision and all its ancestors
5507 If -r/--rev is used, the specified revision and all its ancestors
5505 will be pushed to the remote repository.
5508 will be pushed to the remote repository.
5506
5509
5507 If -B/--bookmark is used, the specified bookmarked revision, its
5510 If -B/--bookmark is used, the specified bookmarked revision, its
5508 ancestors, and the bookmark will be pushed to the remote
5511 ancestors, and the bookmark will be pushed to the remote
5509 repository. Specifying ``.`` is equivalent to specifying the active
5512 repository. Specifying ``.`` is equivalent to specifying the active
5510 bookmark's name. Use the --all-bookmarks option for pushing all
5513 bookmark's name. Use the --all-bookmarks option for pushing all
5511 current bookmarks.
5514 current bookmarks.
5512
5515
5513 Please see :hg:`help urls` for important details about ``ssh://``
5516 Please see :hg:`help urls` for important details about ``ssh://``
5514 URLs. If DESTINATION is omitted, a default path will be used.
5517 URLs. If DESTINATION is omitted, a default path will be used.
5515
5518
5516 .. container:: verbose
5519 .. container:: verbose
5517
5520
5518 The --pushvars option sends strings to the server that become
5521 The --pushvars option sends strings to the server that become
5519 environment variables prepended with ``HG_USERVAR_``. For example,
5522 environment variables prepended with ``HG_USERVAR_``. For example,
5520 ``--pushvars ENABLE_FEATURE=true``, provides the server side hooks with
5523 ``--pushvars ENABLE_FEATURE=true``, provides the server side hooks with
5521 ``HG_USERVAR_ENABLE_FEATURE=true`` as part of their environment.
5524 ``HG_USERVAR_ENABLE_FEATURE=true`` as part of their environment.
5522
5525
5523 pushvars can provide for user-overridable hooks as well as set debug
5526 pushvars can provide for user-overridable hooks as well as set debug
5524 levels. One example is having a hook that blocks commits containing
5527 levels. One example is having a hook that blocks commits containing
5525 conflict markers, but enables the user to override the hook if the file
5528 conflict markers, but enables the user to override the hook if the file
5526 is using conflict markers for testing purposes or the file format has
5529 is using conflict markers for testing purposes or the file format has
5527 strings that look like conflict markers.
5530 strings that look like conflict markers.
5528
5531
5529 By default, servers will ignore `--pushvars`. To enable it add the
5532 By default, servers will ignore `--pushvars`. To enable it add the
5530 following to your configuration file::
5533 following to your configuration file::
5531
5534
5532 [push]
5535 [push]
5533 pushvars.server = true
5536 pushvars.server = true
5534
5537
5535 Returns 0 if push was successful, 1 if nothing to push.
5538 Returns 0 if push was successful, 1 if nothing to push.
5536 """
5539 """
5537
5540
5538 opts = pycompat.byteskwargs(opts)
5541 opts = pycompat.byteskwargs(opts)
5539
5542
5540 if opts.get(b'all_bookmarks'):
5543 if opts.get(b'all_bookmarks'):
5541 cmdutil.check_incompatible_arguments(
5544 cmdutil.check_incompatible_arguments(
5542 opts,
5545 opts,
5543 b'all_bookmarks',
5546 b'all_bookmarks',
5544 [b'bookmark', b'rev'],
5547 [b'bookmark', b'rev'],
5545 )
5548 )
5546 opts[b'bookmark'] = list(repo._bookmarks)
5549 opts[b'bookmark'] = list(repo._bookmarks)
5547
5550
5548 if opts.get(b'bookmark'):
5551 if opts.get(b'bookmark'):
5549 ui.setconfig(b'bookmarks', b'pushing', opts[b'bookmark'], b'push')
5552 ui.setconfig(b'bookmarks', b'pushing', opts[b'bookmark'], b'push')
5550 for b in opts[b'bookmark']:
5553 for b in opts[b'bookmark']:
5551 # translate -B options to -r so changesets get pushed
5554 # translate -B options to -r so changesets get pushed
5552 b = repo._bookmarks.expandname(b)
5555 b = repo._bookmarks.expandname(b)
5553 if b in repo._bookmarks:
5556 if b in repo._bookmarks:
5554 opts.setdefault(b'rev', []).append(b)
5557 opts.setdefault(b'rev', []).append(b)
5555 else:
5558 else:
5556 # if we try to push a deleted bookmark, translate it to null
5559 # if we try to push a deleted bookmark, translate it to null
5557 # this lets simultaneous -r, -b options continue working
5560 # this lets simultaneous -r, -b options continue working
5558 opts.setdefault(b'rev', []).append(b"null")
5561 opts.setdefault(b'rev', []).append(b"null")
5559
5562
5560 path = ui.paths.getpath(dest, default=(b'default-push', b'default'))
5563 path = ui.paths.getpath(dest, default=(b'default-push', b'default'))
5561 if not path:
5564 if not path:
5562 raise error.ConfigError(
5565 raise error.ConfigError(
5563 _(b'default repository not configured!'),
5566 _(b'default repository not configured!'),
5564 hint=_(b"see 'hg help config.paths'"),
5567 hint=_(b"see 'hg help config.paths'"),
5565 )
5568 )
5566 dest = path.pushloc or path.loc
5569 dest = path.pushloc or path.loc
5567 branches = (path.branch, opts.get(b'branch') or [])
5570 branches = (path.branch, opts.get(b'branch') or [])
5568 ui.status(_(b'pushing to %s\n') % util.hidepassword(dest))
5571 ui.status(_(b'pushing to %s\n') % util.hidepassword(dest))
5569 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get(b'rev'))
5572 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get(b'rev'))
5570 other = hg.peer(repo, opts, dest)
5573 other = hg.peer(repo, opts, dest)
5571
5574
5572 if revs:
5575 if revs:
5573 revs = [repo[r].node() for r in scmutil.revrange(repo, revs)]
5576 revs = [repo[r].node() for r in scmutil.revrange(repo, revs)]
5574 if not revs:
5577 if not revs:
5575 raise error.InputError(
5578 raise error.InputError(
5576 _(b"specified revisions evaluate to an empty set"),
5579 _(b"specified revisions evaluate to an empty set"),
5577 hint=_(b"use different revision arguments"),
5580 hint=_(b"use different revision arguments"),
5578 )
5581 )
5579 elif path.pushrev:
5582 elif path.pushrev:
5580 # It doesn't make any sense to specify ancestor revisions. So limit
5583 # It doesn't make any sense to specify ancestor revisions. So limit
5581 # to DAG heads to make discovery simpler.
5584 # to DAG heads to make discovery simpler.
5582 expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
5585 expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
5583 revs = scmutil.revrange(repo, [expr])
5586 revs = scmutil.revrange(repo, [expr])
5584 revs = [repo[rev].node() for rev in revs]
5587 revs = [repo[rev].node() for rev in revs]
5585 if not revs:
5588 if not revs:
5586 raise error.InputError(
5589 raise error.InputError(
5587 _(b'default push revset for path evaluates to an empty set')
5590 _(b'default push revset for path evaluates to an empty set')
5588 )
5591 )
5589 elif ui.configbool(b'commands', b'push.require-revs'):
5592 elif ui.configbool(b'commands', b'push.require-revs'):
5590 raise error.InputError(
5593 raise error.InputError(
5591 _(b'no revisions specified to push'),
5594 _(b'no revisions specified to push'),
5592 hint=_(b'did you mean "hg push -r ."?'),
5595 hint=_(b'did you mean "hg push -r ."?'),
5593 )
5596 )
5594
5597
5595 repo._subtoppath = dest
5598 repo._subtoppath = dest
5596 try:
5599 try:
5597 # push subrepos depth-first for coherent ordering
5600 # push subrepos depth-first for coherent ordering
5598 c = repo[b'.']
5601 c = repo[b'.']
5599 subs = c.substate # only repos that are committed
5602 subs = c.substate # only repos that are committed
5600 for s in sorted(subs):
5603 for s in sorted(subs):
5601 result = c.sub(s).push(opts)
5604 result = c.sub(s).push(opts)
5602 if result == 0:
5605 if result == 0:
5603 return not result
5606 return not result
5604 finally:
5607 finally:
5605 del repo._subtoppath
5608 del repo._subtoppath
5606
5609
5607 opargs = dict(opts.get(b'opargs', {})) # copy opargs since we may mutate it
5610 opargs = dict(opts.get(b'opargs', {})) # copy opargs since we may mutate it
5608 opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
5611 opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
5609
5612
5610 pushop = exchange.push(
5613 pushop = exchange.push(
5611 repo,
5614 repo,
5612 other,
5615 other,
5613 opts.get(b'force'),
5616 opts.get(b'force'),
5614 revs=revs,
5617 revs=revs,
5615 newbranch=opts.get(b'new_branch'),
5618 newbranch=opts.get(b'new_branch'),
5616 bookmarks=opts.get(b'bookmark', ()),
5619 bookmarks=opts.get(b'bookmark', ()),
5617 publish=opts.get(b'publish'),
5620 publish=opts.get(b'publish'),
5618 opargs=opargs,
5621 opargs=opargs,
5619 )
5622 )
5620
5623
5621 result = not pushop.cgresult
5624 result = not pushop.cgresult
5622
5625
5623 if pushop.bkresult is not None:
5626 if pushop.bkresult is not None:
5624 if pushop.bkresult == 2:
5627 if pushop.bkresult == 2:
5625 result = 2
5628 result = 2
5626 elif not result and pushop.bkresult:
5629 elif not result and pushop.bkresult:
5627 result = 2
5630 result = 2
5628
5631
5629 return result
5632 return result
5630
5633
5631
5634
5632 @command(
5635 @command(
5633 b'recover',
5636 b'recover',
5634 [
5637 [
5635 (b'', b'verify', False, b"run `hg verify` after successful recover"),
5638 (b'', b'verify', False, b"run `hg verify` after successful recover"),
5636 ],
5639 ],
5637 helpcategory=command.CATEGORY_MAINTENANCE,
5640 helpcategory=command.CATEGORY_MAINTENANCE,
5638 )
5641 )
5639 def recover(ui, repo, **opts):
5642 def recover(ui, repo, **opts):
5640 """roll back an interrupted transaction
5643 """roll back an interrupted transaction
5641
5644
5642 Recover from an interrupted commit or pull.
5645 Recover from an interrupted commit or pull.
5643
5646
5644 This command tries to fix the repository status after an
5647 This command tries to fix the repository status after an
5645 interrupted operation. It should only be necessary when Mercurial
5648 interrupted operation. It should only be necessary when Mercurial
5646 suggests it.
5649 suggests it.
5647
5650
5648 Returns 0 if successful, 1 if nothing to recover or verify fails.
5651 Returns 0 if successful, 1 if nothing to recover or verify fails.
5649 """
5652 """
5650 ret = repo.recover()
5653 ret = repo.recover()
5651 if ret:
5654 if ret:
5652 if opts['verify']:
5655 if opts['verify']:
5653 return hg.verify(repo)
5656 return hg.verify(repo)
5654 else:
5657 else:
5655 msg = _(
5658 msg = _(
5656 b"(verify step skipped, run `hg verify` to check your "
5659 b"(verify step skipped, run `hg verify` to check your "
5657 b"repository content)\n"
5660 b"repository content)\n"
5658 )
5661 )
5659 ui.warn(msg)
5662 ui.warn(msg)
5660 return 0
5663 return 0
5661 return 1
5664 return 1
5662
5665
5663
5666
5664 @command(
5667 @command(
5665 b'remove|rm',
5668 b'remove|rm',
5666 [
5669 [
5667 (b'A', b'after', None, _(b'record delete for missing files')),
5670 (b'A', b'after', None, _(b'record delete for missing files')),
5668 (b'f', b'force', None, _(b'forget added files, delete modified files')),
5671 (b'f', b'force', None, _(b'forget added files, delete modified files')),
5669 ]
5672 ]
5670 + subrepoopts
5673 + subrepoopts
5671 + walkopts
5674 + walkopts
5672 + dryrunopts,
5675 + dryrunopts,
5673 _(b'[OPTION]... FILE...'),
5676 _(b'[OPTION]... FILE...'),
5674 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5677 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5675 helpbasic=True,
5678 helpbasic=True,
5676 inferrepo=True,
5679 inferrepo=True,
5677 )
5680 )
5678 def remove(ui, repo, *pats, **opts):
5681 def remove(ui, repo, *pats, **opts):
5679 """remove the specified files on the next commit
5682 """remove the specified files on the next commit
5680
5683
5681 Schedule the indicated files for removal from the current branch.
5684 Schedule the indicated files for removal from the current branch.
5682
5685
5683 This command schedules the files to be removed at the next commit.
5686 This command schedules the files to be removed at the next commit.
5684 To undo a remove before that, see :hg:`revert`. To undo added
5687 To undo a remove before that, see :hg:`revert`. To undo added
5685 files, see :hg:`forget`.
5688 files, see :hg:`forget`.
5686
5689
5687 .. container:: verbose
5690 .. container:: verbose
5688
5691
5689 -A/--after can be used to remove only files that have already
5692 -A/--after can be used to remove only files that have already
5690 been deleted, -f/--force can be used to force deletion, and -Af
5693 been deleted, -f/--force can be used to force deletion, and -Af
5691 can be used to remove files from the next revision without
5694 can be used to remove files from the next revision without
5692 deleting them from the working directory.
5695 deleting them from the working directory.
5693
5696
5694 The following table details the behavior of remove for different
5697 The following table details the behavior of remove for different
5695 file states (columns) and option combinations (rows). The file
5698 file states (columns) and option combinations (rows). The file
5696 states are Added [A], Clean [C], Modified [M] and Missing [!]
5699 states are Added [A], Clean [C], Modified [M] and Missing [!]
5697 (as reported by :hg:`status`). The actions are Warn, Remove
5700 (as reported by :hg:`status`). The actions are Warn, Remove
5698 (from branch) and Delete (from disk):
5701 (from branch) and Delete (from disk):
5699
5702
5700 ========= == == == ==
5703 ========= == == == ==
5701 opt/state A C M !
5704 opt/state A C M !
5702 ========= == == == ==
5705 ========= == == == ==
5703 none W RD W R
5706 none W RD W R
5704 -f R RD RD R
5707 -f R RD RD R
5705 -A W W W R
5708 -A W W W R
5706 -Af R R R R
5709 -Af R R R R
5707 ========= == == == ==
5710 ========= == == == ==
5708
5711
5709 .. note::
5712 .. note::
5710
5713
5711 :hg:`remove` never deletes files in Added [A] state from the
5714 :hg:`remove` never deletes files in Added [A] state from the
5712 working directory, not even if ``--force`` is specified.
5715 working directory, not even if ``--force`` is specified.
5713
5716
5714 Returns 0 on success, 1 if any warnings encountered.
5717 Returns 0 on success, 1 if any warnings encountered.
5715 """
5718 """
5716
5719
5717 opts = pycompat.byteskwargs(opts)
5720 opts = pycompat.byteskwargs(opts)
5718 after, force = opts.get(b'after'), opts.get(b'force')
5721 after, force = opts.get(b'after'), opts.get(b'force')
5719 dryrun = opts.get(b'dry_run')
5722 dryrun = opts.get(b'dry_run')
5720 if not pats and not after:
5723 if not pats and not after:
5721 raise error.InputError(_(b'no files specified'))
5724 raise error.InputError(_(b'no files specified'))
5722
5725
5723 m = scmutil.match(repo[None], pats, opts)
5726 m = scmutil.match(repo[None], pats, opts)
5724 subrepos = opts.get(b'subrepos')
5727 subrepos = opts.get(b'subrepos')
5725 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
5728 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
5726 return cmdutil.remove(
5729 return cmdutil.remove(
5727 ui, repo, m, b"", uipathfn, after, force, subrepos, dryrun=dryrun
5730 ui, repo, m, b"", uipathfn, after, force, subrepos, dryrun=dryrun
5728 )
5731 )
5729
5732
5730
5733
5731 @command(
5734 @command(
5732 b'rename|move|mv',
5735 b'rename|move|mv',
5733 [
5736 [
5734 (b'A', b'after', None, _(b'record a rename that has already occurred')),
5737 (b'A', b'after', None, _(b'record a rename that has already occurred')),
5735 (
5738 (
5736 b'',
5739 b'',
5737 b'at-rev',
5740 b'at-rev',
5738 b'',
5741 b'',
5739 _(b'(un)mark renames in the given revision (EXPERIMENTAL)'),
5742 _(b'(un)mark renames in the given revision (EXPERIMENTAL)'),
5740 _(b'REV'),
5743 _(b'REV'),
5741 ),
5744 ),
5742 (
5745 (
5743 b'f',
5746 b'f',
5744 b'force',
5747 b'force',
5745 None,
5748 None,
5746 _(b'forcibly move over an existing managed file'),
5749 _(b'forcibly move over an existing managed file'),
5747 ),
5750 ),
5748 ]
5751 ]
5749 + walkopts
5752 + walkopts
5750 + dryrunopts,
5753 + dryrunopts,
5751 _(b'[OPTION]... SOURCE... DEST'),
5754 _(b'[OPTION]... SOURCE... DEST'),
5752 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5755 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5753 )
5756 )
5754 def rename(ui, repo, *pats, **opts):
5757 def rename(ui, repo, *pats, **opts):
5755 """rename files; equivalent of copy + remove
5758 """rename files; equivalent of copy + remove
5756
5759
5757 Mark dest as copies of sources; mark sources for deletion. If dest
5760 Mark dest as copies of sources; mark sources for deletion. If dest
5758 is a directory, copies are put in that directory. If dest is a
5761 is a directory, copies are put in that directory. If dest is a
5759 file, there can only be one source.
5762 file, there can only be one source.
5760
5763
5761 By default, this command copies the contents of files as they
5764 By default, this command copies the contents of files as they
5762 exist in the working directory. If invoked with -A/--after, the
5765 exist in the working directory. If invoked with -A/--after, the
5763 operation is recorded, but no copying is performed.
5766 operation is recorded, but no copying is performed.
5764
5767
5765 This command takes effect at the next commit. To undo a rename
5768 This command takes effect at the next commit. To undo a rename
5766 before that, see :hg:`revert`.
5769 before that, see :hg:`revert`.
5767
5770
5768 Returns 0 on success, 1 if errors are encountered.
5771 Returns 0 on success, 1 if errors are encountered.
5769 """
5772 """
5770 opts = pycompat.byteskwargs(opts)
5773 opts = pycompat.byteskwargs(opts)
5771 with repo.wlock():
5774 with repo.wlock():
5772 return cmdutil.copy(ui, repo, pats, opts, rename=True)
5775 return cmdutil.copy(ui, repo, pats, opts, rename=True)
5773
5776
5774
5777
5775 @command(
5778 @command(
5776 b'resolve',
5779 b'resolve',
5777 [
5780 [
5778 (b'a', b'all', None, _(b'select all unresolved files')),
5781 (b'a', b'all', None, _(b'select all unresolved files')),
5779 (b'l', b'list', None, _(b'list state of files needing merge')),
5782 (b'l', b'list', None, _(b'list state of files needing merge')),
5780 (b'm', b'mark', None, _(b'mark files as resolved')),
5783 (b'm', b'mark', None, _(b'mark files as resolved')),
5781 (b'u', b'unmark', None, _(b'mark files as unresolved')),
5784 (b'u', b'unmark', None, _(b'mark files as unresolved')),
5782 (b'n', b'no-status', None, _(b'hide status prefix')),
5785 (b'n', b'no-status', None, _(b'hide status prefix')),
5783 (b'', b're-merge', None, _(b're-merge files')),
5786 (b'', b're-merge', None, _(b're-merge files')),
5784 ]
5787 ]
5785 + mergetoolopts
5788 + mergetoolopts
5786 + walkopts
5789 + walkopts
5787 + formatteropts,
5790 + formatteropts,
5788 _(b'[OPTION]... [FILE]...'),
5791 _(b'[OPTION]... [FILE]...'),
5789 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5792 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5790 inferrepo=True,
5793 inferrepo=True,
5791 )
5794 )
5792 def resolve(ui, repo, *pats, **opts):
5795 def resolve(ui, repo, *pats, **opts):
5793 """redo merges or set/view the merge status of files
5796 """redo merges or set/view the merge status of files
5794
5797
5795 Merges with unresolved conflicts are often the result of
5798 Merges with unresolved conflicts are often the result of
5796 non-interactive merging using the ``internal:merge`` configuration
5799 non-interactive merging using the ``internal:merge`` configuration
5797 setting, or a command-line merge tool like ``diff3``. The resolve
5800 setting, or a command-line merge tool like ``diff3``. The resolve
5798 command is used to manage the files involved in a merge, after
5801 command is used to manage the files involved in a merge, after
5799 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
5802 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
5800 working directory must have two parents). See :hg:`help
5803 working directory must have two parents). See :hg:`help
5801 merge-tools` for information on configuring merge tools.
5804 merge-tools` for information on configuring merge tools.
5802
5805
5803 The resolve command can be used in the following ways:
5806 The resolve command can be used in the following ways:
5804
5807
5805 - :hg:`resolve [--re-merge] [--tool TOOL] FILE...`: attempt to re-merge
5808 - :hg:`resolve [--re-merge] [--tool TOOL] FILE...`: attempt to re-merge
5806 the specified files, discarding any previous merge attempts. Re-merging
5809 the specified files, discarding any previous merge attempts. Re-merging
5807 is not performed for files already marked as resolved. Use ``--all/-a``
5810 is not performed for files already marked as resolved. Use ``--all/-a``
5808 to select all unresolved files. ``--tool`` can be used to specify
5811 to select all unresolved files. ``--tool`` can be used to specify
5809 the merge tool used for the given files. It overrides the HGMERGE
5812 the merge tool used for the given files. It overrides the HGMERGE
5810 environment variable and your configuration files. Previous file
5813 environment variable and your configuration files. Previous file
5811 contents are saved with a ``.orig`` suffix.
5814 contents are saved with a ``.orig`` suffix.
5812
5815
5813 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
5816 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
5814 (e.g. after having manually fixed-up the files). The default is
5817 (e.g. after having manually fixed-up the files). The default is
5815 to mark all unresolved files.
5818 to mark all unresolved files.
5816
5819
5817 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
5820 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
5818 default is to mark all resolved files.
5821 default is to mark all resolved files.
5819
5822
5820 - :hg:`resolve -l`: list files which had or still have conflicts.
5823 - :hg:`resolve -l`: list files which had or still have conflicts.
5821 In the printed list, ``U`` = unresolved and ``R`` = resolved.
5824 In the printed list, ``U`` = unresolved and ``R`` = resolved.
5822 You can use ``set:unresolved()`` or ``set:resolved()`` to filter
5825 You can use ``set:unresolved()`` or ``set:resolved()`` to filter
5823 the list. See :hg:`help filesets` for details.
5826 the list. See :hg:`help filesets` for details.
5824
5827
5825 .. note::
5828 .. note::
5826
5829
5827 Mercurial will not let you commit files with unresolved merge
5830 Mercurial will not let you commit files with unresolved merge
5828 conflicts. You must use :hg:`resolve -m ...` before you can
5831 conflicts. You must use :hg:`resolve -m ...` before you can
5829 commit after a conflicting merge.
5832 commit after a conflicting merge.
5830
5833
5831 .. container:: verbose
5834 .. container:: verbose
5832
5835
5833 Template:
5836 Template:
5834
5837
5835 The following keywords are supported in addition to the common template
5838 The following keywords are supported in addition to the common template
5836 keywords and functions. See also :hg:`help templates`.
5839 keywords and functions. See also :hg:`help templates`.
5837
5840
5838 :mergestatus: String. Character denoting merge conflicts, ``U`` or ``R``.
5841 :mergestatus: String. Character denoting merge conflicts, ``U`` or ``R``.
5839 :path: String. Repository-absolute path of the file.
5842 :path: String. Repository-absolute path of the file.
5840
5843
5841 Returns 0 on success, 1 if any files fail a resolve attempt.
5844 Returns 0 on success, 1 if any files fail a resolve attempt.
5842 """
5845 """
5843
5846
5844 opts = pycompat.byteskwargs(opts)
5847 opts = pycompat.byteskwargs(opts)
5845 confirm = ui.configbool(b'commands', b'resolve.confirm')
5848 confirm = ui.configbool(b'commands', b'resolve.confirm')
5846 flaglist = b'all mark unmark list no_status re_merge'.split()
5849 flaglist = b'all mark unmark list no_status re_merge'.split()
5847 all, mark, unmark, show, nostatus, remerge = [opts.get(o) for o in flaglist]
5850 all, mark, unmark, show, nostatus, remerge = [opts.get(o) for o in flaglist]
5848
5851
5849 actioncount = len(list(filter(None, [show, mark, unmark, remerge])))
5852 actioncount = len(list(filter(None, [show, mark, unmark, remerge])))
5850 if actioncount > 1:
5853 if actioncount > 1:
5851 raise error.InputError(_(b"too many actions specified"))
5854 raise error.InputError(_(b"too many actions specified"))
5852 elif actioncount == 0 and ui.configbool(
5855 elif actioncount == 0 and ui.configbool(
5853 b'commands', b'resolve.explicit-re-merge'
5856 b'commands', b'resolve.explicit-re-merge'
5854 ):
5857 ):
5855 hint = _(b'use --mark, --unmark, --list or --re-merge')
5858 hint = _(b'use --mark, --unmark, --list or --re-merge')
5856 raise error.InputError(_(b'no action specified'), hint=hint)
5859 raise error.InputError(_(b'no action specified'), hint=hint)
5857 if pats and all:
5860 if pats and all:
5858 raise error.InputError(_(b"can't specify --all and patterns"))
5861 raise error.InputError(_(b"can't specify --all and patterns"))
5859 if not (all or pats or show or mark or unmark):
5862 if not (all or pats or show or mark or unmark):
5860 raise error.InputError(
5863 raise error.InputError(
5861 _(b'no files or directories specified'),
5864 _(b'no files or directories specified'),
5862 hint=b'use --all to re-merge all unresolved files',
5865 hint=b'use --all to re-merge all unresolved files',
5863 )
5866 )
5864
5867
5865 if confirm:
5868 if confirm:
5866 if all:
5869 if all:
5867 if ui.promptchoice(
5870 if ui.promptchoice(
5868 _(b're-merge all unresolved files (yn)?$$ &Yes $$ &No')
5871 _(b're-merge all unresolved files (yn)?$$ &Yes $$ &No')
5869 ):
5872 ):
5870 raise error.CanceledError(_(b'user quit'))
5873 raise error.CanceledError(_(b'user quit'))
5871 if mark and not pats:
5874 if mark and not pats:
5872 if ui.promptchoice(
5875 if ui.promptchoice(
5873 _(
5876 _(
5874 b'mark all unresolved files as resolved (yn)?'
5877 b'mark all unresolved files as resolved (yn)?'
5875 b'$$ &Yes $$ &No'
5878 b'$$ &Yes $$ &No'
5876 )
5879 )
5877 ):
5880 ):
5878 raise error.CanceledError(_(b'user quit'))
5881 raise error.CanceledError(_(b'user quit'))
5879 if unmark and not pats:
5882 if unmark and not pats:
5880 if ui.promptchoice(
5883 if ui.promptchoice(
5881 _(
5884 _(
5882 b'mark all resolved files as unresolved (yn)?'
5885 b'mark all resolved files as unresolved (yn)?'
5883 b'$$ &Yes $$ &No'
5886 b'$$ &Yes $$ &No'
5884 )
5887 )
5885 ):
5888 ):
5886 raise error.CanceledError(_(b'user quit'))
5889 raise error.CanceledError(_(b'user quit'))
5887
5890
5888 uipathfn = scmutil.getuipathfn(repo)
5891 uipathfn = scmutil.getuipathfn(repo)
5889
5892
5890 if show:
5893 if show:
5891 ui.pager(b'resolve')
5894 ui.pager(b'resolve')
5892 fm = ui.formatter(b'resolve', opts)
5895 fm = ui.formatter(b'resolve', opts)
5893 ms = mergestatemod.mergestate.read(repo)
5896 ms = mergestatemod.mergestate.read(repo)
5894 wctx = repo[None]
5897 wctx = repo[None]
5895 m = scmutil.match(wctx, pats, opts)
5898 m = scmutil.match(wctx, pats, opts)
5896
5899
5897 # Labels and keys based on merge state. Unresolved path conflicts show
5900 # Labels and keys based on merge state. Unresolved path conflicts show
5898 # as 'P'. Resolved path conflicts show as 'R', the same as normal
5901 # as 'P'. Resolved path conflicts show as 'R', the same as normal
5899 # resolved conflicts.
5902 # resolved conflicts.
5900 mergestateinfo = {
5903 mergestateinfo = {
5901 mergestatemod.MERGE_RECORD_UNRESOLVED: (
5904 mergestatemod.MERGE_RECORD_UNRESOLVED: (
5902 b'resolve.unresolved',
5905 b'resolve.unresolved',
5903 b'U',
5906 b'U',
5904 ),
5907 ),
5905 mergestatemod.MERGE_RECORD_RESOLVED: (b'resolve.resolved', b'R'),
5908 mergestatemod.MERGE_RECORD_RESOLVED: (b'resolve.resolved', b'R'),
5906 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH: (
5909 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH: (
5907 b'resolve.unresolved',
5910 b'resolve.unresolved',
5908 b'P',
5911 b'P',
5909 ),
5912 ),
5910 mergestatemod.MERGE_RECORD_RESOLVED_PATH: (
5913 mergestatemod.MERGE_RECORD_RESOLVED_PATH: (
5911 b'resolve.resolved',
5914 b'resolve.resolved',
5912 b'R',
5915 b'R',
5913 ),
5916 ),
5914 }
5917 }
5915
5918
5916 for f in ms:
5919 for f in ms:
5917 if not m(f):
5920 if not m(f):
5918 continue
5921 continue
5919
5922
5920 label, key = mergestateinfo[ms[f]]
5923 label, key = mergestateinfo[ms[f]]
5921 fm.startitem()
5924 fm.startitem()
5922 fm.context(ctx=wctx)
5925 fm.context(ctx=wctx)
5923 fm.condwrite(not nostatus, b'mergestatus', b'%s ', key, label=label)
5926 fm.condwrite(not nostatus, b'mergestatus', b'%s ', key, label=label)
5924 fm.data(path=f)
5927 fm.data(path=f)
5925 fm.plain(b'%s\n' % uipathfn(f), label=label)
5928 fm.plain(b'%s\n' % uipathfn(f), label=label)
5926 fm.end()
5929 fm.end()
5927 return 0
5930 return 0
5928
5931
5929 with repo.wlock():
5932 with repo.wlock():
5930 ms = mergestatemod.mergestate.read(repo)
5933 ms = mergestatemod.mergestate.read(repo)
5931
5934
5932 if not (ms.active() or repo.dirstate.p2() != nullid):
5935 if not (ms.active() or repo.dirstate.p2() != nullid):
5933 raise error.StateError(
5936 raise error.StateError(
5934 _(b'resolve command not applicable when not merging')
5937 _(b'resolve command not applicable when not merging')
5935 )
5938 )
5936
5939
5937 wctx = repo[None]
5940 wctx = repo[None]
5938 m = scmutil.match(wctx, pats, opts)
5941 m = scmutil.match(wctx, pats, opts)
5939 ret = 0
5942 ret = 0
5940 didwork = False
5943 didwork = False
5941
5944
5942 tocomplete = []
5945 tocomplete = []
5943 hasconflictmarkers = []
5946 hasconflictmarkers = []
5944 if mark:
5947 if mark:
5945 markcheck = ui.config(b'commands', b'resolve.mark-check')
5948 markcheck = ui.config(b'commands', b'resolve.mark-check')
5946 if markcheck not in [b'warn', b'abort']:
5949 if markcheck not in [b'warn', b'abort']:
5947 # Treat all invalid / unrecognized values as 'none'.
5950 # Treat all invalid / unrecognized values as 'none'.
5948 markcheck = False
5951 markcheck = False
5949 for f in ms:
5952 for f in ms:
5950 if not m(f):
5953 if not m(f):
5951 continue
5954 continue
5952
5955
5953 didwork = True
5956 didwork = True
5954
5957
5955 # path conflicts must be resolved manually
5958 # path conflicts must be resolved manually
5956 if ms[f] in (
5959 if ms[f] in (
5957 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH,
5960 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH,
5958 mergestatemod.MERGE_RECORD_RESOLVED_PATH,
5961 mergestatemod.MERGE_RECORD_RESOLVED_PATH,
5959 ):
5962 ):
5960 if mark:
5963 if mark:
5961 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED_PATH)
5964 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED_PATH)
5962 elif unmark:
5965 elif unmark:
5963 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED_PATH)
5966 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED_PATH)
5964 elif ms[f] == mergestatemod.MERGE_RECORD_UNRESOLVED_PATH:
5967 elif ms[f] == mergestatemod.MERGE_RECORD_UNRESOLVED_PATH:
5965 ui.warn(
5968 ui.warn(
5966 _(b'%s: path conflict must be resolved manually\n')
5969 _(b'%s: path conflict must be resolved manually\n')
5967 % uipathfn(f)
5970 % uipathfn(f)
5968 )
5971 )
5969 continue
5972 continue
5970
5973
5971 if mark:
5974 if mark:
5972 if markcheck:
5975 if markcheck:
5973 fdata = repo.wvfs.tryread(f)
5976 fdata = repo.wvfs.tryread(f)
5974 if (
5977 if (
5975 filemerge.hasconflictmarkers(fdata)
5978 filemerge.hasconflictmarkers(fdata)
5976 and ms[f] != mergestatemod.MERGE_RECORD_RESOLVED
5979 and ms[f] != mergestatemod.MERGE_RECORD_RESOLVED
5977 ):
5980 ):
5978 hasconflictmarkers.append(f)
5981 hasconflictmarkers.append(f)
5979 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED)
5982 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED)
5980 elif unmark:
5983 elif unmark:
5981 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED)
5984 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED)
5982 else:
5985 else:
5983 # backup pre-resolve (merge uses .orig for its own purposes)
5986 # backup pre-resolve (merge uses .orig for its own purposes)
5984 a = repo.wjoin(f)
5987 a = repo.wjoin(f)
5985 try:
5988 try:
5986 util.copyfile(a, a + b".resolve")
5989 util.copyfile(a, a + b".resolve")
5987 except (IOError, OSError) as inst:
5990 except (IOError, OSError) as inst:
5988 if inst.errno != errno.ENOENT:
5991 if inst.errno != errno.ENOENT:
5989 raise
5992 raise
5990
5993
5991 try:
5994 try:
5992 # preresolve file
5995 # preresolve file
5993 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
5996 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
5994 with ui.configoverride(overrides, b'resolve'):
5997 with ui.configoverride(overrides, b'resolve'):
5995 complete, r = ms.preresolve(f, wctx)
5998 complete, r = ms.preresolve(f, wctx)
5996 if not complete:
5999 if not complete:
5997 tocomplete.append(f)
6000 tocomplete.append(f)
5998 elif r:
6001 elif r:
5999 ret = 1
6002 ret = 1
6000 finally:
6003 finally:
6001 ms.commit()
6004 ms.commit()
6002
6005
6003 # replace filemerge's .orig file with our resolve file, but only
6006 # replace filemerge's .orig file with our resolve file, but only
6004 # for merges that are complete
6007 # for merges that are complete
6005 if complete:
6008 if complete:
6006 try:
6009 try:
6007 util.rename(
6010 util.rename(
6008 a + b".resolve", scmutil.backuppath(ui, repo, f)
6011 a + b".resolve", scmutil.backuppath(ui, repo, f)
6009 )
6012 )
6010 except OSError as inst:
6013 except OSError as inst:
6011 if inst.errno != errno.ENOENT:
6014 if inst.errno != errno.ENOENT:
6012 raise
6015 raise
6013
6016
6014 if hasconflictmarkers:
6017 if hasconflictmarkers:
6015 ui.warn(
6018 ui.warn(
6016 _(
6019 _(
6017 b'warning: the following files still have conflict '
6020 b'warning: the following files still have conflict '
6018 b'markers:\n'
6021 b'markers:\n'
6019 )
6022 )
6020 + b''.join(
6023 + b''.join(
6021 b' ' + uipathfn(f) + b'\n' for f in hasconflictmarkers
6024 b' ' + uipathfn(f) + b'\n' for f in hasconflictmarkers
6022 )
6025 )
6023 )
6026 )
6024 if markcheck == b'abort' and not all and not pats:
6027 if markcheck == b'abort' and not all and not pats:
6025 raise error.StateError(
6028 raise error.StateError(
6026 _(b'conflict markers detected'),
6029 _(b'conflict markers detected'),
6027 hint=_(b'use --all to mark anyway'),
6030 hint=_(b'use --all to mark anyway'),
6028 )
6031 )
6029
6032
6030 for f in tocomplete:
6033 for f in tocomplete:
6031 try:
6034 try:
6032 # resolve file
6035 # resolve file
6033 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
6036 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
6034 with ui.configoverride(overrides, b'resolve'):
6037 with ui.configoverride(overrides, b'resolve'):
6035 r = ms.resolve(f, wctx)
6038 r = ms.resolve(f, wctx)
6036 if r:
6039 if r:
6037 ret = 1
6040 ret = 1
6038 finally:
6041 finally:
6039 ms.commit()
6042 ms.commit()
6040
6043
6041 # replace filemerge's .orig file with our resolve file
6044 # replace filemerge's .orig file with our resolve file
6042 a = repo.wjoin(f)
6045 a = repo.wjoin(f)
6043 try:
6046 try:
6044 util.rename(a + b".resolve", scmutil.backuppath(ui, repo, f))
6047 util.rename(a + b".resolve", scmutil.backuppath(ui, repo, f))
6045 except OSError as inst:
6048 except OSError as inst:
6046 if inst.errno != errno.ENOENT:
6049 if inst.errno != errno.ENOENT:
6047 raise
6050 raise
6048
6051
6049 ms.commit()
6052 ms.commit()
6050 branchmerge = repo.dirstate.p2() != nullid
6053 branchmerge = repo.dirstate.p2() != nullid
6051 mergestatemod.recordupdates(repo, ms.actions(), branchmerge, None)
6054 mergestatemod.recordupdates(repo, ms.actions(), branchmerge, None)
6052
6055
6053 if not didwork and pats:
6056 if not didwork and pats:
6054 hint = None
6057 hint = None
6055 if not any([p for p in pats if p.find(b':') >= 0]):
6058 if not any([p for p in pats if p.find(b':') >= 0]):
6056 pats = [b'path:%s' % p for p in pats]
6059 pats = [b'path:%s' % p for p in pats]
6057 m = scmutil.match(wctx, pats, opts)
6060 m = scmutil.match(wctx, pats, opts)
6058 for f in ms:
6061 for f in ms:
6059 if not m(f):
6062 if not m(f):
6060 continue
6063 continue
6061
6064
6062 def flag(o):
6065 def flag(o):
6063 if o == b're_merge':
6066 if o == b're_merge':
6064 return b'--re-merge '
6067 return b'--re-merge '
6065 return b'-%s ' % o[0:1]
6068 return b'-%s ' % o[0:1]
6066
6069
6067 flags = b''.join([flag(o) for o in flaglist if opts.get(o)])
6070 flags = b''.join([flag(o) for o in flaglist if opts.get(o)])
6068 hint = _(b"(try: hg resolve %s%s)\n") % (
6071 hint = _(b"(try: hg resolve %s%s)\n") % (
6069 flags,
6072 flags,
6070 b' '.join(pats),
6073 b' '.join(pats),
6071 )
6074 )
6072 break
6075 break
6073 ui.warn(_(b"arguments do not match paths that need resolving\n"))
6076 ui.warn(_(b"arguments do not match paths that need resolving\n"))
6074 if hint:
6077 if hint:
6075 ui.warn(hint)
6078 ui.warn(hint)
6076
6079
6077 unresolvedf = list(ms.unresolved())
6080 unresolvedf = list(ms.unresolved())
6078 if not unresolvedf:
6081 if not unresolvedf:
6079 ui.status(_(b'(no more unresolved files)\n'))
6082 ui.status(_(b'(no more unresolved files)\n'))
6080 cmdutil.checkafterresolved(repo)
6083 cmdutil.checkafterresolved(repo)
6081
6084
6082 return ret
6085 return ret
6083
6086
6084
6087
6085 @command(
6088 @command(
6086 b'revert',
6089 b'revert',
6087 [
6090 [
6088 (b'a', b'all', None, _(b'revert all changes when no arguments given')),
6091 (b'a', b'all', None, _(b'revert all changes when no arguments given')),
6089 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
6092 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
6090 (b'r', b'rev', b'', _(b'revert to the specified revision'), _(b'REV')),
6093 (b'r', b'rev', b'', _(b'revert to the specified revision'), _(b'REV')),
6091 (b'C', b'no-backup', None, _(b'do not save backup copies of files')),
6094 (b'C', b'no-backup', None, _(b'do not save backup copies of files')),
6092 (b'i', b'interactive', None, _(b'interactively select the changes')),
6095 (b'i', b'interactive', None, _(b'interactively select the changes')),
6093 ]
6096 ]
6094 + walkopts
6097 + walkopts
6095 + dryrunopts,
6098 + dryrunopts,
6096 _(b'[OPTION]... [-r REV] [NAME]...'),
6099 _(b'[OPTION]... [-r REV] [NAME]...'),
6097 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6100 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6098 )
6101 )
6099 def revert(ui, repo, *pats, **opts):
6102 def revert(ui, repo, *pats, **opts):
6100 """restore files to their checkout state
6103 """restore files to their checkout state
6101
6104
6102 .. note::
6105 .. note::
6103
6106
6104 To check out earlier revisions, you should use :hg:`update REV`.
6107 To check out earlier revisions, you should use :hg:`update REV`.
6105 To cancel an uncommitted merge (and lose your changes),
6108 To cancel an uncommitted merge (and lose your changes),
6106 use :hg:`merge --abort`.
6109 use :hg:`merge --abort`.
6107
6110
6108 With no revision specified, revert the specified files or directories
6111 With no revision specified, revert the specified files or directories
6109 to the contents they had in the parent of the working directory.
6112 to the contents they had in the parent of the working directory.
6110 This restores the contents of files to an unmodified
6113 This restores the contents of files to an unmodified
6111 state and unschedules adds, removes, copies, and renames. If the
6114 state and unschedules adds, removes, copies, and renames. If the
6112 working directory has two parents, you must explicitly specify a
6115 working directory has two parents, you must explicitly specify a
6113 revision.
6116 revision.
6114
6117
6115 Using the -r/--rev or -d/--date options, revert the given files or
6118 Using the -r/--rev or -d/--date options, revert the given files or
6116 directories to their states as of a specific revision. Because
6119 directories to their states as of a specific revision. Because
6117 revert does not change the working directory parents, this will
6120 revert does not change the working directory parents, this will
6118 cause these files to appear modified. This can be helpful to "back
6121 cause these files to appear modified. This can be helpful to "back
6119 out" some or all of an earlier change. See :hg:`backout` for a
6122 out" some or all of an earlier change. See :hg:`backout` for a
6120 related method.
6123 related method.
6121
6124
6122 Modified files are saved with a .orig suffix before reverting.
6125 Modified files are saved with a .orig suffix before reverting.
6123 To disable these backups, use --no-backup. It is possible to store
6126 To disable these backups, use --no-backup. It is possible to store
6124 the backup files in a custom directory relative to the root of the
6127 the backup files in a custom directory relative to the root of the
6125 repository by setting the ``ui.origbackuppath`` configuration
6128 repository by setting the ``ui.origbackuppath`` configuration
6126 option.
6129 option.
6127
6130
6128 See :hg:`help dates` for a list of formats valid for -d/--date.
6131 See :hg:`help dates` for a list of formats valid for -d/--date.
6129
6132
6130 See :hg:`help backout` for a way to reverse the effect of an
6133 See :hg:`help backout` for a way to reverse the effect of an
6131 earlier changeset.
6134 earlier changeset.
6132
6135
6133 Returns 0 on success.
6136 Returns 0 on success.
6134 """
6137 """
6135
6138
6136 opts = pycompat.byteskwargs(opts)
6139 opts = pycompat.byteskwargs(opts)
6137 if opts.get(b"date"):
6140 if opts.get(b"date"):
6138 cmdutil.check_incompatible_arguments(opts, b'date', [b'rev'])
6141 cmdutil.check_incompatible_arguments(opts, b'date', [b'rev'])
6139 opts[b"rev"] = cmdutil.finddate(ui, repo, opts[b"date"])
6142 opts[b"rev"] = cmdutil.finddate(ui, repo, opts[b"date"])
6140
6143
6141 parent, p2 = repo.dirstate.parents()
6144 parent, p2 = repo.dirstate.parents()
6142 if not opts.get(b'rev') and p2 != nullid:
6145 if not opts.get(b'rev') and p2 != nullid:
6143 # revert after merge is a trap for new users (issue2915)
6146 # revert after merge is a trap for new users (issue2915)
6144 raise error.InputError(
6147 raise error.InputError(
6145 _(b'uncommitted merge with no revision specified'),
6148 _(b'uncommitted merge with no revision specified'),
6146 hint=_(b"use 'hg update' or see 'hg help revert'"),
6149 hint=_(b"use 'hg update' or see 'hg help revert'"),
6147 )
6150 )
6148
6151
6149 rev = opts.get(b'rev')
6152 rev = opts.get(b'rev')
6150 if rev:
6153 if rev:
6151 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
6154 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
6152 ctx = scmutil.revsingle(repo, rev)
6155 ctx = scmutil.revsingle(repo, rev)
6153
6156
6154 if not (
6157 if not (
6155 pats
6158 pats
6156 or opts.get(b'include')
6159 or opts.get(b'include')
6157 or opts.get(b'exclude')
6160 or opts.get(b'exclude')
6158 or opts.get(b'all')
6161 or opts.get(b'all')
6159 or opts.get(b'interactive')
6162 or opts.get(b'interactive')
6160 ):
6163 ):
6161 msg = _(b"no files or directories specified")
6164 msg = _(b"no files or directories specified")
6162 if p2 != nullid:
6165 if p2 != nullid:
6163 hint = _(
6166 hint = _(
6164 b"uncommitted merge, use --all to discard all changes,"
6167 b"uncommitted merge, use --all to discard all changes,"
6165 b" or 'hg update -C .' to abort the merge"
6168 b" or 'hg update -C .' to abort the merge"
6166 )
6169 )
6167 raise error.InputError(msg, hint=hint)
6170 raise error.InputError(msg, hint=hint)
6168 dirty = any(repo.status())
6171 dirty = any(repo.status())
6169 node = ctx.node()
6172 node = ctx.node()
6170 if node != parent:
6173 if node != parent:
6171 if dirty:
6174 if dirty:
6172 hint = (
6175 hint = (
6173 _(
6176 _(
6174 b"uncommitted changes, use --all to discard all"
6177 b"uncommitted changes, use --all to discard all"
6175 b" changes, or 'hg update %d' to update"
6178 b" changes, or 'hg update %d' to update"
6176 )
6179 )
6177 % ctx.rev()
6180 % ctx.rev()
6178 )
6181 )
6179 else:
6182 else:
6180 hint = (
6183 hint = (
6181 _(
6184 _(
6182 b"use --all to revert all files,"
6185 b"use --all to revert all files,"
6183 b" or 'hg update %d' to update"
6186 b" or 'hg update %d' to update"
6184 )
6187 )
6185 % ctx.rev()
6188 % ctx.rev()
6186 )
6189 )
6187 elif dirty:
6190 elif dirty:
6188 hint = _(b"uncommitted changes, use --all to discard all changes")
6191 hint = _(b"uncommitted changes, use --all to discard all changes")
6189 else:
6192 else:
6190 hint = _(b"use --all to revert all files")
6193 hint = _(b"use --all to revert all files")
6191 raise error.InputError(msg, hint=hint)
6194 raise error.InputError(msg, hint=hint)
6192
6195
6193 return cmdutil.revert(ui, repo, ctx, *pats, **pycompat.strkwargs(opts))
6196 return cmdutil.revert(ui, repo, ctx, *pats, **pycompat.strkwargs(opts))
6194
6197
6195
6198
6196 @command(
6199 @command(
6197 b'rollback',
6200 b'rollback',
6198 dryrunopts + [(b'f', b'force', False, _(b'ignore safety measures'))],
6201 dryrunopts + [(b'f', b'force', False, _(b'ignore safety measures'))],
6199 helpcategory=command.CATEGORY_MAINTENANCE,
6202 helpcategory=command.CATEGORY_MAINTENANCE,
6200 )
6203 )
6201 def rollback(ui, repo, **opts):
6204 def rollback(ui, repo, **opts):
6202 """roll back the last transaction (DANGEROUS) (DEPRECATED)
6205 """roll back the last transaction (DANGEROUS) (DEPRECATED)
6203
6206
6204 Please use :hg:`commit --amend` instead of rollback to correct
6207 Please use :hg:`commit --amend` instead of rollback to correct
6205 mistakes in the last commit.
6208 mistakes in the last commit.
6206
6209
6207 This command should be used with care. There is only one level of
6210 This command should be used with care. There is only one level of
6208 rollback, and there is no way to undo a rollback. It will also
6211 rollback, and there is no way to undo a rollback. It will also
6209 restore the dirstate at the time of the last transaction, losing
6212 restore the dirstate at the time of the last transaction, losing
6210 any dirstate changes since that time. This command does not alter
6213 any dirstate changes since that time. This command does not alter
6211 the working directory.
6214 the working directory.
6212
6215
6213 Transactions are used to encapsulate the effects of all commands
6216 Transactions are used to encapsulate the effects of all commands
6214 that create new changesets or propagate existing changesets into a
6217 that create new changesets or propagate existing changesets into a
6215 repository.
6218 repository.
6216
6219
6217 .. container:: verbose
6220 .. container:: verbose
6218
6221
6219 For example, the following commands are transactional, and their
6222 For example, the following commands are transactional, and their
6220 effects can be rolled back:
6223 effects can be rolled back:
6221
6224
6222 - commit
6225 - commit
6223 - import
6226 - import
6224 - pull
6227 - pull
6225 - push (with this repository as the destination)
6228 - push (with this repository as the destination)
6226 - unbundle
6229 - unbundle
6227
6230
6228 To avoid permanent data loss, rollback will refuse to rollback a
6231 To avoid permanent data loss, rollback will refuse to rollback a
6229 commit transaction if it isn't checked out. Use --force to
6232 commit transaction if it isn't checked out. Use --force to
6230 override this protection.
6233 override this protection.
6231
6234
6232 The rollback command can be entirely disabled by setting the
6235 The rollback command can be entirely disabled by setting the
6233 ``ui.rollback`` configuration setting to false. If you're here
6236 ``ui.rollback`` configuration setting to false. If you're here
6234 because you want to use rollback and it's disabled, you can
6237 because you want to use rollback and it's disabled, you can
6235 re-enable the command by setting ``ui.rollback`` to true.
6238 re-enable the command by setting ``ui.rollback`` to true.
6236
6239
6237 This command is not intended for use on public repositories. Once
6240 This command is not intended for use on public repositories. Once
6238 changes are visible for pull by other users, rolling a transaction
6241 changes are visible for pull by other users, rolling a transaction
6239 back locally is ineffective (someone else may already have pulled
6242 back locally is ineffective (someone else may already have pulled
6240 the changes). Furthermore, a race is possible with readers of the
6243 the changes). Furthermore, a race is possible with readers of the
6241 repository; for example an in-progress pull from the repository
6244 repository; for example an in-progress pull from the repository
6242 may fail if a rollback is performed.
6245 may fail if a rollback is performed.
6243
6246
6244 Returns 0 on success, 1 if no rollback data is available.
6247 Returns 0 on success, 1 if no rollback data is available.
6245 """
6248 """
6246 if not ui.configbool(b'ui', b'rollback'):
6249 if not ui.configbool(b'ui', b'rollback'):
6247 raise error.Abort(
6250 raise error.Abort(
6248 _(b'rollback is disabled because it is unsafe'),
6251 _(b'rollback is disabled because it is unsafe'),
6249 hint=b'see `hg help -v rollback` for information',
6252 hint=b'see `hg help -v rollback` for information',
6250 )
6253 )
6251 return repo.rollback(dryrun=opts.get('dry_run'), force=opts.get('force'))
6254 return repo.rollback(dryrun=opts.get('dry_run'), force=opts.get('force'))
6252
6255
6253
6256
6254 @command(
6257 @command(
6255 b'root',
6258 b'root',
6256 [] + formatteropts,
6259 [] + formatteropts,
6257 intents={INTENT_READONLY},
6260 intents={INTENT_READONLY},
6258 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6261 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6259 )
6262 )
6260 def root(ui, repo, **opts):
6263 def root(ui, repo, **opts):
6261 """print the root (top) of the current working directory
6264 """print the root (top) of the current working directory
6262
6265
6263 Print the root directory of the current repository.
6266 Print the root directory of the current repository.
6264
6267
6265 .. container:: verbose
6268 .. container:: verbose
6266
6269
6267 Template:
6270 Template:
6268
6271
6269 The following keywords are supported in addition to the common template
6272 The following keywords are supported in addition to the common template
6270 keywords and functions. See also :hg:`help templates`.
6273 keywords and functions. See also :hg:`help templates`.
6271
6274
6272 :hgpath: String. Path to the .hg directory.
6275 :hgpath: String. Path to the .hg directory.
6273 :storepath: String. Path to the directory holding versioned data.
6276 :storepath: String. Path to the directory holding versioned data.
6274
6277
6275 Returns 0 on success.
6278 Returns 0 on success.
6276 """
6279 """
6277 opts = pycompat.byteskwargs(opts)
6280 opts = pycompat.byteskwargs(opts)
6278 with ui.formatter(b'root', opts) as fm:
6281 with ui.formatter(b'root', opts) as fm:
6279 fm.startitem()
6282 fm.startitem()
6280 fm.write(b'reporoot', b'%s\n', repo.root)
6283 fm.write(b'reporoot', b'%s\n', repo.root)
6281 fm.data(hgpath=repo.path, storepath=repo.spath)
6284 fm.data(hgpath=repo.path, storepath=repo.spath)
6282
6285
6283
6286
6284 @command(
6287 @command(
6285 b'serve',
6288 b'serve',
6286 [
6289 [
6287 (
6290 (
6288 b'A',
6291 b'A',
6289 b'accesslog',
6292 b'accesslog',
6290 b'',
6293 b'',
6291 _(b'name of access log file to write to'),
6294 _(b'name of access log file to write to'),
6292 _(b'FILE'),
6295 _(b'FILE'),
6293 ),
6296 ),
6294 (b'd', b'daemon', None, _(b'run server in background')),
6297 (b'd', b'daemon', None, _(b'run server in background')),
6295 (b'', b'daemon-postexec', [], _(b'used internally by daemon mode')),
6298 (b'', b'daemon-postexec', [], _(b'used internally by daemon mode')),
6296 (
6299 (
6297 b'E',
6300 b'E',
6298 b'errorlog',
6301 b'errorlog',
6299 b'',
6302 b'',
6300 _(b'name of error log file to write to'),
6303 _(b'name of error log file to write to'),
6301 _(b'FILE'),
6304 _(b'FILE'),
6302 ),
6305 ),
6303 # use string type, then we can check if something was passed
6306 # use string type, then we can check if something was passed
6304 (
6307 (
6305 b'p',
6308 b'p',
6306 b'port',
6309 b'port',
6307 b'',
6310 b'',
6308 _(b'port to listen on (default: 8000)'),
6311 _(b'port to listen on (default: 8000)'),
6309 _(b'PORT'),
6312 _(b'PORT'),
6310 ),
6313 ),
6311 (
6314 (
6312 b'a',
6315 b'a',
6313 b'address',
6316 b'address',
6314 b'',
6317 b'',
6315 _(b'address to listen on (default: all interfaces)'),
6318 _(b'address to listen on (default: all interfaces)'),
6316 _(b'ADDR'),
6319 _(b'ADDR'),
6317 ),
6320 ),
6318 (
6321 (
6319 b'',
6322 b'',
6320 b'prefix',
6323 b'prefix',
6321 b'',
6324 b'',
6322 _(b'prefix path to serve from (default: server root)'),
6325 _(b'prefix path to serve from (default: server root)'),
6323 _(b'PREFIX'),
6326 _(b'PREFIX'),
6324 ),
6327 ),
6325 (
6328 (
6326 b'n',
6329 b'n',
6327 b'name',
6330 b'name',
6328 b'',
6331 b'',
6329 _(b'name to show in web pages (default: working directory)'),
6332 _(b'name to show in web pages (default: working directory)'),
6330 _(b'NAME'),
6333 _(b'NAME'),
6331 ),
6334 ),
6332 (
6335 (
6333 b'',
6336 b'',
6334 b'web-conf',
6337 b'web-conf',
6335 b'',
6338 b'',
6336 _(b"name of the hgweb config file (see 'hg help hgweb')"),
6339 _(b"name of the hgweb config file (see 'hg help hgweb')"),
6337 _(b'FILE'),
6340 _(b'FILE'),
6338 ),
6341 ),
6339 (
6342 (
6340 b'',
6343 b'',
6341 b'webdir-conf',
6344 b'webdir-conf',
6342 b'',
6345 b'',
6343 _(b'name of the hgweb config file (DEPRECATED)'),
6346 _(b'name of the hgweb config file (DEPRECATED)'),
6344 _(b'FILE'),
6347 _(b'FILE'),
6345 ),
6348 ),
6346 (
6349 (
6347 b'',
6350 b'',
6348 b'pid-file',
6351 b'pid-file',
6349 b'',
6352 b'',
6350 _(b'name of file to write process ID to'),
6353 _(b'name of file to write process ID to'),
6351 _(b'FILE'),
6354 _(b'FILE'),
6352 ),
6355 ),
6353 (b'', b'stdio', None, _(b'for remote clients (ADVANCED)')),
6356 (b'', b'stdio', None, _(b'for remote clients (ADVANCED)')),
6354 (
6357 (
6355 b'',
6358 b'',
6356 b'cmdserver',
6359 b'cmdserver',
6357 b'',
6360 b'',
6358 _(b'for remote clients (ADVANCED)'),
6361 _(b'for remote clients (ADVANCED)'),
6359 _(b'MODE'),
6362 _(b'MODE'),
6360 ),
6363 ),
6361 (b't', b'templates', b'', _(b'web templates to use'), _(b'TEMPLATE')),
6364 (b't', b'templates', b'', _(b'web templates to use'), _(b'TEMPLATE')),
6362 (b'', b'style', b'', _(b'template style to use'), _(b'STYLE')),
6365 (b'', b'style', b'', _(b'template style to use'), _(b'STYLE')),
6363 (b'6', b'ipv6', None, _(b'use IPv6 in addition to IPv4')),
6366 (b'6', b'ipv6', None, _(b'use IPv6 in addition to IPv4')),
6364 (b'', b'certificate', b'', _(b'SSL certificate file'), _(b'FILE')),
6367 (b'', b'certificate', b'', _(b'SSL certificate file'), _(b'FILE')),
6365 (b'', b'print-url', None, _(b'start and print only the URL')),
6368 (b'', b'print-url', None, _(b'start and print only the URL')),
6366 ]
6369 ]
6367 + subrepoopts,
6370 + subrepoopts,
6368 _(b'[OPTION]...'),
6371 _(b'[OPTION]...'),
6369 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
6372 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
6370 helpbasic=True,
6373 helpbasic=True,
6371 optionalrepo=True,
6374 optionalrepo=True,
6372 )
6375 )
6373 def serve(ui, repo, **opts):
6376 def serve(ui, repo, **opts):
6374 """start stand-alone webserver
6377 """start stand-alone webserver
6375
6378
6376 Start a local HTTP repository browser and pull server. You can use
6379 Start a local HTTP repository browser and pull server. You can use
6377 this for ad-hoc sharing and browsing of repositories. It is
6380 this for ad-hoc sharing and browsing of repositories. It is
6378 recommended to use a real web server to serve a repository for
6381 recommended to use a real web server to serve a repository for
6379 longer periods of time.
6382 longer periods of time.
6380
6383
6381 Please note that the server does not implement access control.
6384 Please note that the server does not implement access control.
6382 This means that, by default, anybody can read from the server and
6385 This means that, by default, anybody can read from the server and
6383 nobody can write to it by default. Set the ``web.allow-push``
6386 nobody can write to it by default. Set the ``web.allow-push``
6384 option to ``*`` to allow everybody to push to the server. You
6387 option to ``*`` to allow everybody to push to the server. You
6385 should use a real web server if you need to authenticate users.
6388 should use a real web server if you need to authenticate users.
6386
6389
6387 By default, the server logs accesses to stdout and errors to
6390 By default, the server logs accesses to stdout and errors to
6388 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
6391 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
6389 files.
6392 files.
6390
6393
6391 To have the server choose a free port number to listen on, specify
6394 To have the server choose a free port number to listen on, specify
6392 a port number of 0; in this case, the server will print the port
6395 a port number of 0; in this case, the server will print the port
6393 number it uses.
6396 number it uses.
6394
6397
6395 Returns 0 on success.
6398 Returns 0 on success.
6396 """
6399 """
6397
6400
6398 cmdutil.check_incompatible_arguments(opts, 'stdio', ['cmdserver'])
6401 cmdutil.check_incompatible_arguments(opts, 'stdio', ['cmdserver'])
6399 opts = pycompat.byteskwargs(opts)
6402 opts = pycompat.byteskwargs(opts)
6400 if opts[b"print_url"] and ui.verbose:
6403 if opts[b"print_url"] and ui.verbose:
6401 raise error.InputError(_(b"cannot use --print-url with --verbose"))
6404 raise error.InputError(_(b"cannot use --print-url with --verbose"))
6402
6405
6403 if opts[b"stdio"]:
6406 if opts[b"stdio"]:
6404 if repo is None:
6407 if repo is None:
6405 raise error.RepoError(
6408 raise error.RepoError(
6406 _(b"there is no Mercurial repository here (.hg not found)")
6409 _(b"there is no Mercurial repository here (.hg not found)")
6407 )
6410 )
6408 s = wireprotoserver.sshserver(ui, repo)
6411 s = wireprotoserver.sshserver(ui, repo)
6409 s.serve_forever()
6412 s.serve_forever()
6410 return
6413 return
6411
6414
6412 service = server.createservice(ui, repo, opts)
6415 service = server.createservice(ui, repo, opts)
6413 return server.runservice(opts, initfn=service.init, runfn=service.run)
6416 return server.runservice(opts, initfn=service.init, runfn=service.run)
6414
6417
6415
6418
6416 @command(
6419 @command(
6417 b'shelve',
6420 b'shelve',
6418 [
6421 [
6419 (
6422 (
6420 b'A',
6423 b'A',
6421 b'addremove',
6424 b'addremove',
6422 None,
6425 None,
6423 _(b'mark new/missing files as added/removed before shelving'),
6426 _(b'mark new/missing files as added/removed before shelving'),
6424 ),
6427 ),
6425 (b'u', b'unknown', None, _(b'store unknown files in the shelve')),
6428 (b'u', b'unknown', None, _(b'store unknown files in the shelve')),
6426 (b'', b'cleanup', None, _(b'delete all shelved changes')),
6429 (b'', b'cleanup', None, _(b'delete all shelved changes')),
6427 (
6430 (
6428 b'',
6431 b'',
6429 b'date',
6432 b'date',
6430 b'',
6433 b'',
6431 _(b'shelve with the specified commit date'),
6434 _(b'shelve with the specified commit date'),
6432 _(b'DATE'),
6435 _(b'DATE'),
6433 ),
6436 ),
6434 (b'd', b'delete', None, _(b'delete the named shelved change(s)')),
6437 (b'd', b'delete', None, _(b'delete the named shelved change(s)')),
6435 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
6438 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
6436 (
6439 (
6437 b'k',
6440 b'k',
6438 b'keep',
6441 b'keep',
6439 False,
6442 False,
6440 _(b'shelve, but keep changes in the working directory'),
6443 _(b'shelve, but keep changes in the working directory'),
6441 ),
6444 ),
6442 (b'l', b'list', None, _(b'list current shelves')),
6445 (b'l', b'list', None, _(b'list current shelves')),
6443 (b'm', b'message', b'', _(b'use text as shelve message'), _(b'TEXT')),
6446 (b'm', b'message', b'', _(b'use text as shelve message'), _(b'TEXT')),
6444 (
6447 (
6445 b'n',
6448 b'n',
6446 b'name',
6449 b'name',
6447 b'',
6450 b'',
6448 _(b'use the given name for the shelved commit'),
6451 _(b'use the given name for the shelved commit'),
6449 _(b'NAME'),
6452 _(b'NAME'),
6450 ),
6453 ),
6451 (
6454 (
6452 b'p',
6455 b'p',
6453 b'patch',
6456 b'patch',
6454 None,
6457 None,
6455 _(
6458 _(
6456 b'output patches for changes (provide the names of the shelved '
6459 b'output patches for changes (provide the names of the shelved '
6457 b'changes as positional arguments)'
6460 b'changes as positional arguments)'
6458 ),
6461 ),
6459 ),
6462 ),
6460 (b'i', b'interactive', None, _(b'interactive mode')),
6463 (b'i', b'interactive', None, _(b'interactive mode')),
6461 (
6464 (
6462 b'',
6465 b'',
6463 b'stat',
6466 b'stat',
6464 None,
6467 None,
6465 _(
6468 _(
6466 b'output diffstat-style summary of changes (provide the names of '
6469 b'output diffstat-style summary of changes (provide the names of '
6467 b'the shelved changes as positional arguments)'
6470 b'the shelved changes as positional arguments)'
6468 ),
6471 ),
6469 ),
6472 ),
6470 ]
6473 ]
6471 + cmdutil.walkopts,
6474 + cmdutil.walkopts,
6472 _(b'hg shelve [OPTION]... [FILE]...'),
6475 _(b'hg shelve [OPTION]... [FILE]...'),
6473 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6476 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6474 )
6477 )
6475 def shelve(ui, repo, *pats, **opts):
6478 def shelve(ui, repo, *pats, **opts):
6476 """save and set aside changes from the working directory
6479 """save and set aside changes from the working directory
6477
6480
6478 Shelving takes files that "hg status" reports as not clean, saves
6481 Shelving takes files that "hg status" reports as not clean, saves
6479 the modifications to a bundle (a shelved change), and reverts the
6482 the modifications to a bundle (a shelved change), and reverts the
6480 files so that their state in the working directory becomes clean.
6483 files so that their state in the working directory becomes clean.
6481
6484
6482 To restore these changes to the working directory, using "hg
6485 To restore these changes to the working directory, using "hg
6483 unshelve"; this will work even if you switch to a different
6486 unshelve"; this will work even if you switch to a different
6484 commit.
6487 commit.
6485
6488
6486 When no files are specified, "hg shelve" saves all not-clean
6489 When no files are specified, "hg shelve" saves all not-clean
6487 files. If specific files or directories are named, only changes to
6490 files. If specific files or directories are named, only changes to
6488 those files are shelved.
6491 those files are shelved.
6489
6492
6490 In bare shelve (when no files are specified, without interactive,
6493 In bare shelve (when no files are specified, without interactive,
6491 include and exclude option), shelving remembers information if the
6494 include and exclude option), shelving remembers information if the
6492 working directory was on newly created branch, in other words working
6495 working directory was on newly created branch, in other words working
6493 directory was on different branch than its first parent. In this
6496 directory was on different branch than its first parent. In this
6494 situation unshelving restores branch information to the working directory.
6497 situation unshelving restores branch information to the working directory.
6495
6498
6496 Each shelved change has a name that makes it easier to find later.
6499 Each shelved change has a name that makes it easier to find later.
6497 The name of a shelved change defaults to being based on the active
6500 The name of a shelved change defaults to being based on the active
6498 bookmark, or if there is no active bookmark, the current named
6501 bookmark, or if there is no active bookmark, the current named
6499 branch. To specify a different name, use ``--name``.
6502 branch. To specify a different name, use ``--name``.
6500
6503
6501 To see a list of existing shelved changes, use the ``--list``
6504 To see a list of existing shelved changes, use the ``--list``
6502 option. For each shelved change, this will print its name, age,
6505 option. For each shelved change, this will print its name, age,
6503 and description; use ``--patch`` or ``--stat`` for more details.
6506 and description; use ``--patch`` or ``--stat`` for more details.
6504
6507
6505 To delete specific shelved changes, use ``--delete``. To delete
6508 To delete specific shelved changes, use ``--delete``. To delete
6506 all shelved changes, use ``--cleanup``.
6509 all shelved changes, use ``--cleanup``.
6507 """
6510 """
6508 opts = pycompat.byteskwargs(opts)
6511 opts = pycompat.byteskwargs(opts)
6509 allowables = [
6512 allowables = [
6510 (b'addremove', {b'create'}), # 'create' is pseudo action
6513 (b'addremove', {b'create'}), # 'create' is pseudo action
6511 (b'unknown', {b'create'}),
6514 (b'unknown', {b'create'}),
6512 (b'cleanup', {b'cleanup'}),
6515 (b'cleanup', {b'cleanup'}),
6513 # ('date', {'create'}), # ignored for passing '--date "0 0"' in tests
6516 # ('date', {'create'}), # ignored for passing '--date "0 0"' in tests
6514 (b'delete', {b'delete'}),
6517 (b'delete', {b'delete'}),
6515 (b'edit', {b'create'}),
6518 (b'edit', {b'create'}),
6516 (b'keep', {b'create'}),
6519 (b'keep', {b'create'}),
6517 (b'list', {b'list'}),
6520 (b'list', {b'list'}),
6518 (b'message', {b'create'}),
6521 (b'message', {b'create'}),
6519 (b'name', {b'create'}),
6522 (b'name', {b'create'}),
6520 (b'patch', {b'patch', b'list'}),
6523 (b'patch', {b'patch', b'list'}),
6521 (b'stat', {b'stat', b'list'}),
6524 (b'stat', {b'stat', b'list'}),
6522 ]
6525 ]
6523
6526
6524 def checkopt(opt):
6527 def checkopt(opt):
6525 if opts.get(opt):
6528 if opts.get(opt):
6526 for i, allowable in allowables:
6529 for i, allowable in allowables:
6527 if opts[i] and opt not in allowable:
6530 if opts[i] and opt not in allowable:
6528 raise error.InputError(
6531 raise error.InputError(
6529 _(
6532 _(
6530 b"options '--%s' and '--%s' may not be "
6533 b"options '--%s' and '--%s' may not be "
6531 b"used together"
6534 b"used together"
6532 )
6535 )
6533 % (opt, i)
6536 % (opt, i)
6534 )
6537 )
6535 return True
6538 return True
6536
6539
6537 if checkopt(b'cleanup'):
6540 if checkopt(b'cleanup'):
6538 if pats:
6541 if pats:
6539 raise error.InputError(
6542 raise error.InputError(
6540 _(b"cannot specify names when using '--cleanup'")
6543 _(b"cannot specify names when using '--cleanup'")
6541 )
6544 )
6542 return shelvemod.cleanupcmd(ui, repo)
6545 return shelvemod.cleanupcmd(ui, repo)
6543 elif checkopt(b'delete'):
6546 elif checkopt(b'delete'):
6544 return shelvemod.deletecmd(ui, repo, pats)
6547 return shelvemod.deletecmd(ui, repo, pats)
6545 elif checkopt(b'list'):
6548 elif checkopt(b'list'):
6546 return shelvemod.listcmd(ui, repo, pats, opts)
6549 return shelvemod.listcmd(ui, repo, pats, opts)
6547 elif checkopt(b'patch') or checkopt(b'stat'):
6550 elif checkopt(b'patch') or checkopt(b'stat'):
6548 return shelvemod.patchcmds(ui, repo, pats, opts)
6551 return shelvemod.patchcmds(ui, repo, pats, opts)
6549 else:
6552 else:
6550 return shelvemod.createcmd(ui, repo, pats, opts)
6553 return shelvemod.createcmd(ui, repo, pats, opts)
6551
6554
6552
6555
6553 _NOTTERSE = b'nothing'
6556 _NOTTERSE = b'nothing'
6554
6557
6555
6558
6556 @command(
6559 @command(
6557 b'status|st',
6560 b'status|st',
6558 [
6561 [
6559 (b'A', b'all', None, _(b'show status of all files')),
6562 (b'A', b'all', None, _(b'show status of all files')),
6560 (b'm', b'modified', None, _(b'show only modified files')),
6563 (b'm', b'modified', None, _(b'show only modified files')),
6561 (b'a', b'added', None, _(b'show only added files')),
6564 (b'a', b'added', None, _(b'show only added files')),
6562 (b'r', b'removed', None, _(b'show only removed files')),
6565 (b'r', b'removed', None, _(b'show only removed files')),
6563 (b'd', b'deleted', None, _(b'show only missing files')),
6566 (b'd', b'deleted', None, _(b'show only missing files')),
6564 (b'c', b'clean', None, _(b'show only files without changes')),
6567 (b'c', b'clean', None, _(b'show only files without changes')),
6565 (b'u', b'unknown', None, _(b'show only unknown (not tracked) files')),
6568 (b'u', b'unknown', None, _(b'show only unknown (not tracked) files')),
6566 (b'i', b'ignored', None, _(b'show only ignored files')),
6569 (b'i', b'ignored', None, _(b'show only ignored files')),
6567 (b'n', b'no-status', None, _(b'hide status prefix')),
6570 (b'n', b'no-status', None, _(b'hide status prefix')),
6568 (b't', b'terse', _NOTTERSE, _(b'show the terse output (EXPERIMENTAL)')),
6571 (b't', b'terse', _NOTTERSE, _(b'show the terse output (EXPERIMENTAL)')),
6569 (
6572 (
6570 b'C',
6573 b'C',
6571 b'copies',
6574 b'copies',
6572 None,
6575 None,
6573 _(b'show source of copied files (DEFAULT: ui.statuscopies)'),
6576 _(b'show source of copied files (DEFAULT: ui.statuscopies)'),
6574 ),
6577 ),
6575 (
6578 (
6576 b'0',
6579 b'0',
6577 b'print0',
6580 b'print0',
6578 None,
6581 None,
6579 _(b'end filenames with NUL, for use with xargs'),
6582 _(b'end filenames with NUL, for use with xargs'),
6580 ),
6583 ),
6581 (b'', b'rev', [], _(b'show difference from revision'), _(b'REV')),
6584 (b'', b'rev', [], _(b'show difference from revision'), _(b'REV')),
6582 (
6585 (
6583 b'',
6586 b'',
6584 b'change',
6587 b'change',
6585 b'',
6588 b'',
6586 _(b'list the changed files of a revision'),
6589 _(b'list the changed files of a revision'),
6587 _(b'REV'),
6590 _(b'REV'),
6588 ),
6591 ),
6589 ]
6592 ]
6590 + walkopts
6593 + walkopts
6591 + subrepoopts
6594 + subrepoopts
6592 + formatteropts,
6595 + formatteropts,
6593 _(b'[OPTION]... [FILE]...'),
6596 _(b'[OPTION]... [FILE]...'),
6594 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6597 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6595 helpbasic=True,
6598 helpbasic=True,
6596 inferrepo=True,
6599 inferrepo=True,
6597 intents={INTENT_READONLY},
6600 intents={INTENT_READONLY},
6598 )
6601 )
6599 def status(ui, repo, *pats, **opts):
6602 def status(ui, repo, *pats, **opts):
6600 """show changed files in the working directory
6603 """show changed files in the working directory
6601
6604
6602 Show status of files in the repository. If names are given, only
6605 Show status of files in the repository. If names are given, only
6603 files that match are shown. Files that are clean or ignored or
6606 files that match are shown. Files that are clean or ignored or
6604 the source of a copy/move operation, are not listed unless
6607 the source of a copy/move operation, are not listed unless
6605 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
6608 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
6606 Unless options described with "show only ..." are given, the
6609 Unless options described with "show only ..." are given, the
6607 options -mardu are used.
6610 options -mardu are used.
6608
6611
6609 Option -q/--quiet hides untracked (unknown and ignored) files
6612 Option -q/--quiet hides untracked (unknown and ignored) files
6610 unless explicitly requested with -u/--unknown or -i/--ignored.
6613 unless explicitly requested with -u/--unknown or -i/--ignored.
6611
6614
6612 .. note::
6615 .. note::
6613
6616
6614 :hg:`status` may appear to disagree with diff if permissions have
6617 :hg:`status` may appear to disagree with diff if permissions have
6615 changed or a merge has occurred. The standard diff format does
6618 changed or a merge has occurred. The standard diff format does
6616 not report permission changes and diff only reports changes
6619 not report permission changes and diff only reports changes
6617 relative to one merge parent.
6620 relative to one merge parent.
6618
6621
6619 If one revision is given, it is used as the base revision.
6622 If one revision is given, it is used as the base revision.
6620 If two revisions are given, the differences between them are
6623 If two revisions are given, the differences between them are
6621 shown. The --change option can also be used as a shortcut to list
6624 shown. The --change option can also be used as a shortcut to list
6622 the changed files of a revision from its first parent.
6625 the changed files of a revision from its first parent.
6623
6626
6624 The codes used to show the status of files are::
6627 The codes used to show the status of files are::
6625
6628
6626 M = modified
6629 M = modified
6627 A = added
6630 A = added
6628 R = removed
6631 R = removed
6629 C = clean
6632 C = clean
6630 ! = missing (deleted by non-hg command, but still tracked)
6633 ! = missing (deleted by non-hg command, but still tracked)
6631 ? = not tracked
6634 ? = not tracked
6632 I = ignored
6635 I = ignored
6633 = origin of the previous file (with --copies)
6636 = origin of the previous file (with --copies)
6634
6637
6635 .. container:: verbose
6638 .. container:: verbose
6636
6639
6637 The -t/--terse option abbreviates the output by showing only the directory
6640 The -t/--terse option abbreviates the output by showing only the directory
6638 name if all the files in it share the same status. The option takes an
6641 name if all the files in it share the same status. The option takes an
6639 argument indicating the statuses to abbreviate: 'm' for 'modified', 'a'
6642 argument indicating the statuses to abbreviate: 'm' for 'modified', 'a'
6640 for 'added', 'r' for 'removed', 'd' for 'deleted', 'u' for 'unknown', 'i'
6643 for 'added', 'r' for 'removed', 'd' for 'deleted', 'u' for 'unknown', 'i'
6641 for 'ignored' and 'c' for clean.
6644 for 'ignored' and 'c' for clean.
6642
6645
6643 It abbreviates only those statuses which are passed. Note that clean and
6646 It abbreviates only those statuses which are passed. Note that clean and
6644 ignored files are not displayed with '--terse ic' unless the -c/--clean
6647 ignored files are not displayed with '--terse ic' unless the -c/--clean
6645 and -i/--ignored options are also used.
6648 and -i/--ignored options are also used.
6646
6649
6647 The -v/--verbose option shows information when the repository is in an
6650 The -v/--verbose option shows information when the repository is in an
6648 unfinished merge, shelve, rebase state etc. You can have this behavior
6651 unfinished merge, shelve, rebase state etc. You can have this behavior
6649 turned on by default by enabling the ``commands.status.verbose`` option.
6652 turned on by default by enabling the ``commands.status.verbose`` option.
6650
6653
6651 You can skip displaying some of these states by setting
6654 You can skip displaying some of these states by setting
6652 ``commands.status.skipstates`` to one or more of: 'bisect', 'graft',
6655 ``commands.status.skipstates`` to one or more of: 'bisect', 'graft',
6653 'histedit', 'merge', 'rebase', or 'unshelve'.
6656 'histedit', 'merge', 'rebase', or 'unshelve'.
6654
6657
6655 Template:
6658 Template:
6656
6659
6657 The following keywords are supported in addition to the common template
6660 The following keywords are supported in addition to the common template
6658 keywords and functions. See also :hg:`help templates`.
6661 keywords and functions. See also :hg:`help templates`.
6659
6662
6660 :path: String. Repository-absolute path of the file.
6663 :path: String. Repository-absolute path of the file.
6661 :source: String. Repository-absolute path of the file originated from.
6664 :source: String. Repository-absolute path of the file originated from.
6662 Available if ``--copies`` is specified.
6665 Available if ``--copies`` is specified.
6663 :status: String. Character denoting file's status.
6666 :status: String. Character denoting file's status.
6664
6667
6665 Examples:
6668 Examples:
6666
6669
6667 - show changes in the working directory relative to a
6670 - show changes in the working directory relative to a
6668 changeset::
6671 changeset::
6669
6672
6670 hg status --rev 9353
6673 hg status --rev 9353
6671
6674
6672 - show changes in the working directory relative to the
6675 - show changes in the working directory relative to the
6673 current directory (see :hg:`help patterns` for more information)::
6676 current directory (see :hg:`help patterns` for more information)::
6674
6677
6675 hg status re:
6678 hg status re:
6676
6679
6677 - show all changes including copies in an existing changeset::
6680 - show all changes including copies in an existing changeset::
6678
6681
6679 hg status --copies --change 9353
6682 hg status --copies --change 9353
6680
6683
6681 - get a NUL separated list of added files, suitable for xargs::
6684 - get a NUL separated list of added files, suitable for xargs::
6682
6685
6683 hg status -an0
6686 hg status -an0
6684
6687
6685 - show more information about the repository status, abbreviating
6688 - show more information about the repository status, abbreviating
6686 added, removed, modified, deleted, and untracked paths::
6689 added, removed, modified, deleted, and untracked paths::
6687
6690
6688 hg status -v -t mardu
6691 hg status -v -t mardu
6689
6692
6690 Returns 0 on success.
6693 Returns 0 on success.
6691
6694
6692 """
6695 """
6693
6696
6694 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
6697 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
6695 opts = pycompat.byteskwargs(opts)
6698 opts = pycompat.byteskwargs(opts)
6696 revs = opts.get(b'rev')
6699 revs = opts.get(b'rev')
6697 change = opts.get(b'change')
6700 change = opts.get(b'change')
6698 terse = opts.get(b'terse')
6701 terse = opts.get(b'terse')
6699 if terse is _NOTTERSE:
6702 if terse is _NOTTERSE:
6700 if revs:
6703 if revs:
6701 terse = b''
6704 terse = b''
6702 else:
6705 else:
6703 terse = ui.config(b'commands', b'status.terse')
6706 terse = ui.config(b'commands', b'status.terse')
6704
6707
6705 if revs and terse:
6708 if revs and terse:
6706 msg = _(b'cannot use --terse with --rev')
6709 msg = _(b'cannot use --terse with --rev')
6707 raise error.InputError(msg)
6710 raise error.InputError(msg)
6708 elif change:
6711 elif change:
6709 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
6712 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
6710 ctx2 = scmutil.revsingle(repo, change, None)
6713 ctx2 = scmutil.revsingle(repo, change, None)
6711 ctx1 = ctx2.p1()
6714 ctx1 = ctx2.p1()
6712 else:
6715 else:
6713 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
6716 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
6714 ctx1, ctx2 = scmutil.revpair(repo, revs)
6717 ctx1, ctx2 = scmutil.revpair(repo, revs)
6715
6718
6716 forcerelativevalue = None
6719 forcerelativevalue = None
6717 if ui.hasconfig(b'commands', b'status.relative'):
6720 if ui.hasconfig(b'commands', b'status.relative'):
6718 forcerelativevalue = ui.configbool(b'commands', b'status.relative')
6721 forcerelativevalue = ui.configbool(b'commands', b'status.relative')
6719 uipathfn = scmutil.getuipathfn(
6722 uipathfn = scmutil.getuipathfn(
6720 repo,
6723 repo,
6721 legacyrelativevalue=bool(pats),
6724 legacyrelativevalue=bool(pats),
6722 forcerelativevalue=forcerelativevalue,
6725 forcerelativevalue=forcerelativevalue,
6723 )
6726 )
6724
6727
6725 if opts.get(b'print0'):
6728 if opts.get(b'print0'):
6726 end = b'\0'
6729 end = b'\0'
6727 else:
6730 else:
6728 end = b'\n'
6731 end = b'\n'
6729 states = b'modified added removed deleted unknown ignored clean'.split()
6732 states = b'modified added removed deleted unknown ignored clean'.split()
6730 show = [k for k in states if opts.get(k)]
6733 show = [k for k in states if opts.get(k)]
6731 if opts.get(b'all'):
6734 if opts.get(b'all'):
6732 show += ui.quiet and (states[:4] + [b'clean']) or states
6735 show += ui.quiet and (states[:4] + [b'clean']) or states
6733
6736
6734 if not show:
6737 if not show:
6735 if ui.quiet:
6738 if ui.quiet:
6736 show = states[:4]
6739 show = states[:4]
6737 else:
6740 else:
6738 show = states[:5]
6741 show = states[:5]
6739
6742
6740 m = scmutil.match(ctx2, pats, opts)
6743 m = scmutil.match(ctx2, pats, opts)
6741 if terse:
6744 if terse:
6742 # we need to compute clean and unknown to terse
6745 # we need to compute clean and unknown to terse
6743 stat = repo.status(
6746 stat = repo.status(
6744 ctx1.node(),
6747 ctx1.node(),
6745 ctx2.node(),
6748 ctx2.node(),
6746 m,
6749 m,
6747 b'ignored' in show or b'i' in terse,
6750 b'ignored' in show or b'i' in terse,
6748 clean=True,
6751 clean=True,
6749 unknown=True,
6752 unknown=True,
6750 listsubrepos=opts.get(b'subrepos'),
6753 listsubrepos=opts.get(b'subrepos'),
6751 )
6754 )
6752
6755
6753 stat = cmdutil.tersedir(stat, terse)
6756 stat = cmdutil.tersedir(stat, terse)
6754 else:
6757 else:
6755 stat = repo.status(
6758 stat = repo.status(
6756 ctx1.node(),
6759 ctx1.node(),
6757 ctx2.node(),
6760 ctx2.node(),
6758 m,
6761 m,
6759 b'ignored' in show,
6762 b'ignored' in show,
6760 b'clean' in show,
6763 b'clean' in show,
6761 b'unknown' in show,
6764 b'unknown' in show,
6762 opts.get(b'subrepos'),
6765 opts.get(b'subrepos'),
6763 )
6766 )
6764
6767
6765 changestates = zip(
6768 changestates = zip(
6766 states,
6769 states,
6767 pycompat.iterbytestr(b'MAR!?IC'),
6770 pycompat.iterbytestr(b'MAR!?IC'),
6768 [getattr(stat, s.decode('utf8')) for s in states],
6771 [getattr(stat, s.decode('utf8')) for s in states],
6769 )
6772 )
6770
6773
6771 copy = {}
6774 copy = {}
6772 if (
6775 if (
6773 opts.get(b'all')
6776 opts.get(b'all')
6774 or opts.get(b'copies')
6777 or opts.get(b'copies')
6775 or ui.configbool(b'ui', b'statuscopies')
6778 or ui.configbool(b'ui', b'statuscopies')
6776 ) and not opts.get(b'no_status'):
6779 ) and not opts.get(b'no_status'):
6777 copy = copies.pathcopies(ctx1, ctx2, m)
6780 copy = copies.pathcopies(ctx1, ctx2, m)
6778
6781
6779 morestatus = None
6782 morestatus = None
6780 if (
6783 if (
6781 (ui.verbose or ui.configbool(b'commands', b'status.verbose'))
6784 (ui.verbose or ui.configbool(b'commands', b'status.verbose'))
6782 and not ui.plain()
6785 and not ui.plain()
6783 and not opts.get(b'print0')
6786 and not opts.get(b'print0')
6784 ):
6787 ):
6785 morestatus = cmdutil.readmorestatus(repo)
6788 morestatus = cmdutil.readmorestatus(repo)
6786
6789
6787 ui.pager(b'status')
6790 ui.pager(b'status')
6788 fm = ui.formatter(b'status', opts)
6791 fm = ui.formatter(b'status', opts)
6789 fmt = b'%s' + end
6792 fmt = b'%s' + end
6790 showchar = not opts.get(b'no_status')
6793 showchar = not opts.get(b'no_status')
6791
6794
6792 for state, char, files in changestates:
6795 for state, char, files in changestates:
6793 if state in show:
6796 if state in show:
6794 label = b'status.' + state
6797 label = b'status.' + state
6795 for f in files:
6798 for f in files:
6796 fm.startitem()
6799 fm.startitem()
6797 fm.context(ctx=ctx2)
6800 fm.context(ctx=ctx2)
6798 fm.data(itemtype=b'file', path=f)
6801 fm.data(itemtype=b'file', path=f)
6799 fm.condwrite(showchar, b'status', b'%s ', char, label=label)
6802 fm.condwrite(showchar, b'status', b'%s ', char, label=label)
6800 fm.plain(fmt % uipathfn(f), label=label)
6803 fm.plain(fmt % uipathfn(f), label=label)
6801 if f in copy:
6804 if f in copy:
6802 fm.data(source=copy[f])
6805 fm.data(source=copy[f])
6803 fm.plain(
6806 fm.plain(
6804 (b' %s' + end) % uipathfn(copy[f]),
6807 (b' %s' + end) % uipathfn(copy[f]),
6805 label=b'status.copied',
6808 label=b'status.copied',
6806 )
6809 )
6807 if morestatus:
6810 if morestatus:
6808 morestatus.formatfile(f, fm)
6811 morestatus.formatfile(f, fm)
6809
6812
6810 if morestatus:
6813 if morestatus:
6811 morestatus.formatfooter(fm)
6814 morestatus.formatfooter(fm)
6812 fm.end()
6815 fm.end()
6813
6816
6814
6817
6815 @command(
6818 @command(
6816 b'summary|sum',
6819 b'summary|sum',
6817 [(b'', b'remote', None, _(b'check for push and pull'))],
6820 [(b'', b'remote', None, _(b'check for push and pull'))],
6818 b'[--remote]',
6821 b'[--remote]',
6819 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6822 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6820 helpbasic=True,
6823 helpbasic=True,
6821 intents={INTENT_READONLY},
6824 intents={INTENT_READONLY},
6822 )
6825 )
6823 def summary(ui, repo, **opts):
6826 def summary(ui, repo, **opts):
6824 """summarize working directory state
6827 """summarize working directory state
6825
6828
6826 This generates a brief summary of the working directory state,
6829 This generates a brief summary of the working directory state,
6827 including parents, branch, commit status, phase and available updates.
6830 including parents, branch, commit status, phase and available updates.
6828
6831
6829 With the --remote option, this will check the default paths for
6832 With the --remote option, this will check the default paths for
6830 incoming and outgoing changes. This can be time-consuming.
6833 incoming and outgoing changes. This can be time-consuming.
6831
6834
6832 Returns 0 on success.
6835 Returns 0 on success.
6833 """
6836 """
6834
6837
6835 opts = pycompat.byteskwargs(opts)
6838 opts = pycompat.byteskwargs(opts)
6836 ui.pager(b'summary')
6839 ui.pager(b'summary')
6837 ctx = repo[None]
6840 ctx = repo[None]
6838 parents = ctx.parents()
6841 parents = ctx.parents()
6839 pnode = parents[0].node()
6842 pnode = parents[0].node()
6840 marks = []
6843 marks = []
6841
6844
6842 try:
6845 try:
6843 ms = mergestatemod.mergestate.read(repo)
6846 ms = mergestatemod.mergestate.read(repo)
6844 except error.UnsupportedMergeRecords as e:
6847 except error.UnsupportedMergeRecords as e:
6845 s = b' '.join(e.recordtypes)
6848 s = b' '.join(e.recordtypes)
6846 ui.warn(
6849 ui.warn(
6847 _(b'warning: merge state has unsupported record types: %s\n') % s
6850 _(b'warning: merge state has unsupported record types: %s\n') % s
6848 )
6851 )
6849 unresolved = []
6852 unresolved = []
6850 else:
6853 else:
6851 unresolved = list(ms.unresolved())
6854 unresolved = list(ms.unresolved())
6852
6855
6853 for p in parents:
6856 for p in parents:
6854 # label with log.changeset (instead of log.parent) since this
6857 # label with log.changeset (instead of log.parent) since this
6855 # shows a working directory parent *changeset*:
6858 # shows a working directory parent *changeset*:
6856 # i18n: column positioning for "hg summary"
6859 # i18n: column positioning for "hg summary"
6857 ui.write(
6860 ui.write(
6858 _(b'parent: %d:%s ') % (p.rev(), p),
6861 _(b'parent: %d:%s ') % (p.rev(), p),
6859 label=logcmdutil.changesetlabels(p),
6862 label=logcmdutil.changesetlabels(p),
6860 )
6863 )
6861 ui.write(b' '.join(p.tags()), label=b'log.tag')
6864 ui.write(b' '.join(p.tags()), label=b'log.tag')
6862 if p.bookmarks():
6865 if p.bookmarks():
6863 marks.extend(p.bookmarks())
6866 marks.extend(p.bookmarks())
6864 if p.rev() == -1:
6867 if p.rev() == -1:
6865 if not len(repo):
6868 if not len(repo):
6866 ui.write(_(b' (empty repository)'))
6869 ui.write(_(b' (empty repository)'))
6867 else:
6870 else:
6868 ui.write(_(b' (no revision checked out)'))
6871 ui.write(_(b' (no revision checked out)'))
6869 if p.obsolete():
6872 if p.obsolete():
6870 ui.write(_(b' (obsolete)'))
6873 ui.write(_(b' (obsolete)'))
6871 if p.isunstable():
6874 if p.isunstable():
6872 instabilities = (
6875 instabilities = (
6873 ui.label(instability, b'trouble.%s' % instability)
6876 ui.label(instability, b'trouble.%s' % instability)
6874 for instability in p.instabilities()
6877 for instability in p.instabilities()
6875 )
6878 )
6876 ui.write(b' (' + b', '.join(instabilities) + b')')
6879 ui.write(b' (' + b', '.join(instabilities) + b')')
6877 ui.write(b'\n')
6880 ui.write(b'\n')
6878 if p.description():
6881 if p.description():
6879 ui.status(
6882 ui.status(
6880 b' ' + p.description().splitlines()[0].strip() + b'\n',
6883 b' ' + p.description().splitlines()[0].strip() + b'\n',
6881 label=b'log.summary',
6884 label=b'log.summary',
6882 )
6885 )
6883
6886
6884 branch = ctx.branch()
6887 branch = ctx.branch()
6885 bheads = repo.branchheads(branch)
6888 bheads = repo.branchheads(branch)
6886 # i18n: column positioning for "hg summary"
6889 # i18n: column positioning for "hg summary"
6887 m = _(b'branch: %s\n') % branch
6890 m = _(b'branch: %s\n') % branch
6888 if branch != b'default':
6891 if branch != b'default':
6889 ui.write(m, label=b'log.branch')
6892 ui.write(m, label=b'log.branch')
6890 else:
6893 else:
6891 ui.status(m, label=b'log.branch')
6894 ui.status(m, label=b'log.branch')
6892
6895
6893 if marks:
6896 if marks:
6894 active = repo._activebookmark
6897 active = repo._activebookmark
6895 # i18n: column positioning for "hg summary"
6898 # i18n: column positioning for "hg summary"
6896 ui.write(_(b'bookmarks:'), label=b'log.bookmark')
6899 ui.write(_(b'bookmarks:'), label=b'log.bookmark')
6897 if active is not None:
6900 if active is not None:
6898 if active in marks:
6901 if active in marks:
6899 ui.write(b' *' + active, label=bookmarks.activebookmarklabel)
6902 ui.write(b' *' + active, label=bookmarks.activebookmarklabel)
6900 marks.remove(active)
6903 marks.remove(active)
6901 else:
6904 else:
6902 ui.write(b' [%s]' % active, label=bookmarks.activebookmarklabel)
6905 ui.write(b' [%s]' % active, label=bookmarks.activebookmarklabel)
6903 for m in marks:
6906 for m in marks:
6904 ui.write(b' ' + m, label=b'log.bookmark')
6907 ui.write(b' ' + m, label=b'log.bookmark')
6905 ui.write(b'\n', label=b'log.bookmark')
6908 ui.write(b'\n', label=b'log.bookmark')
6906
6909
6907 status = repo.status(unknown=True)
6910 status = repo.status(unknown=True)
6908
6911
6909 c = repo.dirstate.copies()
6912 c = repo.dirstate.copies()
6910 copied, renamed = [], []
6913 copied, renamed = [], []
6911 for d, s in pycompat.iteritems(c):
6914 for d, s in pycompat.iteritems(c):
6912 if s in status.removed:
6915 if s in status.removed:
6913 status.removed.remove(s)
6916 status.removed.remove(s)
6914 renamed.append(d)
6917 renamed.append(d)
6915 else:
6918 else:
6916 copied.append(d)
6919 copied.append(d)
6917 if d in status.added:
6920 if d in status.added:
6918 status.added.remove(d)
6921 status.added.remove(d)
6919
6922
6920 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
6923 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
6921
6924
6922 labels = [
6925 labels = [
6923 (ui.label(_(b'%d modified'), b'status.modified'), status.modified),
6926 (ui.label(_(b'%d modified'), b'status.modified'), status.modified),
6924 (ui.label(_(b'%d added'), b'status.added'), status.added),
6927 (ui.label(_(b'%d added'), b'status.added'), status.added),
6925 (ui.label(_(b'%d removed'), b'status.removed'), status.removed),
6928 (ui.label(_(b'%d removed'), b'status.removed'), status.removed),
6926 (ui.label(_(b'%d renamed'), b'status.copied'), renamed),
6929 (ui.label(_(b'%d renamed'), b'status.copied'), renamed),
6927 (ui.label(_(b'%d copied'), b'status.copied'), copied),
6930 (ui.label(_(b'%d copied'), b'status.copied'), copied),
6928 (ui.label(_(b'%d deleted'), b'status.deleted'), status.deleted),
6931 (ui.label(_(b'%d deleted'), b'status.deleted'), status.deleted),
6929 (ui.label(_(b'%d unknown'), b'status.unknown'), status.unknown),
6932 (ui.label(_(b'%d unknown'), b'status.unknown'), status.unknown),
6930 (ui.label(_(b'%d unresolved'), b'resolve.unresolved'), unresolved),
6933 (ui.label(_(b'%d unresolved'), b'resolve.unresolved'), unresolved),
6931 (ui.label(_(b'%d subrepos'), b'status.modified'), subs),
6934 (ui.label(_(b'%d subrepos'), b'status.modified'), subs),
6932 ]
6935 ]
6933 t = []
6936 t = []
6934 for l, s in labels:
6937 for l, s in labels:
6935 if s:
6938 if s:
6936 t.append(l % len(s))
6939 t.append(l % len(s))
6937
6940
6938 t = b', '.join(t)
6941 t = b', '.join(t)
6939 cleanworkdir = False
6942 cleanworkdir = False
6940
6943
6941 if repo.vfs.exists(b'graftstate'):
6944 if repo.vfs.exists(b'graftstate'):
6942 t += _(b' (graft in progress)')
6945 t += _(b' (graft in progress)')
6943 if repo.vfs.exists(b'updatestate'):
6946 if repo.vfs.exists(b'updatestate'):
6944 t += _(b' (interrupted update)')
6947 t += _(b' (interrupted update)')
6945 elif len(parents) > 1:
6948 elif len(parents) > 1:
6946 t += _(b' (merge)')
6949 t += _(b' (merge)')
6947 elif branch != parents[0].branch():
6950 elif branch != parents[0].branch():
6948 t += _(b' (new branch)')
6951 t += _(b' (new branch)')
6949 elif parents[0].closesbranch() and pnode in repo.branchheads(
6952 elif parents[0].closesbranch() and pnode in repo.branchheads(
6950 branch, closed=True
6953 branch, closed=True
6951 ):
6954 ):
6952 t += _(b' (head closed)')
6955 t += _(b' (head closed)')
6953 elif not (
6956 elif not (
6954 status.modified
6957 status.modified
6955 or status.added
6958 or status.added
6956 or status.removed
6959 or status.removed
6957 or renamed
6960 or renamed
6958 or copied
6961 or copied
6959 or subs
6962 or subs
6960 ):
6963 ):
6961 t += _(b' (clean)')
6964 t += _(b' (clean)')
6962 cleanworkdir = True
6965 cleanworkdir = True
6963 elif pnode not in bheads:
6966 elif pnode not in bheads:
6964 t += _(b' (new branch head)')
6967 t += _(b' (new branch head)')
6965
6968
6966 if parents:
6969 if parents:
6967 pendingphase = max(p.phase() for p in parents)
6970 pendingphase = max(p.phase() for p in parents)
6968 else:
6971 else:
6969 pendingphase = phases.public
6972 pendingphase = phases.public
6970
6973
6971 if pendingphase > phases.newcommitphase(ui):
6974 if pendingphase > phases.newcommitphase(ui):
6972 t += b' (%s)' % phases.phasenames[pendingphase]
6975 t += b' (%s)' % phases.phasenames[pendingphase]
6973
6976
6974 if cleanworkdir:
6977 if cleanworkdir:
6975 # i18n: column positioning for "hg summary"
6978 # i18n: column positioning for "hg summary"
6976 ui.status(_(b'commit: %s\n') % t.strip())
6979 ui.status(_(b'commit: %s\n') % t.strip())
6977 else:
6980 else:
6978 # i18n: column positioning for "hg summary"
6981 # i18n: column positioning for "hg summary"
6979 ui.write(_(b'commit: %s\n') % t.strip())
6982 ui.write(_(b'commit: %s\n') % t.strip())
6980
6983
6981 # all ancestors of branch heads - all ancestors of parent = new csets
6984 # all ancestors of branch heads - all ancestors of parent = new csets
6982 new = len(
6985 new = len(
6983 repo.changelog.findmissing([pctx.node() for pctx in parents], bheads)
6986 repo.changelog.findmissing([pctx.node() for pctx in parents], bheads)
6984 )
6987 )
6985
6988
6986 if new == 0:
6989 if new == 0:
6987 # i18n: column positioning for "hg summary"
6990 # i18n: column positioning for "hg summary"
6988 ui.status(_(b'update: (current)\n'))
6991 ui.status(_(b'update: (current)\n'))
6989 elif pnode not in bheads:
6992 elif pnode not in bheads:
6990 # i18n: column positioning for "hg summary"
6993 # i18n: column positioning for "hg summary"
6991 ui.write(_(b'update: %d new changesets (update)\n') % new)
6994 ui.write(_(b'update: %d new changesets (update)\n') % new)
6992 else:
6995 else:
6993 # i18n: column positioning for "hg summary"
6996 # i18n: column positioning for "hg summary"
6994 ui.write(
6997 ui.write(
6995 _(b'update: %d new changesets, %d branch heads (merge)\n')
6998 _(b'update: %d new changesets, %d branch heads (merge)\n')
6996 % (new, len(bheads))
6999 % (new, len(bheads))
6997 )
7000 )
6998
7001
6999 t = []
7002 t = []
7000 draft = len(repo.revs(b'draft()'))
7003 draft = len(repo.revs(b'draft()'))
7001 if draft:
7004 if draft:
7002 t.append(_(b'%d draft') % draft)
7005 t.append(_(b'%d draft') % draft)
7003 secret = len(repo.revs(b'secret()'))
7006 secret = len(repo.revs(b'secret()'))
7004 if secret:
7007 if secret:
7005 t.append(_(b'%d secret') % secret)
7008 t.append(_(b'%d secret') % secret)
7006
7009
7007 if draft or secret:
7010 if draft or secret:
7008 ui.status(_(b'phases: %s\n') % b', '.join(t))
7011 ui.status(_(b'phases: %s\n') % b', '.join(t))
7009
7012
7010 if obsolete.isenabled(repo, obsolete.createmarkersopt):
7013 if obsolete.isenabled(repo, obsolete.createmarkersopt):
7011 for trouble in (b"orphan", b"contentdivergent", b"phasedivergent"):
7014 for trouble in (b"orphan", b"contentdivergent", b"phasedivergent"):
7012 numtrouble = len(repo.revs(trouble + b"()"))
7015 numtrouble = len(repo.revs(trouble + b"()"))
7013 # We write all the possibilities to ease translation
7016 # We write all the possibilities to ease translation
7014 troublemsg = {
7017 troublemsg = {
7015 b"orphan": _(b"orphan: %d changesets"),
7018 b"orphan": _(b"orphan: %d changesets"),
7016 b"contentdivergent": _(b"content-divergent: %d changesets"),
7019 b"contentdivergent": _(b"content-divergent: %d changesets"),
7017 b"phasedivergent": _(b"phase-divergent: %d changesets"),
7020 b"phasedivergent": _(b"phase-divergent: %d changesets"),
7018 }
7021 }
7019 if numtrouble > 0:
7022 if numtrouble > 0:
7020 ui.status(troublemsg[trouble] % numtrouble + b"\n")
7023 ui.status(troublemsg[trouble] % numtrouble + b"\n")
7021
7024
7022 cmdutil.summaryhooks(ui, repo)
7025 cmdutil.summaryhooks(ui, repo)
7023
7026
7024 if opts.get(b'remote'):
7027 if opts.get(b'remote'):
7025 needsincoming, needsoutgoing = True, True
7028 needsincoming, needsoutgoing = True, True
7026 else:
7029 else:
7027 needsincoming, needsoutgoing = False, False
7030 needsincoming, needsoutgoing = False, False
7028 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
7031 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
7029 if i:
7032 if i:
7030 needsincoming = True
7033 needsincoming = True
7031 if o:
7034 if o:
7032 needsoutgoing = True
7035 needsoutgoing = True
7033 if not needsincoming and not needsoutgoing:
7036 if not needsincoming and not needsoutgoing:
7034 return
7037 return
7035
7038
7036 def getincoming():
7039 def getincoming():
7037 source, branches = hg.parseurl(ui.expandpath(b'default'))
7040 source, branches = hg.parseurl(ui.expandpath(b'default'))
7038 sbranch = branches[0]
7041 sbranch = branches[0]
7039 try:
7042 try:
7040 other = hg.peer(repo, {}, source)
7043 other = hg.peer(repo, {}, source)
7041 except error.RepoError:
7044 except error.RepoError:
7042 if opts.get(b'remote'):
7045 if opts.get(b'remote'):
7043 raise
7046 raise
7044 return source, sbranch, None, None, None
7047 return source, sbranch, None, None, None
7045 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
7048 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
7046 if revs:
7049 if revs:
7047 revs = [other.lookup(rev) for rev in revs]
7050 revs = [other.lookup(rev) for rev in revs]
7048 ui.debug(b'comparing with %s\n' % util.hidepassword(source))
7051 ui.debug(b'comparing with %s\n' % util.hidepassword(source))
7049 repo.ui.pushbuffer()
7052 repo.ui.pushbuffer()
7050 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
7053 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
7051 repo.ui.popbuffer()
7054 repo.ui.popbuffer()
7052 return source, sbranch, other, commoninc, commoninc[1]
7055 return source, sbranch, other, commoninc, commoninc[1]
7053
7056
7054 if needsincoming:
7057 if needsincoming:
7055 source, sbranch, sother, commoninc, incoming = getincoming()
7058 source, sbranch, sother, commoninc, incoming = getincoming()
7056 else:
7059 else:
7057 source = sbranch = sother = commoninc = incoming = None
7060 source = sbranch = sother = commoninc = incoming = None
7058
7061
7059 def getoutgoing():
7062 def getoutgoing():
7060 dest, branches = hg.parseurl(ui.expandpath(b'default-push', b'default'))
7063 dest, branches = hg.parseurl(ui.expandpath(b'default-push', b'default'))
7061 dbranch = branches[0]
7064 dbranch = branches[0]
7062 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
7065 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
7063 if source != dest:
7066 if source != dest:
7064 try:
7067 try:
7065 dother = hg.peer(repo, {}, dest)
7068 dother = hg.peer(repo, {}, dest)
7066 except error.RepoError:
7069 except error.RepoError:
7067 if opts.get(b'remote'):
7070 if opts.get(b'remote'):
7068 raise
7071 raise
7069 return dest, dbranch, None, None
7072 return dest, dbranch, None, None
7070 ui.debug(b'comparing with %s\n' % util.hidepassword(dest))
7073 ui.debug(b'comparing with %s\n' % util.hidepassword(dest))
7071 elif sother is None:
7074 elif sother is None:
7072 # there is no explicit destination peer, but source one is invalid
7075 # there is no explicit destination peer, but source one is invalid
7073 return dest, dbranch, None, None
7076 return dest, dbranch, None, None
7074 else:
7077 else:
7075 dother = sother
7078 dother = sother
7076 if source != dest or (sbranch is not None and sbranch != dbranch):
7079 if source != dest or (sbranch is not None and sbranch != dbranch):
7077 common = None
7080 common = None
7078 else:
7081 else:
7079 common = commoninc
7082 common = commoninc
7080 if revs:
7083 if revs:
7081 revs = [repo.lookup(rev) for rev in revs]
7084 revs = [repo.lookup(rev) for rev in revs]
7082 repo.ui.pushbuffer()
7085 repo.ui.pushbuffer()
7083 outgoing = discovery.findcommonoutgoing(
7086 outgoing = discovery.findcommonoutgoing(
7084 repo, dother, onlyheads=revs, commoninc=common
7087 repo, dother, onlyheads=revs, commoninc=common
7085 )
7088 )
7086 repo.ui.popbuffer()
7089 repo.ui.popbuffer()
7087 return dest, dbranch, dother, outgoing
7090 return dest, dbranch, dother, outgoing
7088
7091
7089 if needsoutgoing:
7092 if needsoutgoing:
7090 dest, dbranch, dother, outgoing = getoutgoing()
7093 dest, dbranch, dother, outgoing = getoutgoing()
7091 else:
7094 else:
7092 dest = dbranch = dother = outgoing = None
7095 dest = dbranch = dother = outgoing = None
7093
7096
7094 if opts.get(b'remote'):
7097 if opts.get(b'remote'):
7095 t = []
7098 t = []
7096 if incoming:
7099 if incoming:
7097 t.append(_(b'1 or more incoming'))
7100 t.append(_(b'1 or more incoming'))
7098 o = outgoing.missing
7101 o = outgoing.missing
7099 if o:
7102 if o:
7100 t.append(_(b'%d outgoing') % len(o))
7103 t.append(_(b'%d outgoing') % len(o))
7101 other = dother or sother
7104 other = dother or sother
7102 if b'bookmarks' in other.listkeys(b'namespaces'):
7105 if b'bookmarks' in other.listkeys(b'namespaces'):
7103 counts = bookmarks.summary(repo, other)
7106 counts = bookmarks.summary(repo, other)
7104 if counts[0] > 0:
7107 if counts[0] > 0:
7105 t.append(_(b'%d incoming bookmarks') % counts[0])
7108 t.append(_(b'%d incoming bookmarks') % counts[0])
7106 if counts[1] > 0:
7109 if counts[1] > 0:
7107 t.append(_(b'%d outgoing bookmarks') % counts[1])
7110 t.append(_(b'%d outgoing bookmarks') % counts[1])
7108
7111
7109 if t:
7112 if t:
7110 # i18n: column positioning for "hg summary"
7113 # i18n: column positioning for "hg summary"
7111 ui.write(_(b'remote: %s\n') % (b', '.join(t)))
7114 ui.write(_(b'remote: %s\n') % (b', '.join(t)))
7112 else:
7115 else:
7113 # i18n: column positioning for "hg summary"
7116 # i18n: column positioning for "hg summary"
7114 ui.status(_(b'remote: (synced)\n'))
7117 ui.status(_(b'remote: (synced)\n'))
7115
7118
7116 cmdutil.summaryremotehooks(
7119 cmdutil.summaryremotehooks(
7117 ui,
7120 ui,
7118 repo,
7121 repo,
7119 opts,
7122 opts,
7120 (
7123 (
7121 (source, sbranch, sother, commoninc),
7124 (source, sbranch, sother, commoninc),
7122 (dest, dbranch, dother, outgoing),
7125 (dest, dbranch, dother, outgoing),
7123 ),
7126 ),
7124 )
7127 )
7125
7128
7126
7129
7127 @command(
7130 @command(
7128 b'tag',
7131 b'tag',
7129 [
7132 [
7130 (b'f', b'force', None, _(b'force tag')),
7133 (b'f', b'force', None, _(b'force tag')),
7131 (b'l', b'local', None, _(b'make the tag local')),
7134 (b'l', b'local', None, _(b'make the tag local')),
7132 (b'r', b'rev', b'', _(b'revision to tag'), _(b'REV')),
7135 (b'r', b'rev', b'', _(b'revision to tag'), _(b'REV')),
7133 (b'', b'remove', None, _(b'remove a tag')),
7136 (b'', b'remove', None, _(b'remove a tag')),
7134 # -l/--local is already there, commitopts cannot be used
7137 # -l/--local is already there, commitopts cannot be used
7135 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
7138 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
7136 (b'm', b'message', b'', _(b'use text as commit message'), _(b'TEXT')),
7139 (b'm', b'message', b'', _(b'use text as commit message'), _(b'TEXT')),
7137 ]
7140 ]
7138 + commitopts2,
7141 + commitopts2,
7139 _(b'[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'),
7142 _(b'[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'),
7140 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7143 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7141 )
7144 )
7142 def tag(ui, repo, name1, *names, **opts):
7145 def tag(ui, repo, name1, *names, **opts):
7143 """add one or more tags for the current or given revision
7146 """add one or more tags for the current or given revision
7144
7147
7145 Name a particular revision using <name>.
7148 Name a particular revision using <name>.
7146
7149
7147 Tags are used to name particular revisions of the repository and are
7150 Tags are used to name particular revisions of the repository and are
7148 very useful to compare different revisions, to go back to significant
7151 very useful to compare different revisions, to go back to significant
7149 earlier versions or to mark branch points as releases, etc. Changing
7152 earlier versions or to mark branch points as releases, etc. Changing
7150 an existing tag is normally disallowed; use -f/--force to override.
7153 an existing tag is normally disallowed; use -f/--force to override.
7151
7154
7152 If no revision is given, the parent of the working directory is
7155 If no revision is given, the parent of the working directory is
7153 used.
7156 used.
7154
7157
7155 To facilitate version control, distribution, and merging of tags,
7158 To facilitate version control, distribution, and merging of tags,
7156 they are stored as a file named ".hgtags" which is managed similarly
7159 they are stored as a file named ".hgtags" which is managed similarly
7157 to other project files and can be hand-edited if necessary. This
7160 to other project files and can be hand-edited if necessary. This
7158 also means that tagging creates a new commit. The file
7161 also means that tagging creates a new commit. The file
7159 ".hg/localtags" is used for local tags (not shared among
7162 ".hg/localtags" is used for local tags (not shared among
7160 repositories).
7163 repositories).
7161
7164
7162 Tag commits are usually made at the head of a branch. If the parent
7165 Tag commits are usually made at the head of a branch. If the parent
7163 of the working directory is not a branch head, :hg:`tag` aborts; use
7166 of the working directory is not a branch head, :hg:`tag` aborts; use
7164 -f/--force to force the tag commit to be based on a non-head
7167 -f/--force to force the tag commit to be based on a non-head
7165 changeset.
7168 changeset.
7166
7169
7167 See :hg:`help dates` for a list of formats valid for -d/--date.
7170 See :hg:`help dates` for a list of formats valid for -d/--date.
7168
7171
7169 Since tag names have priority over branch names during revision
7172 Since tag names have priority over branch names during revision
7170 lookup, using an existing branch name as a tag name is discouraged.
7173 lookup, using an existing branch name as a tag name is discouraged.
7171
7174
7172 Returns 0 on success.
7175 Returns 0 on success.
7173 """
7176 """
7174 cmdutil.check_incompatible_arguments(opts, 'remove', ['rev'])
7177 cmdutil.check_incompatible_arguments(opts, 'remove', ['rev'])
7175 opts = pycompat.byteskwargs(opts)
7178 opts = pycompat.byteskwargs(opts)
7176 with repo.wlock(), repo.lock():
7179 with repo.wlock(), repo.lock():
7177 rev_ = b"."
7180 rev_ = b"."
7178 names = [t.strip() for t in (name1,) + names]
7181 names = [t.strip() for t in (name1,) + names]
7179 if len(names) != len(set(names)):
7182 if len(names) != len(set(names)):
7180 raise error.InputError(_(b'tag names must be unique'))
7183 raise error.InputError(_(b'tag names must be unique'))
7181 for n in names:
7184 for n in names:
7182 scmutil.checknewlabel(repo, n, b'tag')
7185 scmutil.checknewlabel(repo, n, b'tag')
7183 if not n:
7186 if not n:
7184 raise error.InputError(
7187 raise error.InputError(
7185 _(b'tag names cannot consist entirely of whitespace')
7188 _(b'tag names cannot consist entirely of whitespace')
7186 )
7189 )
7187 if opts.get(b'rev'):
7190 if opts.get(b'rev'):
7188 rev_ = opts[b'rev']
7191 rev_ = opts[b'rev']
7189 message = opts.get(b'message')
7192 message = opts.get(b'message')
7190 if opts.get(b'remove'):
7193 if opts.get(b'remove'):
7191 if opts.get(b'local'):
7194 if opts.get(b'local'):
7192 expectedtype = b'local'
7195 expectedtype = b'local'
7193 else:
7196 else:
7194 expectedtype = b'global'
7197 expectedtype = b'global'
7195
7198
7196 for n in names:
7199 for n in names:
7197 if repo.tagtype(n) == b'global':
7200 if repo.tagtype(n) == b'global':
7198 alltags = tagsmod.findglobaltags(ui, repo)
7201 alltags = tagsmod.findglobaltags(ui, repo)
7199 if alltags[n][0] == nullid:
7202 if alltags[n][0] == nullid:
7200 raise error.InputError(
7203 raise error.InputError(
7201 _(b"tag '%s' is already removed") % n
7204 _(b"tag '%s' is already removed") % n
7202 )
7205 )
7203 if not repo.tagtype(n):
7206 if not repo.tagtype(n):
7204 raise error.InputError(_(b"tag '%s' does not exist") % n)
7207 raise error.InputError(_(b"tag '%s' does not exist") % n)
7205 if repo.tagtype(n) != expectedtype:
7208 if repo.tagtype(n) != expectedtype:
7206 if expectedtype == b'global':
7209 if expectedtype == b'global':
7207 raise error.InputError(
7210 raise error.InputError(
7208 _(b"tag '%s' is not a global tag") % n
7211 _(b"tag '%s' is not a global tag") % n
7209 )
7212 )
7210 else:
7213 else:
7211 raise error.InputError(
7214 raise error.InputError(
7212 _(b"tag '%s' is not a local tag") % n
7215 _(b"tag '%s' is not a local tag") % n
7213 )
7216 )
7214 rev_ = b'null'
7217 rev_ = b'null'
7215 if not message:
7218 if not message:
7216 # we don't translate commit messages
7219 # we don't translate commit messages
7217 message = b'Removed tag %s' % b', '.join(names)
7220 message = b'Removed tag %s' % b', '.join(names)
7218 elif not opts.get(b'force'):
7221 elif not opts.get(b'force'):
7219 for n in names:
7222 for n in names:
7220 if n in repo.tags():
7223 if n in repo.tags():
7221 raise error.InputError(
7224 raise error.InputError(
7222 _(b"tag '%s' already exists (use -f to force)") % n
7225 _(b"tag '%s' already exists (use -f to force)") % n
7223 )
7226 )
7224 if not opts.get(b'local'):
7227 if not opts.get(b'local'):
7225 p1, p2 = repo.dirstate.parents()
7228 p1, p2 = repo.dirstate.parents()
7226 if p2 != nullid:
7229 if p2 != nullid:
7227 raise error.StateError(_(b'uncommitted merge'))
7230 raise error.StateError(_(b'uncommitted merge'))
7228 bheads = repo.branchheads()
7231 bheads = repo.branchheads()
7229 if not opts.get(b'force') and bheads and p1 not in bheads:
7232 if not opts.get(b'force') and bheads and p1 not in bheads:
7230 raise error.InputError(
7233 raise error.InputError(
7231 _(
7234 _(
7232 b'working directory is not at a branch head '
7235 b'working directory is not at a branch head '
7233 b'(use -f to force)'
7236 b'(use -f to force)'
7234 )
7237 )
7235 )
7238 )
7236 node = scmutil.revsingle(repo, rev_).node()
7239 node = scmutil.revsingle(repo, rev_).node()
7237
7240
7238 if not message:
7241 if not message:
7239 # we don't translate commit messages
7242 # we don't translate commit messages
7240 message = b'Added tag %s for changeset %s' % (
7243 message = b'Added tag %s for changeset %s' % (
7241 b', '.join(names),
7244 b', '.join(names),
7242 short(node),
7245 short(node),
7243 )
7246 )
7244
7247
7245 date = opts.get(b'date')
7248 date = opts.get(b'date')
7246 if date:
7249 if date:
7247 date = dateutil.parsedate(date)
7250 date = dateutil.parsedate(date)
7248
7251
7249 if opts.get(b'remove'):
7252 if opts.get(b'remove'):
7250 editform = b'tag.remove'
7253 editform = b'tag.remove'
7251 else:
7254 else:
7252 editform = b'tag.add'
7255 editform = b'tag.add'
7253 editor = cmdutil.getcommiteditor(
7256 editor = cmdutil.getcommiteditor(
7254 editform=editform, **pycompat.strkwargs(opts)
7257 editform=editform, **pycompat.strkwargs(opts)
7255 )
7258 )
7256
7259
7257 # don't allow tagging the null rev
7260 # don't allow tagging the null rev
7258 if (
7261 if (
7259 not opts.get(b'remove')
7262 not opts.get(b'remove')
7260 and scmutil.revsingle(repo, rev_).rev() == nullrev
7263 and scmutil.revsingle(repo, rev_).rev() == nullrev
7261 ):
7264 ):
7262 raise error.InputError(_(b"cannot tag null revision"))
7265 raise error.InputError(_(b"cannot tag null revision"))
7263
7266
7264 tagsmod.tag(
7267 tagsmod.tag(
7265 repo,
7268 repo,
7266 names,
7269 names,
7267 node,
7270 node,
7268 message,
7271 message,
7269 opts.get(b'local'),
7272 opts.get(b'local'),
7270 opts.get(b'user'),
7273 opts.get(b'user'),
7271 date,
7274 date,
7272 editor=editor,
7275 editor=editor,
7273 )
7276 )
7274
7277
7275
7278
7276 @command(
7279 @command(
7277 b'tags',
7280 b'tags',
7278 formatteropts,
7281 formatteropts,
7279 b'',
7282 b'',
7280 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7283 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7281 intents={INTENT_READONLY},
7284 intents={INTENT_READONLY},
7282 )
7285 )
7283 def tags(ui, repo, **opts):
7286 def tags(ui, repo, **opts):
7284 """list repository tags
7287 """list repository tags
7285
7288
7286 This lists both regular and local tags. When the -v/--verbose
7289 This lists both regular and local tags. When the -v/--verbose
7287 switch is used, a third column "local" is printed for local tags.
7290 switch is used, a third column "local" is printed for local tags.
7288 When the -q/--quiet switch is used, only the tag name is printed.
7291 When the -q/--quiet switch is used, only the tag name is printed.
7289
7292
7290 .. container:: verbose
7293 .. container:: verbose
7291
7294
7292 Template:
7295 Template:
7293
7296
7294 The following keywords are supported in addition to the common template
7297 The following keywords are supported in addition to the common template
7295 keywords and functions such as ``{tag}``. See also
7298 keywords and functions such as ``{tag}``. See also
7296 :hg:`help templates`.
7299 :hg:`help templates`.
7297
7300
7298 :type: String. ``local`` for local tags.
7301 :type: String. ``local`` for local tags.
7299
7302
7300 Returns 0 on success.
7303 Returns 0 on success.
7301 """
7304 """
7302
7305
7303 opts = pycompat.byteskwargs(opts)
7306 opts = pycompat.byteskwargs(opts)
7304 ui.pager(b'tags')
7307 ui.pager(b'tags')
7305 fm = ui.formatter(b'tags', opts)
7308 fm = ui.formatter(b'tags', opts)
7306 hexfunc = fm.hexfunc
7309 hexfunc = fm.hexfunc
7307
7310
7308 for t, n in reversed(repo.tagslist()):
7311 for t, n in reversed(repo.tagslist()):
7309 hn = hexfunc(n)
7312 hn = hexfunc(n)
7310 label = b'tags.normal'
7313 label = b'tags.normal'
7311 tagtype = b''
7314 tagtype = b''
7312 if repo.tagtype(t) == b'local':
7315 if repo.tagtype(t) == b'local':
7313 label = b'tags.local'
7316 label = b'tags.local'
7314 tagtype = b'local'
7317 tagtype = b'local'
7315
7318
7316 fm.startitem()
7319 fm.startitem()
7317 fm.context(repo=repo)
7320 fm.context(repo=repo)
7318 fm.write(b'tag', b'%s', t, label=label)
7321 fm.write(b'tag', b'%s', t, label=label)
7319 fmt = b" " * (30 - encoding.colwidth(t)) + b' %5d:%s'
7322 fmt = b" " * (30 - encoding.colwidth(t)) + b' %5d:%s'
7320 fm.condwrite(
7323 fm.condwrite(
7321 not ui.quiet,
7324 not ui.quiet,
7322 b'rev node',
7325 b'rev node',
7323 fmt,
7326 fmt,
7324 repo.changelog.rev(n),
7327 repo.changelog.rev(n),
7325 hn,
7328 hn,
7326 label=label,
7329 label=label,
7327 )
7330 )
7328 fm.condwrite(
7331 fm.condwrite(
7329 ui.verbose and tagtype, b'type', b' %s', tagtype, label=label
7332 ui.verbose and tagtype, b'type', b' %s', tagtype, label=label
7330 )
7333 )
7331 fm.plain(b'\n')
7334 fm.plain(b'\n')
7332 fm.end()
7335 fm.end()
7333
7336
7334
7337
7335 @command(
7338 @command(
7336 b'tip',
7339 b'tip',
7337 [
7340 [
7338 (b'p', b'patch', None, _(b'show patch')),
7341 (b'p', b'patch', None, _(b'show patch')),
7339 (b'g', b'git', None, _(b'use git extended diff format')),
7342 (b'g', b'git', None, _(b'use git extended diff format')),
7340 ]
7343 ]
7341 + templateopts,
7344 + templateopts,
7342 _(b'[-p] [-g]'),
7345 _(b'[-p] [-g]'),
7343 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
7346 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
7344 )
7347 )
7345 def tip(ui, repo, **opts):
7348 def tip(ui, repo, **opts):
7346 """show the tip revision (DEPRECATED)
7349 """show the tip revision (DEPRECATED)
7347
7350
7348 The tip revision (usually just called the tip) is the changeset
7351 The tip revision (usually just called the tip) is the changeset
7349 most recently added to the repository (and therefore the most
7352 most recently added to the repository (and therefore the most
7350 recently changed head).
7353 recently changed head).
7351
7354
7352 If you have just made a commit, that commit will be the tip. If
7355 If you have just made a commit, that commit will be the tip. If
7353 you have just pulled changes from another repository, the tip of
7356 you have just pulled changes from another repository, the tip of
7354 that repository becomes the current tip. The "tip" tag is special
7357 that repository becomes the current tip. The "tip" tag is special
7355 and cannot be renamed or assigned to a different changeset.
7358 and cannot be renamed or assigned to a different changeset.
7356
7359
7357 This command is deprecated, please use :hg:`heads` instead.
7360 This command is deprecated, please use :hg:`heads` instead.
7358
7361
7359 Returns 0 on success.
7362 Returns 0 on success.
7360 """
7363 """
7361 opts = pycompat.byteskwargs(opts)
7364 opts = pycompat.byteskwargs(opts)
7362 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
7365 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
7363 displayer.show(repo[b'tip'])
7366 displayer.show(repo[b'tip'])
7364 displayer.close()
7367 displayer.close()
7365
7368
7366
7369
7367 @command(
7370 @command(
7368 b'unbundle',
7371 b'unbundle',
7369 [
7372 [
7370 (
7373 (
7371 b'u',
7374 b'u',
7372 b'update',
7375 b'update',
7373 None,
7376 None,
7374 _(b'update to new branch head if changesets were unbundled'),
7377 _(b'update to new branch head if changesets were unbundled'),
7375 )
7378 )
7376 ],
7379 ],
7377 _(b'[-u] FILE...'),
7380 _(b'[-u] FILE...'),
7378 helpcategory=command.CATEGORY_IMPORT_EXPORT,
7381 helpcategory=command.CATEGORY_IMPORT_EXPORT,
7379 )
7382 )
7380 def unbundle(ui, repo, fname1, *fnames, **opts):
7383 def unbundle(ui, repo, fname1, *fnames, **opts):
7381 """apply one or more bundle files
7384 """apply one or more bundle files
7382
7385
7383 Apply one or more bundle files generated by :hg:`bundle`.
7386 Apply one or more bundle files generated by :hg:`bundle`.
7384
7387
7385 Returns 0 on success, 1 if an update has unresolved files.
7388 Returns 0 on success, 1 if an update has unresolved files.
7386 """
7389 """
7387 fnames = (fname1,) + fnames
7390 fnames = (fname1,) + fnames
7388
7391
7389 with repo.lock():
7392 with repo.lock():
7390 for fname in fnames:
7393 for fname in fnames:
7391 f = hg.openpath(ui, fname)
7394 f = hg.openpath(ui, fname)
7392 gen = exchange.readbundle(ui, f, fname)
7395 gen = exchange.readbundle(ui, f, fname)
7393 if isinstance(gen, streamclone.streamcloneapplier):
7396 if isinstance(gen, streamclone.streamcloneapplier):
7394 raise error.InputError(
7397 raise error.InputError(
7395 _(
7398 _(
7396 b'packed bundles cannot be applied with '
7399 b'packed bundles cannot be applied with '
7397 b'"hg unbundle"'
7400 b'"hg unbundle"'
7398 ),
7401 ),
7399 hint=_(b'use "hg debugapplystreamclonebundle"'),
7402 hint=_(b'use "hg debugapplystreamclonebundle"'),
7400 )
7403 )
7401 url = b'bundle:' + fname
7404 url = b'bundle:' + fname
7402 try:
7405 try:
7403 txnname = b'unbundle'
7406 txnname = b'unbundle'
7404 if not isinstance(gen, bundle2.unbundle20):
7407 if not isinstance(gen, bundle2.unbundle20):
7405 txnname = b'unbundle\n%s' % util.hidepassword(url)
7408 txnname = b'unbundle\n%s' % util.hidepassword(url)
7406 with repo.transaction(txnname) as tr:
7409 with repo.transaction(txnname) as tr:
7407 op = bundle2.applybundle(
7410 op = bundle2.applybundle(
7408 repo, gen, tr, source=b'unbundle', url=url
7411 repo, gen, tr, source=b'unbundle', url=url
7409 )
7412 )
7410 except error.BundleUnknownFeatureError as exc:
7413 except error.BundleUnknownFeatureError as exc:
7411 raise error.Abort(
7414 raise error.Abort(
7412 _(b'%s: unknown bundle feature, %s') % (fname, exc),
7415 _(b'%s: unknown bundle feature, %s') % (fname, exc),
7413 hint=_(
7416 hint=_(
7414 b"see https://mercurial-scm.org/"
7417 b"see https://mercurial-scm.org/"
7415 b"wiki/BundleFeature for more "
7418 b"wiki/BundleFeature for more "
7416 b"information"
7419 b"information"
7417 ),
7420 ),
7418 )
7421 )
7419 modheads = bundle2.combinechangegroupresults(op)
7422 modheads = bundle2.combinechangegroupresults(op)
7420
7423
7421 return postincoming(ui, repo, modheads, opts.get('update'), None, None)
7424 return postincoming(ui, repo, modheads, opts.get('update'), None, None)
7422
7425
7423
7426
7424 @command(
7427 @command(
7425 b'unshelve',
7428 b'unshelve',
7426 [
7429 [
7427 (b'a', b'abort', None, _(b'abort an incomplete unshelve operation')),
7430 (b'a', b'abort', None, _(b'abort an incomplete unshelve operation')),
7428 (
7431 (
7429 b'c',
7432 b'c',
7430 b'continue',
7433 b'continue',
7431 None,
7434 None,
7432 _(b'continue an incomplete unshelve operation'),
7435 _(b'continue an incomplete unshelve operation'),
7433 ),
7436 ),
7434 (b'i', b'interactive', None, _(b'use interactive mode (EXPERIMENTAL)')),
7437 (b'i', b'interactive', None, _(b'use interactive mode (EXPERIMENTAL)')),
7435 (b'k', b'keep', None, _(b'keep shelve after unshelving')),
7438 (b'k', b'keep', None, _(b'keep shelve after unshelving')),
7436 (
7439 (
7437 b'n',
7440 b'n',
7438 b'name',
7441 b'name',
7439 b'',
7442 b'',
7440 _(b'restore shelved change with given name'),
7443 _(b'restore shelved change with given name'),
7441 _(b'NAME'),
7444 _(b'NAME'),
7442 ),
7445 ),
7443 (b't', b'tool', b'', _(b'specify merge tool')),
7446 (b't', b'tool', b'', _(b'specify merge tool')),
7444 (
7447 (
7445 b'',
7448 b'',
7446 b'date',
7449 b'date',
7447 b'',
7450 b'',
7448 _(b'set date for temporary commits (DEPRECATED)'),
7451 _(b'set date for temporary commits (DEPRECATED)'),
7449 _(b'DATE'),
7452 _(b'DATE'),
7450 ),
7453 ),
7451 ],
7454 ],
7452 _(b'hg unshelve [OPTION]... [[-n] SHELVED]'),
7455 _(b'hg unshelve [OPTION]... [[-n] SHELVED]'),
7453 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7456 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7454 )
7457 )
7455 def unshelve(ui, repo, *shelved, **opts):
7458 def unshelve(ui, repo, *shelved, **opts):
7456 """restore a shelved change to the working directory
7459 """restore a shelved change to the working directory
7457
7460
7458 This command accepts an optional name of a shelved change to
7461 This command accepts an optional name of a shelved change to
7459 restore. If none is given, the most recent shelved change is used.
7462 restore. If none is given, the most recent shelved change is used.
7460
7463
7461 If a shelved change is applied successfully, the bundle that
7464 If a shelved change is applied successfully, the bundle that
7462 contains the shelved changes is moved to a backup location
7465 contains the shelved changes is moved to a backup location
7463 (.hg/shelve-backup).
7466 (.hg/shelve-backup).
7464
7467
7465 Since you can restore a shelved change on top of an arbitrary
7468 Since you can restore a shelved change on top of an arbitrary
7466 commit, it is possible that unshelving will result in a conflict
7469 commit, it is possible that unshelving will result in a conflict
7467 between your changes and the commits you are unshelving onto. If
7470 between your changes and the commits you are unshelving onto. If
7468 this occurs, you must resolve the conflict, then use
7471 this occurs, you must resolve the conflict, then use
7469 ``--continue`` to complete the unshelve operation. (The bundle
7472 ``--continue`` to complete the unshelve operation. (The bundle
7470 will not be moved until you successfully complete the unshelve.)
7473 will not be moved until you successfully complete the unshelve.)
7471
7474
7472 (Alternatively, you can use ``--abort`` to abandon an unshelve
7475 (Alternatively, you can use ``--abort`` to abandon an unshelve
7473 that causes a conflict. This reverts the unshelved changes, and
7476 that causes a conflict. This reverts the unshelved changes, and
7474 leaves the bundle in place.)
7477 leaves the bundle in place.)
7475
7478
7476 If bare shelved change (without interactive, include and exclude
7479 If bare shelved change (without interactive, include and exclude
7477 option) was done on newly created branch it would restore branch
7480 option) was done on newly created branch it would restore branch
7478 information to the working directory.
7481 information to the working directory.
7479
7482
7480 After a successful unshelve, the shelved changes are stored in a
7483 After a successful unshelve, the shelved changes are stored in a
7481 backup directory. Only the N most recent backups are kept. N
7484 backup directory. Only the N most recent backups are kept. N
7482 defaults to 10 but can be overridden using the ``shelve.maxbackups``
7485 defaults to 10 but can be overridden using the ``shelve.maxbackups``
7483 configuration option.
7486 configuration option.
7484
7487
7485 .. container:: verbose
7488 .. container:: verbose
7486
7489
7487 Timestamp in seconds is used to decide order of backups. More
7490 Timestamp in seconds is used to decide order of backups. More
7488 than ``maxbackups`` backups are kept, if same timestamp
7491 than ``maxbackups`` backups are kept, if same timestamp
7489 prevents from deciding exact order of them, for safety.
7492 prevents from deciding exact order of them, for safety.
7490
7493
7491 Selected changes can be unshelved with ``--interactive`` flag.
7494 Selected changes can be unshelved with ``--interactive`` flag.
7492 The working directory is updated with the selected changes, and
7495 The working directory is updated with the selected changes, and
7493 only the unselected changes remain shelved.
7496 only the unselected changes remain shelved.
7494 Note: The whole shelve is applied to working directory first before
7497 Note: The whole shelve is applied to working directory first before
7495 running interactively. So, this will bring up all the conflicts between
7498 running interactively. So, this will bring up all the conflicts between
7496 working directory and the shelve, irrespective of which changes will be
7499 working directory and the shelve, irrespective of which changes will be
7497 unshelved.
7500 unshelved.
7498 """
7501 """
7499 with repo.wlock():
7502 with repo.wlock():
7500 return shelvemod.unshelvecmd(ui, repo, *shelved, **opts)
7503 return shelvemod.unshelvecmd(ui, repo, *shelved, **opts)
7501
7504
7502
7505
7503 statemod.addunfinished(
7506 statemod.addunfinished(
7504 b'unshelve',
7507 b'unshelve',
7505 fname=b'shelvedstate',
7508 fname=b'shelvedstate',
7506 continueflag=True,
7509 continueflag=True,
7507 abortfunc=shelvemod.hgabortunshelve,
7510 abortfunc=shelvemod.hgabortunshelve,
7508 continuefunc=shelvemod.hgcontinueunshelve,
7511 continuefunc=shelvemod.hgcontinueunshelve,
7509 cmdmsg=_(b'unshelve already in progress'),
7512 cmdmsg=_(b'unshelve already in progress'),
7510 )
7513 )
7511
7514
7512
7515
7513 @command(
7516 @command(
7514 b'update|up|checkout|co',
7517 b'update|up|checkout|co',
7515 [
7518 [
7516 (b'C', b'clean', None, _(b'discard uncommitted changes (no backup)')),
7519 (b'C', b'clean', None, _(b'discard uncommitted changes (no backup)')),
7517 (b'c', b'check', None, _(b'require clean working directory')),
7520 (b'c', b'check', None, _(b'require clean working directory')),
7518 (b'm', b'merge', None, _(b'merge uncommitted changes')),
7521 (b'm', b'merge', None, _(b'merge uncommitted changes')),
7519 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
7522 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
7520 (b'r', b'rev', b'', _(b'revision'), _(b'REV')),
7523 (b'r', b'rev', b'', _(b'revision'), _(b'REV')),
7521 ]
7524 ]
7522 + mergetoolopts,
7525 + mergetoolopts,
7523 _(b'[-C|-c|-m] [-d DATE] [[-r] REV]'),
7526 _(b'[-C|-c|-m] [-d DATE] [[-r] REV]'),
7524 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7527 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7525 helpbasic=True,
7528 helpbasic=True,
7526 )
7529 )
7527 def update(ui, repo, node=None, **opts):
7530 def update(ui, repo, node=None, **opts):
7528 """update working directory (or switch revisions)
7531 """update working directory (or switch revisions)
7529
7532
7530 Update the repository's working directory to the specified
7533 Update the repository's working directory to the specified
7531 changeset. If no changeset is specified, update to the tip of the
7534 changeset. If no changeset is specified, update to the tip of the
7532 current named branch and move the active bookmark (see :hg:`help
7535 current named branch and move the active bookmark (see :hg:`help
7533 bookmarks`).
7536 bookmarks`).
7534
7537
7535 Update sets the working directory's parent revision to the specified
7538 Update sets the working directory's parent revision to the specified
7536 changeset (see :hg:`help parents`).
7539 changeset (see :hg:`help parents`).
7537
7540
7538 If the changeset is not a descendant or ancestor of the working
7541 If the changeset is not a descendant or ancestor of the working
7539 directory's parent and there are uncommitted changes, the update is
7542 directory's parent and there are uncommitted changes, the update is
7540 aborted. With the -c/--check option, the working directory is checked
7543 aborted. With the -c/--check option, the working directory is checked
7541 for uncommitted changes; if none are found, the working directory is
7544 for uncommitted changes; if none are found, the working directory is
7542 updated to the specified changeset.
7545 updated to the specified changeset.
7543
7546
7544 .. container:: verbose
7547 .. container:: verbose
7545
7548
7546 The -C/--clean, -c/--check, and -m/--merge options control what
7549 The -C/--clean, -c/--check, and -m/--merge options control what
7547 happens if the working directory contains uncommitted changes.
7550 happens if the working directory contains uncommitted changes.
7548 At most of one of them can be specified.
7551 At most of one of them can be specified.
7549
7552
7550 1. If no option is specified, and if
7553 1. If no option is specified, and if
7551 the requested changeset is an ancestor or descendant of
7554 the requested changeset is an ancestor or descendant of
7552 the working directory's parent, the uncommitted changes
7555 the working directory's parent, the uncommitted changes
7553 are merged into the requested changeset and the merged
7556 are merged into the requested changeset and the merged
7554 result is left uncommitted. If the requested changeset is
7557 result is left uncommitted. If the requested changeset is
7555 not an ancestor or descendant (that is, it is on another
7558 not an ancestor or descendant (that is, it is on another
7556 branch), the update is aborted and the uncommitted changes
7559 branch), the update is aborted and the uncommitted changes
7557 are preserved.
7560 are preserved.
7558
7561
7559 2. With the -m/--merge option, the update is allowed even if the
7562 2. With the -m/--merge option, the update is allowed even if the
7560 requested changeset is not an ancestor or descendant of
7563 requested changeset is not an ancestor or descendant of
7561 the working directory's parent.
7564 the working directory's parent.
7562
7565
7563 3. With the -c/--check option, the update is aborted and the
7566 3. With the -c/--check option, the update is aborted and the
7564 uncommitted changes are preserved.
7567 uncommitted changes are preserved.
7565
7568
7566 4. With the -C/--clean option, uncommitted changes are discarded and
7569 4. With the -C/--clean option, uncommitted changes are discarded and
7567 the working directory is updated to the requested changeset.
7570 the working directory is updated to the requested changeset.
7568
7571
7569 To cancel an uncommitted merge (and lose your changes), use
7572 To cancel an uncommitted merge (and lose your changes), use
7570 :hg:`merge --abort`.
7573 :hg:`merge --abort`.
7571
7574
7572 Use null as the changeset to remove the working directory (like
7575 Use null as the changeset to remove the working directory (like
7573 :hg:`clone -U`).
7576 :hg:`clone -U`).
7574
7577
7575 If you want to revert just one file to an older revision, use
7578 If you want to revert just one file to an older revision, use
7576 :hg:`revert [-r REV] NAME`.
7579 :hg:`revert [-r REV] NAME`.
7577
7580
7578 See :hg:`help dates` for a list of formats valid for -d/--date.
7581 See :hg:`help dates` for a list of formats valid for -d/--date.
7579
7582
7580 Returns 0 on success, 1 if there are unresolved files.
7583 Returns 0 on success, 1 if there are unresolved files.
7581 """
7584 """
7582 cmdutil.check_at_most_one_arg(opts, 'clean', 'check', 'merge')
7585 cmdutil.check_at_most_one_arg(opts, 'clean', 'check', 'merge')
7583 rev = opts.get('rev')
7586 rev = opts.get('rev')
7584 date = opts.get('date')
7587 date = opts.get('date')
7585 clean = opts.get('clean')
7588 clean = opts.get('clean')
7586 check = opts.get('check')
7589 check = opts.get('check')
7587 merge = opts.get('merge')
7590 merge = opts.get('merge')
7588 if rev and node:
7591 if rev and node:
7589 raise error.InputError(_(b"please specify just one revision"))
7592 raise error.InputError(_(b"please specify just one revision"))
7590
7593
7591 if ui.configbool(b'commands', b'update.requiredest'):
7594 if ui.configbool(b'commands', b'update.requiredest'):
7592 if not node and not rev and not date:
7595 if not node and not rev and not date:
7593 raise error.InputError(
7596 raise error.InputError(
7594 _(b'you must specify a destination'),
7597 _(b'you must specify a destination'),
7595 hint=_(b'for example: hg update ".::"'),
7598 hint=_(b'for example: hg update ".::"'),
7596 )
7599 )
7597
7600
7598 if rev is None or rev == b'':
7601 if rev is None or rev == b'':
7599 rev = node
7602 rev = node
7600
7603
7601 if date and rev is not None:
7604 if date and rev is not None:
7602 raise error.InputError(_(b"you can't specify a revision and a date"))
7605 raise error.InputError(_(b"you can't specify a revision and a date"))
7603
7606
7604 updatecheck = None
7607 updatecheck = None
7605 if check:
7608 if check:
7606 updatecheck = b'abort'
7609 updatecheck = b'abort'
7607 elif merge:
7610 elif merge:
7608 updatecheck = b'none'
7611 updatecheck = b'none'
7609
7612
7610 with repo.wlock():
7613 with repo.wlock():
7611 cmdutil.clearunfinished(repo)
7614 cmdutil.clearunfinished(repo)
7612 if date:
7615 if date:
7613 rev = cmdutil.finddate(ui, repo, date)
7616 rev = cmdutil.finddate(ui, repo, date)
7614
7617
7615 # if we defined a bookmark, we have to remember the original name
7618 # if we defined a bookmark, we have to remember the original name
7616 brev = rev
7619 brev = rev
7617 if rev:
7620 if rev:
7618 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
7621 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
7619 ctx = scmutil.revsingle(repo, rev, default=None)
7622 ctx = scmutil.revsingle(repo, rev, default=None)
7620 rev = ctx.rev()
7623 rev = ctx.rev()
7621 hidden = ctx.hidden()
7624 hidden = ctx.hidden()
7622 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
7625 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
7623 with ui.configoverride(overrides, b'update'):
7626 with ui.configoverride(overrides, b'update'):
7624 ret = hg.updatetotally(
7627 ret = hg.updatetotally(
7625 ui, repo, rev, brev, clean=clean, updatecheck=updatecheck
7628 ui, repo, rev, brev, clean=clean, updatecheck=updatecheck
7626 )
7629 )
7627 if hidden:
7630 if hidden:
7628 ctxstr = ctx.hex()[:12]
7631 ctxstr = ctx.hex()[:12]
7629 ui.warn(_(b"updated to hidden changeset %s\n") % ctxstr)
7632 ui.warn(_(b"updated to hidden changeset %s\n") % ctxstr)
7630
7633
7631 if ctx.obsolete():
7634 if ctx.obsolete():
7632 obsfatemsg = obsutil._getfilteredreason(repo, ctxstr, ctx)
7635 obsfatemsg = obsutil._getfilteredreason(repo, ctxstr, ctx)
7633 ui.warn(b"(%s)\n" % obsfatemsg)
7636 ui.warn(b"(%s)\n" % obsfatemsg)
7634 return ret
7637 return ret
7635
7638
7636
7639
7637 @command(
7640 @command(
7638 b'verify',
7641 b'verify',
7639 [(b'', b'full', False, b'perform more checks (EXPERIMENTAL)')],
7642 [(b'', b'full', False, b'perform more checks (EXPERIMENTAL)')],
7640 helpcategory=command.CATEGORY_MAINTENANCE,
7643 helpcategory=command.CATEGORY_MAINTENANCE,
7641 )
7644 )
7642 def verify(ui, repo, **opts):
7645 def verify(ui, repo, **opts):
7643 """verify the integrity of the repository
7646 """verify the integrity of the repository
7644
7647
7645 Verify the integrity of the current repository.
7648 Verify the integrity of the current repository.
7646
7649
7647 This will perform an extensive check of the repository's
7650 This will perform an extensive check of the repository's
7648 integrity, validating the hashes and checksums of each entry in
7651 integrity, validating the hashes and checksums of each entry in
7649 the changelog, manifest, and tracked files, as well as the
7652 the changelog, manifest, and tracked files, as well as the
7650 integrity of their crosslinks and indices.
7653 integrity of their crosslinks and indices.
7651
7654
7652 Please see https://mercurial-scm.org/wiki/RepositoryCorruption
7655 Please see https://mercurial-scm.org/wiki/RepositoryCorruption
7653 for more information about recovery from corruption of the
7656 for more information about recovery from corruption of the
7654 repository.
7657 repository.
7655
7658
7656 Returns 0 on success, 1 if errors are encountered.
7659 Returns 0 on success, 1 if errors are encountered.
7657 """
7660 """
7658 opts = pycompat.byteskwargs(opts)
7661 opts = pycompat.byteskwargs(opts)
7659
7662
7660 level = None
7663 level = None
7661 if opts[b'full']:
7664 if opts[b'full']:
7662 level = verifymod.VERIFY_FULL
7665 level = verifymod.VERIFY_FULL
7663 return hg.verify(repo, level)
7666 return hg.verify(repo, level)
7664
7667
7665
7668
7666 @command(
7669 @command(
7667 b'version',
7670 b'version',
7668 [] + formatteropts,
7671 [] + formatteropts,
7669 helpcategory=command.CATEGORY_HELP,
7672 helpcategory=command.CATEGORY_HELP,
7670 norepo=True,
7673 norepo=True,
7671 intents={INTENT_READONLY},
7674 intents={INTENT_READONLY},
7672 )
7675 )
7673 def version_(ui, **opts):
7676 def version_(ui, **opts):
7674 """output version and copyright information
7677 """output version and copyright information
7675
7678
7676 .. container:: verbose
7679 .. container:: verbose
7677
7680
7678 Template:
7681 Template:
7679
7682
7680 The following keywords are supported. See also :hg:`help templates`.
7683 The following keywords are supported. See also :hg:`help templates`.
7681
7684
7682 :extensions: List of extensions.
7685 :extensions: List of extensions.
7683 :ver: String. Version number.
7686 :ver: String. Version number.
7684
7687
7685 And each entry of ``{extensions}`` provides the following sub-keywords
7688 And each entry of ``{extensions}`` provides the following sub-keywords
7686 in addition to ``{ver}``.
7689 in addition to ``{ver}``.
7687
7690
7688 :bundled: Boolean. True if included in the release.
7691 :bundled: Boolean. True if included in the release.
7689 :name: String. Extension name.
7692 :name: String. Extension name.
7690 """
7693 """
7691 opts = pycompat.byteskwargs(opts)
7694 opts = pycompat.byteskwargs(opts)
7692 if ui.verbose:
7695 if ui.verbose:
7693 ui.pager(b'version')
7696 ui.pager(b'version')
7694 fm = ui.formatter(b"version", opts)
7697 fm = ui.formatter(b"version", opts)
7695 fm.startitem()
7698 fm.startitem()
7696 fm.write(
7699 fm.write(
7697 b"ver", _(b"Mercurial Distributed SCM (version %s)\n"), util.version()
7700 b"ver", _(b"Mercurial Distributed SCM (version %s)\n"), util.version()
7698 )
7701 )
7699 license = _(
7702 license = _(
7700 b"(see https://mercurial-scm.org for more information)\n"
7703 b"(see https://mercurial-scm.org for more information)\n"
7701 b"\nCopyright (C) 2005-2020 Matt Mackall and others\n"
7704 b"\nCopyright (C) 2005-2020 Matt Mackall and others\n"
7702 b"This is free software; see the source for copying conditions. "
7705 b"This is free software; see the source for copying conditions. "
7703 b"There is NO\nwarranty; "
7706 b"There is NO\nwarranty; "
7704 b"not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
7707 b"not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
7705 )
7708 )
7706 if not ui.quiet:
7709 if not ui.quiet:
7707 fm.plain(license)
7710 fm.plain(license)
7708
7711
7709 if ui.verbose:
7712 if ui.verbose:
7710 fm.plain(_(b"\nEnabled extensions:\n\n"))
7713 fm.plain(_(b"\nEnabled extensions:\n\n"))
7711 # format names and versions into columns
7714 # format names and versions into columns
7712 names = []
7715 names = []
7713 vers = []
7716 vers = []
7714 isinternals = []
7717 isinternals = []
7715 for name, module in sorted(extensions.extensions()):
7718 for name, module in sorted(extensions.extensions()):
7716 names.append(name)
7719 names.append(name)
7717 vers.append(extensions.moduleversion(module) or None)
7720 vers.append(extensions.moduleversion(module) or None)
7718 isinternals.append(extensions.ismoduleinternal(module))
7721 isinternals.append(extensions.ismoduleinternal(module))
7719 fn = fm.nested(b"extensions", tmpl=b'{name}\n')
7722 fn = fm.nested(b"extensions", tmpl=b'{name}\n')
7720 if names:
7723 if names:
7721 namefmt = b" %%-%ds " % max(len(n) for n in names)
7724 namefmt = b" %%-%ds " % max(len(n) for n in names)
7722 places = [_(b"external"), _(b"internal")]
7725 places = [_(b"external"), _(b"internal")]
7723 for n, v, p in zip(names, vers, isinternals):
7726 for n, v, p in zip(names, vers, isinternals):
7724 fn.startitem()
7727 fn.startitem()
7725 fn.condwrite(ui.verbose, b"name", namefmt, n)
7728 fn.condwrite(ui.verbose, b"name", namefmt, n)
7726 if ui.verbose:
7729 if ui.verbose:
7727 fn.plain(b"%s " % places[p])
7730 fn.plain(b"%s " % places[p])
7728 fn.data(bundled=p)
7731 fn.data(bundled=p)
7729 fn.condwrite(ui.verbose and v, b"ver", b"%s", v)
7732 fn.condwrite(ui.verbose and v, b"ver", b"%s", v)
7730 if ui.verbose:
7733 if ui.verbose:
7731 fn.plain(b"\n")
7734 fn.plain(b"\n")
7732 fn.end()
7735 fn.end()
7733 fm.end()
7736 fm.end()
7734
7737
7735
7738
7736 def loadcmdtable(ui, name, cmdtable):
7739 def loadcmdtable(ui, name, cmdtable):
7737 """Load command functions from specified cmdtable"""
7740 """Load command functions from specified cmdtable"""
7738 overrides = [cmd for cmd in cmdtable if cmd in table]
7741 overrides = [cmd for cmd in cmdtable if cmd in table]
7739 if overrides:
7742 if overrides:
7740 ui.warn(
7743 ui.warn(
7741 _(b"extension '%s' overrides commands: %s\n")
7744 _(b"extension '%s' overrides commands: %s\n")
7742 % (name, b" ".join(overrides))
7745 % (name, b" ".join(overrides))
7743 )
7746 )
7744 table.update(cmdtable)
7747 table.update(cmdtable)
@@ -1,3921 +1,3925 b''
1 Short help:
1 Short help:
2
2
3 $ hg
3 $ hg
4 Mercurial Distributed SCM
4 Mercurial Distributed SCM
5
5
6 basic commands:
6 basic commands:
7
7
8 add add the specified files on the next commit
8 add add the specified files on the next commit
9 annotate show changeset information by line for each file
9 annotate show changeset information by line for each file
10 clone make a copy of an existing repository
10 clone make a copy of an existing repository
11 commit commit the specified files or all outstanding changes
11 commit commit the specified files or all outstanding changes
12 diff diff repository (or selected files)
12 diff diff repository (or selected files)
13 export dump the header and diffs for one or more changesets
13 export dump the header and diffs for one or more changesets
14 forget forget the specified files on the next commit
14 forget forget the specified files on the next commit
15 init create a new repository in the given directory
15 init create a new repository in the given directory
16 log show revision history of entire repository or files
16 log show revision history of entire repository or files
17 merge merge another revision into working directory
17 merge merge another revision into working directory
18 pull pull changes from the specified source
18 pull pull changes from the specified source
19 push push changes to the specified destination
19 push push changes to the specified destination
20 remove remove the specified files on the next commit
20 remove remove the specified files on the next commit
21 serve start stand-alone webserver
21 serve start stand-alone webserver
22 status show changed files in the working directory
22 status show changed files in the working directory
23 summary summarize working directory state
23 summary summarize working directory state
24 update update working directory (or switch revisions)
24 update update working directory (or switch revisions)
25
25
26 (use 'hg help' for the full list of commands or 'hg -v' for details)
26 (use 'hg help' for the full list of commands or 'hg -v' for details)
27
27
28 $ hg -q
28 $ hg -q
29 add add the specified files on the next commit
29 add add the specified files on the next commit
30 annotate show changeset information by line for each file
30 annotate show changeset information by line for each file
31 clone make a copy of an existing repository
31 clone make a copy of an existing repository
32 commit commit the specified files or all outstanding changes
32 commit commit the specified files or all outstanding changes
33 diff diff repository (or selected files)
33 diff diff repository (or selected files)
34 export dump the header and diffs for one or more changesets
34 export dump the header and diffs for one or more changesets
35 forget forget the specified files on the next commit
35 forget forget the specified files on the next commit
36 init create a new repository in the given directory
36 init create a new repository in the given directory
37 log show revision history of entire repository or files
37 log show revision history of entire repository or files
38 merge merge another revision into working directory
38 merge merge another revision into working directory
39 pull pull changes from the specified source
39 pull pull changes from the specified source
40 push push changes to the specified destination
40 push push changes to the specified destination
41 remove remove the specified files on the next commit
41 remove remove the specified files on the next commit
42 serve start stand-alone webserver
42 serve start stand-alone webserver
43 status show changed files in the working directory
43 status show changed files in the working directory
44 summary summarize working directory state
44 summary summarize working directory state
45 update update working directory (or switch revisions)
45 update update working directory (or switch revisions)
46
46
47 Extra extensions will be printed in help output in a non-reliable order since
47 Extra extensions will be printed in help output in a non-reliable order since
48 the extension is unknown.
48 the extension is unknown.
49 #if no-extraextensions
49 #if no-extraextensions
50
50
51 $ hg help
51 $ hg help
52 Mercurial Distributed SCM
52 Mercurial Distributed SCM
53
53
54 list of commands:
54 list of commands:
55
55
56 Repository creation:
56 Repository creation:
57
57
58 clone make a copy of an existing repository
58 clone make a copy of an existing repository
59 init create a new repository in the given directory
59 init create a new repository in the given directory
60
60
61 Remote repository management:
61 Remote repository management:
62
62
63 incoming show new changesets found in source
63 incoming show new changesets found in source
64 outgoing show changesets not found in the destination
64 outgoing show changesets not found in the destination
65 paths show aliases for remote repositories
65 paths show aliases for remote repositories
66 pull pull changes from the specified source
66 pull pull changes from the specified source
67 push push changes to the specified destination
67 push push changes to the specified destination
68 serve start stand-alone webserver
68 serve start stand-alone webserver
69
69
70 Change creation:
70 Change creation:
71
71
72 commit commit the specified files or all outstanding changes
72 commit commit the specified files or all outstanding changes
73
73
74 Change manipulation:
74 Change manipulation:
75
75
76 backout reverse effect of earlier changeset
76 backout reverse effect of earlier changeset
77 graft copy changes from other branches onto the current branch
77 graft copy changes from other branches onto the current branch
78 merge merge another revision into working directory
78 merge merge another revision into working directory
79
79
80 Change organization:
80 Change organization:
81
81
82 bookmarks create a new bookmark or list existing bookmarks
82 bookmarks create a new bookmark or list existing bookmarks
83 branch set or show the current branch name
83 branch set or show the current branch name
84 branches list repository named branches
84 branches list repository named branches
85 phase set or show the current phase name
85 phase set or show the current phase name
86 tag add one or more tags for the current or given revision
86 tag add one or more tags for the current or given revision
87 tags list repository tags
87 tags list repository tags
88
88
89 File content management:
89 File content management:
90
90
91 annotate show changeset information by line for each file
91 annotate show changeset information by line for each file
92 cat output the current or given revision of files
92 cat output the current or given revision of files
93 copy mark files as copied for the next commit
93 copy mark files as copied for the next commit
94 diff diff repository (or selected files)
94 diff diff repository (or selected files)
95 grep search for a pattern in specified files
95 grep search for a pattern in specified files
96
96
97 Change navigation:
97 Change navigation:
98
98
99 bisect subdivision search of changesets
99 bisect subdivision search of changesets
100 heads show branch heads
100 heads show branch heads
101 identify identify the working directory or specified revision
101 identify identify the working directory or specified revision
102 log show revision history of entire repository or files
102 log show revision history of entire repository or files
103
103
104 Working directory management:
104 Working directory management:
105
105
106 add add the specified files on the next commit
106 add add the specified files on the next commit
107 addremove add all new files, delete all missing files
107 addremove add all new files, delete all missing files
108 files list tracked files
108 files list tracked files
109 forget forget the specified files on the next commit
109 forget forget the specified files on the next commit
110 remove remove the specified files on the next commit
110 remove remove the specified files on the next commit
111 rename rename files; equivalent of copy + remove
111 rename rename files; equivalent of copy + remove
112 resolve redo merges or set/view the merge status of files
112 resolve redo merges or set/view the merge status of files
113 revert restore files to their checkout state
113 revert restore files to their checkout state
114 root print the root (top) of the current working directory
114 root print the root (top) of the current working directory
115 shelve save and set aside changes from the working directory
115 shelve save and set aside changes from the working directory
116 status show changed files in the working directory
116 status show changed files in the working directory
117 summary summarize working directory state
117 summary summarize working directory state
118 unshelve restore a shelved change to the working directory
118 unshelve restore a shelved change to the working directory
119 update update working directory (or switch revisions)
119 update update working directory (or switch revisions)
120
120
121 Change import/export:
121 Change import/export:
122
122
123 archive create an unversioned archive of a repository revision
123 archive create an unversioned archive of a repository revision
124 bundle create a bundle file
124 bundle create a bundle file
125 export dump the header and diffs for one or more changesets
125 export dump the header and diffs for one or more changesets
126 import import an ordered set of patches
126 import import an ordered set of patches
127 unbundle apply one or more bundle files
127 unbundle apply one or more bundle files
128
128
129 Repository maintenance:
129 Repository maintenance:
130
130
131 manifest output the current or given revision of the project manifest
131 manifest output the current or given revision of the project manifest
132 recover roll back an interrupted transaction
132 recover roll back an interrupted transaction
133 verify verify the integrity of the repository
133 verify verify the integrity of the repository
134
134
135 Help:
135 Help:
136
136
137 config show combined config settings from all hgrc files
137 config show combined config settings from all hgrc files
138 help show help for a given topic or a help overview
138 help show help for a given topic or a help overview
139 version output version and copyright information
139 version output version and copyright information
140
140
141 additional help topics:
141 additional help topics:
142
142
143 Mercurial identifiers:
143 Mercurial identifiers:
144
144
145 filesets Specifying File Sets
145 filesets Specifying File Sets
146 hgignore Syntax for Mercurial Ignore Files
146 hgignore Syntax for Mercurial Ignore Files
147 patterns File Name Patterns
147 patterns File Name Patterns
148 revisions Specifying Revisions
148 revisions Specifying Revisions
149 urls URL Paths
149 urls URL Paths
150
150
151 Mercurial output:
151 Mercurial output:
152
152
153 color Colorizing Outputs
153 color Colorizing Outputs
154 dates Date Formats
154 dates Date Formats
155 diffs Diff Formats
155 diffs Diff Formats
156 templating Template Usage
156 templating Template Usage
157
157
158 Mercurial configuration:
158 Mercurial configuration:
159
159
160 config Configuration Files
160 config Configuration Files
161 environment Environment Variables
161 environment Environment Variables
162 extensions Using Additional Features
162 extensions Using Additional Features
163 flags Command-line flags
163 flags Command-line flags
164 hgweb Configuring hgweb
164 hgweb Configuring hgweb
165 merge-tools Merge Tools
165 merge-tools Merge Tools
166 pager Pager Support
166 pager Pager Support
167
167
168 Concepts:
168 Concepts:
169
169
170 bundlespec Bundle File Formats
170 bundlespec Bundle File Formats
171 glossary Glossary
171 glossary Glossary
172 phases Working with Phases
172 phases Working with Phases
173 subrepos Subrepositories
173 subrepos Subrepositories
174
174
175 Miscellaneous:
175 Miscellaneous:
176
176
177 deprecated Deprecated Features
177 deprecated Deprecated Features
178 internals Technical implementation topics
178 internals Technical implementation topics
179 scripting Using Mercurial from scripts and automation
179 scripting Using Mercurial from scripts and automation
180
180
181 (use 'hg help -v' to show built-in aliases and global options)
181 (use 'hg help -v' to show built-in aliases and global options)
182
182
183 $ hg -q help
183 $ hg -q help
184 Repository creation:
184 Repository creation:
185
185
186 clone make a copy of an existing repository
186 clone make a copy of an existing repository
187 init create a new repository in the given directory
187 init create a new repository in the given directory
188
188
189 Remote repository management:
189 Remote repository management:
190
190
191 incoming show new changesets found in source
191 incoming show new changesets found in source
192 outgoing show changesets not found in the destination
192 outgoing show changesets not found in the destination
193 paths show aliases for remote repositories
193 paths show aliases for remote repositories
194 pull pull changes from the specified source
194 pull pull changes from the specified source
195 push push changes to the specified destination
195 push push changes to the specified destination
196 serve start stand-alone webserver
196 serve start stand-alone webserver
197
197
198 Change creation:
198 Change creation:
199
199
200 commit commit the specified files or all outstanding changes
200 commit commit the specified files or all outstanding changes
201
201
202 Change manipulation:
202 Change manipulation:
203
203
204 backout reverse effect of earlier changeset
204 backout reverse effect of earlier changeset
205 graft copy changes from other branches onto the current branch
205 graft copy changes from other branches onto the current branch
206 merge merge another revision into working directory
206 merge merge another revision into working directory
207
207
208 Change organization:
208 Change organization:
209
209
210 bookmarks create a new bookmark or list existing bookmarks
210 bookmarks create a new bookmark or list existing bookmarks
211 branch set or show the current branch name
211 branch set or show the current branch name
212 branches list repository named branches
212 branches list repository named branches
213 phase set or show the current phase name
213 phase set or show the current phase name
214 tag add one or more tags for the current or given revision
214 tag add one or more tags for the current or given revision
215 tags list repository tags
215 tags list repository tags
216
216
217 File content management:
217 File content management:
218
218
219 annotate show changeset information by line for each file
219 annotate show changeset information by line for each file
220 cat output the current or given revision of files
220 cat output the current or given revision of files
221 copy mark files as copied for the next commit
221 copy mark files as copied for the next commit
222 diff diff repository (or selected files)
222 diff diff repository (or selected files)
223 grep search for a pattern in specified files
223 grep search for a pattern in specified files
224
224
225 Change navigation:
225 Change navigation:
226
226
227 bisect subdivision search of changesets
227 bisect subdivision search of changesets
228 heads show branch heads
228 heads show branch heads
229 identify identify the working directory or specified revision
229 identify identify the working directory or specified revision
230 log show revision history of entire repository or files
230 log show revision history of entire repository or files
231
231
232 Working directory management:
232 Working directory management:
233
233
234 add add the specified files on the next commit
234 add add the specified files on the next commit
235 addremove add all new files, delete all missing files
235 addremove add all new files, delete all missing files
236 files list tracked files
236 files list tracked files
237 forget forget the specified files on the next commit
237 forget forget the specified files on the next commit
238 remove remove the specified files on the next commit
238 remove remove the specified files on the next commit
239 rename rename files; equivalent of copy + remove
239 rename rename files; equivalent of copy + remove
240 resolve redo merges or set/view the merge status of files
240 resolve redo merges or set/view the merge status of files
241 revert restore files to their checkout state
241 revert restore files to their checkout state
242 root print the root (top) of the current working directory
242 root print the root (top) of the current working directory
243 shelve save and set aside changes from the working directory
243 shelve save and set aside changes from the working directory
244 status show changed files in the working directory
244 status show changed files in the working directory
245 summary summarize working directory state
245 summary summarize working directory state
246 unshelve restore a shelved change to the working directory
246 unshelve restore a shelved change to the working directory
247 update update working directory (or switch revisions)
247 update update working directory (or switch revisions)
248
248
249 Change import/export:
249 Change import/export:
250
250
251 archive create an unversioned archive of a repository revision
251 archive create an unversioned archive of a repository revision
252 bundle create a bundle file
252 bundle create a bundle file
253 export dump the header and diffs for one or more changesets
253 export dump the header and diffs for one or more changesets
254 import import an ordered set of patches
254 import import an ordered set of patches
255 unbundle apply one or more bundle files
255 unbundle apply one or more bundle files
256
256
257 Repository maintenance:
257 Repository maintenance:
258
258
259 manifest output the current or given revision of the project manifest
259 manifest output the current or given revision of the project manifest
260 recover roll back an interrupted transaction
260 recover roll back an interrupted transaction
261 verify verify the integrity of the repository
261 verify verify the integrity of the repository
262
262
263 Help:
263 Help:
264
264
265 config show combined config settings from all hgrc files
265 config show combined config settings from all hgrc files
266 help show help for a given topic or a help overview
266 help show help for a given topic or a help overview
267 version output version and copyright information
267 version output version and copyright information
268
268
269 additional help topics:
269 additional help topics:
270
270
271 Mercurial identifiers:
271 Mercurial identifiers:
272
272
273 filesets Specifying File Sets
273 filesets Specifying File Sets
274 hgignore Syntax for Mercurial Ignore Files
274 hgignore Syntax for Mercurial Ignore Files
275 patterns File Name Patterns
275 patterns File Name Patterns
276 revisions Specifying Revisions
276 revisions Specifying Revisions
277 urls URL Paths
277 urls URL Paths
278
278
279 Mercurial output:
279 Mercurial output:
280
280
281 color Colorizing Outputs
281 color Colorizing Outputs
282 dates Date Formats
282 dates Date Formats
283 diffs Diff Formats
283 diffs Diff Formats
284 templating Template Usage
284 templating Template Usage
285
285
286 Mercurial configuration:
286 Mercurial configuration:
287
287
288 config Configuration Files
288 config Configuration Files
289 environment Environment Variables
289 environment Environment Variables
290 extensions Using Additional Features
290 extensions Using Additional Features
291 flags Command-line flags
291 flags Command-line flags
292 hgweb Configuring hgweb
292 hgweb Configuring hgweb
293 merge-tools Merge Tools
293 merge-tools Merge Tools
294 pager Pager Support
294 pager Pager Support
295
295
296 Concepts:
296 Concepts:
297
297
298 bundlespec Bundle File Formats
298 bundlespec Bundle File Formats
299 glossary Glossary
299 glossary Glossary
300 phases Working with Phases
300 phases Working with Phases
301 subrepos Subrepositories
301 subrepos Subrepositories
302
302
303 Miscellaneous:
303 Miscellaneous:
304
304
305 deprecated Deprecated Features
305 deprecated Deprecated Features
306 internals Technical implementation topics
306 internals Technical implementation topics
307 scripting Using Mercurial from scripts and automation
307 scripting Using Mercurial from scripts and automation
308
308
309 Test extension help:
309 Test extension help:
310 $ hg help extensions --config extensions.rebase= --config extensions.children=
310 $ hg help extensions --config extensions.rebase= --config extensions.children=
311 Using Additional Features
311 Using Additional Features
312 """""""""""""""""""""""""
312 """""""""""""""""""""""""
313
313
314 Mercurial has the ability to add new features through the use of
314 Mercurial has the ability to add new features through the use of
315 extensions. Extensions may add new commands, add options to existing
315 extensions. Extensions may add new commands, add options to existing
316 commands, change the default behavior of commands, or implement hooks.
316 commands, change the default behavior of commands, or implement hooks.
317
317
318 To enable the "foo" extension, either shipped with Mercurial or in the
318 To enable the "foo" extension, either shipped with Mercurial or in the
319 Python search path, create an entry for it in your configuration file,
319 Python search path, create an entry for it in your configuration file,
320 like this:
320 like this:
321
321
322 [extensions]
322 [extensions]
323 foo =
323 foo =
324
324
325 You may also specify the full path to an extension:
325 You may also specify the full path to an extension:
326
326
327 [extensions]
327 [extensions]
328 myfeature = ~/.hgext/myfeature.py
328 myfeature = ~/.hgext/myfeature.py
329
329
330 See 'hg help config' for more information on configuration files.
330 See 'hg help config' for more information on configuration files.
331
331
332 Extensions are not loaded by default for a variety of reasons: they can
332 Extensions are not loaded by default for a variety of reasons: they can
333 increase startup overhead; they may be meant for advanced usage only; they
333 increase startup overhead; they may be meant for advanced usage only; they
334 may provide potentially dangerous abilities (such as letting you destroy
334 may provide potentially dangerous abilities (such as letting you destroy
335 or modify history); they might not be ready for prime time; or they may
335 or modify history); they might not be ready for prime time; or they may
336 alter some usual behaviors of stock Mercurial. It is thus up to the user
336 alter some usual behaviors of stock Mercurial. It is thus up to the user
337 to activate extensions as needed.
337 to activate extensions as needed.
338
338
339 To explicitly disable an extension enabled in a configuration file of
339 To explicitly disable an extension enabled in a configuration file of
340 broader scope, prepend its path with !:
340 broader scope, prepend its path with !:
341
341
342 [extensions]
342 [extensions]
343 # disabling extension bar residing in /path/to/extension/bar.py
343 # disabling extension bar residing in /path/to/extension/bar.py
344 bar = !/path/to/extension/bar.py
344 bar = !/path/to/extension/bar.py
345 # ditto, but no path was supplied for extension baz
345 # ditto, but no path was supplied for extension baz
346 baz = !
346 baz = !
347
347
348 enabled extensions:
348 enabled extensions:
349
349
350 children command to display child changesets (DEPRECATED)
350 children command to display child changesets (DEPRECATED)
351 rebase command to move sets of revisions to a different ancestor
351 rebase command to move sets of revisions to a different ancestor
352
352
353 disabled extensions:
353 disabled extensions:
354
354
355 acl hooks for controlling repository access
355 acl hooks for controlling repository access
356 blackbox log repository events to a blackbox for debugging
356 blackbox log repository events to a blackbox for debugging
357 bugzilla hooks for integrating with the Bugzilla bug tracker
357 bugzilla hooks for integrating with the Bugzilla bug tracker
358 censor erase file content at a given revision
358 censor erase file content at a given revision
359 churn command to display statistics about repository history
359 churn command to display statistics about repository history
360 clonebundles advertise pre-generated bundles to seed clones
360 clonebundles advertise pre-generated bundles to seed clones
361 closehead close arbitrary heads without checking them out first
361 closehead close arbitrary heads without checking them out first
362 convert import revisions from foreign VCS repositories into
362 convert import revisions from foreign VCS repositories into
363 Mercurial
363 Mercurial
364 eol automatically manage newlines in repository files
364 eol automatically manage newlines in repository files
365 extdiff command to allow external programs to compare revisions
365 extdiff command to allow external programs to compare revisions
366 factotum http authentication with factotum
366 factotum http authentication with factotum
367 fastexport export repositories as git fast-import stream
367 fastexport export repositories as git fast-import stream
368 githelp try mapping git commands to Mercurial commands
368 githelp try mapping git commands to Mercurial commands
369 gpg commands to sign and verify changesets
369 gpg commands to sign and verify changesets
370 hgk browse the repository in a graphical way
370 hgk browse the repository in a graphical way
371 highlight syntax highlighting for hgweb (requires Pygments)
371 highlight syntax highlighting for hgweb (requires Pygments)
372 histedit interactive history editing
372 histedit interactive history editing
373 keyword expand keywords in tracked files
373 keyword expand keywords in tracked files
374 largefiles track large binary files
374 largefiles track large binary files
375 mq manage a stack of patches
375 mq manage a stack of patches
376 notify hooks for sending email push notifications
376 notify hooks for sending email push notifications
377 patchbomb command to send changesets as (a series of) patch emails
377 patchbomb command to send changesets as (a series of) patch emails
378 purge command to delete untracked files from the working
378 purge command to delete untracked files from the working
379 directory
379 directory
380 relink recreates hardlinks between repository clones
380 relink recreates hardlinks between repository clones
381 schemes extend schemes with shortcuts to repository swarms
381 schemes extend schemes with shortcuts to repository swarms
382 share share a common history between several working directories
382 share share a common history between several working directories
383 transplant command to transplant changesets from another branch
383 transplant command to transplant changesets from another branch
384 win32mbcs allow the use of MBCS paths with problematic encodings
384 win32mbcs allow the use of MBCS paths with problematic encodings
385 zeroconf discover and advertise repositories on the local network
385 zeroconf discover and advertise repositories on the local network
386
386
387 #endif
387 #endif
388
388
389 Verify that deprecated extensions are included if --verbose:
389 Verify that deprecated extensions are included if --verbose:
390
390
391 $ hg -v help extensions | grep children
391 $ hg -v help extensions | grep children
392 children command to display child changesets (DEPRECATED)
392 children command to display child changesets (DEPRECATED)
393
393
394 Verify that extension keywords appear in help templates
394 Verify that extension keywords appear in help templates
395
395
396 $ hg help --config extensions.transplant= templating|grep transplant > /dev/null
396 $ hg help --config extensions.transplant= templating|grep transplant > /dev/null
397
397
398 Test short command list with verbose option
398 Test short command list with verbose option
399
399
400 $ hg -v help shortlist
400 $ hg -v help shortlist
401 Mercurial Distributed SCM
401 Mercurial Distributed SCM
402
402
403 basic commands:
403 basic commands:
404
404
405 abort abort an unfinished operation (EXPERIMENTAL)
405 abort abort an unfinished operation (EXPERIMENTAL)
406 add add the specified files on the next commit
406 add add the specified files on the next commit
407 annotate, blame
407 annotate, blame
408 show changeset information by line for each file
408 show changeset information by line for each file
409 clone make a copy of an existing repository
409 clone make a copy of an existing repository
410 commit, ci commit the specified files or all outstanding changes
410 commit, ci commit the specified files or all outstanding changes
411 continue resumes an interrupted operation (EXPERIMENTAL)
411 continue resumes an interrupted operation (EXPERIMENTAL)
412 diff diff repository (or selected files)
412 diff diff repository (or selected files)
413 export dump the header and diffs for one or more changesets
413 export dump the header and diffs for one or more changesets
414 forget forget the specified files on the next commit
414 forget forget the specified files on the next commit
415 init create a new repository in the given directory
415 init create a new repository in the given directory
416 log, history show revision history of entire repository or files
416 log, history show revision history of entire repository or files
417 merge merge another revision into working directory
417 merge merge another revision into working directory
418 pull pull changes from the specified source
418 pull pull changes from the specified source
419 push push changes to the specified destination
419 push push changes to the specified destination
420 remove, rm remove the specified files on the next commit
420 remove, rm remove the specified files on the next commit
421 serve start stand-alone webserver
421 serve start stand-alone webserver
422 status, st show changed files in the working directory
422 status, st show changed files in the working directory
423 summary, sum summarize working directory state
423 summary, sum summarize working directory state
424 update, up, checkout, co
424 update, up, checkout, co
425 update working directory (or switch revisions)
425 update working directory (or switch revisions)
426
426
427 global options ([+] can be repeated):
427 global options ([+] can be repeated):
428
428
429 -R --repository REPO repository root directory or name of overlay bundle
429 -R --repository REPO repository root directory or name of overlay bundle
430 file
430 file
431 --cwd DIR change working directory
431 --cwd DIR change working directory
432 -y --noninteractive do not prompt, automatically pick the first choice for
432 -y --noninteractive do not prompt, automatically pick the first choice for
433 all prompts
433 all prompts
434 -q --quiet suppress output
434 -q --quiet suppress output
435 -v --verbose enable additional output
435 -v --verbose enable additional output
436 --color TYPE when to colorize (boolean, always, auto, never, or
436 --color TYPE when to colorize (boolean, always, auto, never, or
437 debug)
437 debug)
438 --config CONFIG [+] set/override config option (use 'section.name=value')
438 --config CONFIG [+] set/override config option (use 'section.name=value')
439 --debug enable debugging output
439 --debug enable debugging output
440 --debugger start debugger
440 --debugger start debugger
441 --encoding ENCODE set the charset encoding (default: ascii)
441 --encoding ENCODE set the charset encoding (default: ascii)
442 --encodingmode MODE set the charset encoding mode (default: strict)
442 --encodingmode MODE set the charset encoding mode (default: strict)
443 --traceback always print a traceback on exception
443 --traceback always print a traceback on exception
444 --time time how long the command takes
444 --time time how long the command takes
445 --profile print command execution profile
445 --profile print command execution profile
446 --version output version information and exit
446 --version output version information and exit
447 -h --help display help and exit
447 -h --help display help and exit
448 --hidden consider hidden changesets
448 --hidden consider hidden changesets
449 --pager TYPE when to paginate (boolean, always, auto, or never)
449 --pager TYPE when to paginate (boolean, always, auto, or never)
450 (default: auto)
450 (default: auto)
451
451
452 (use 'hg help' for the full list of commands)
452 (use 'hg help' for the full list of commands)
453
453
454 $ hg add -h
454 $ hg add -h
455 hg add [OPTION]... [FILE]...
455 hg add [OPTION]... [FILE]...
456
456
457 add the specified files on the next commit
457 add the specified files on the next commit
458
458
459 Schedule files to be version controlled and added to the repository.
459 Schedule files to be version controlled and added to the repository.
460
460
461 The files will be added to the repository at the next commit. To undo an
461 The files will be added to the repository at the next commit. To undo an
462 add before that, see 'hg forget'.
462 add before that, see 'hg forget'.
463
463
464 If no names are given, add all files to the repository (except files
464 If no names are given, add all files to the repository (except files
465 matching ".hgignore").
465 matching ".hgignore").
466
466
467 Returns 0 if all files are successfully added.
467 Returns 0 if all files are successfully added.
468
468
469 options ([+] can be repeated):
469 options ([+] can be repeated):
470
470
471 -I --include PATTERN [+] include names matching the given patterns
471 -I --include PATTERN [+] include names matching the given patterns
472 -X --exclude PATTERN [+] exclude names matching the given patterns
472 -X --exclude PATTERN [+] exclude names matching the given patterns
473 -S --subrepos recurse into subrepositories
473 -S --subrepos recurse into subrepositories
474 -n --dry-run do not perform actions, just print output
474 -n --dry-run do not perform actions, just print output
475
475
476 (some details hidden, use --verbose to show complete help)
476 (some details hidden, use --verbose to show complete help)
477
477
478 Verbose help for add
478 Verbose help for add
479
479
480 $ hg add -hv
480 $ hg add -hv
481 hg add [OPTION]... [FILE]...
481 hg add [OPTION]... [FILE]...
482
482
483 add the specified files on the next commit
483 add the specified files on the next commit
484
484
485 Schedule files to be version controlled and added to the repository.
485 Schedule files to be version controlled and added to the repository.
486
486
487 The files will be added to the repository at the next commit. To undo an
487 The files will be added to the repository at the next commit. To undo an
488 add before that, see 'hg forget'.
488 add before that, see 'hg forget'.
489
489
490 If no names are given, add all files to the repository (except files
490 If no names are given, add all files to the repository (except files
491 matching ".hgignore").
491 matching ".hgignore").
492
492
493 Examples:
493 Examples:
494
494
495 - New (unknown) files are added automatically by 'hg add':
495 - New (unknown) files are added automatically by 'hg add':
496
496
497 $ ls
497 $ ls
498 foo.c
498 foo.c
499 $ hg status
499 $ hg status
500 ? foo.c
500 ? foo.c
501 $ hg add
501 $ hg add
502 adding foo.c
502 adding foo.c
503 $ hg status
503 $ hg status
504 A foo.c
504 A foo.c
505
505
506 - Specific files to be added can be specified:
506 - Specific files to be added can be specified:
507
507
508 $ ls
508 $ ls
509 bar.c foo.c
509 bar.c foo.c
510 $ hg status
510 $ hg status
511 ? bar.c
511 ? bar.c
512 ? foo.c
512 ? foo.c
513 $ hg add bar.c
513 $ hg add bar.c
514 $ hg status
514 $ hg status
515 A bar.c
515 A bar.c
516 ? foo.c
516 ? foo.c
517
517
518 Returns 0 if all files are successfully added.
518 Returns 0 if all files are successfully added.
519
519
520 options ([+] can be repeated):
520 options ([+] can be repeated):
521
521
522 -I --include PATTERN [+] include names matching the given patterns
522 -I --include PATTERN [+] include names matching the given patterns
523 -X --exclude PATTERN [+] exclude names matching the given patterns
523 -X --exclude PATTERN [+] exclude names matching the given patterns
524 -S --subrepos recurse into subrepositories
524 -S --subrepos recurse into subrepositories
525 -n --dry-run do not perform actions, just print output
525 -n --dry-run do not perform actions, just print output
526
526
527 global options ([+] can be repeated):
527 global options ([+] can be repeated):
528
528
529 -R --repository REPO repository root directory or name of overlay bundle
529 -R --repository REPO repository root directory or name of overlay bundle
530 file
530 file
531 --cwd DIR change working directory
531 --cwd DIR change working directory
532 -y --noninteractive do not prompt, automatically pick the first choice for
532 -y --noninteractive do not prompt, automatically pick the first choice for
533 all prompts
533 all prompts
534 -q --quiet suppress output
534 -q --quiet suppress output
535 -v --verbose enable additional output
535 -v --verbose enable additional output
536 --color TYPE when to colorize (boolean, always, auto, never, or
536 --color TYPE when to colorize (boolean, always, auto, never, or
537 debug)
537 debug)
538 --config CONFIG [+] set/override config option (use 'section.name=value')
538 --config CONFIG [+] set/override config option (use 'section.name=value')
539 --debug enable debugging output
539 --debug enable debugging output
540 --debugger start debugger
540 --debugger start debugger
541 --encoding ENCODE set the charset encoding (default: ascii)
541 --encoding ENCODE set the charset encoding (default: ascii)
542 --encodingmode MODE set the charset encoding mode (default: strict)
542 --encodingmode MODE set the charset encoding mode (default: strict)
543 --traceback always print a traceback on exception
543 --traceback always print a traceback on exception
544 --time time how long the command takes
544 --time time how long the command takes
545 --profile print command execution profile
545 --profile print command execution profile
546 --version output version information and exit
546 --version output version information and exit
547 -h --help display help and exit
547 -h --help display help and exit
548 --hidden consider hidden changesets
548 --hidden consider hidden changesets
549 --pager TYPE when to paginate (boolean, always, auto, or never)
549 --pager TYPE when to paginate (boolean, always, auto, or never)
550 (default: auto)
550 (default: auto)
551
551
552 Test the textwidth config option
552 Test the textwidth config option
553
553
554 $ hg root -h --config ui.textwidth=50
554 $ hg root -h --config ui.textwidth=50
555 hg root
555 hg root
556
556
557 print the root (top) of the current working
557 print the root (top) of the current working
558 directory
558 directory
559
559
560 Print the root directory of the current
560 Print the root directory of the current
561 repository.
561 repository.
562
562
563 Returns 0 on success.
563 Returns 0 on success.
564
564
565 options:
565 options:
566
566
567 -T --template TEMPLATE display with template
567 -T --template TEMPLATE display with template
568
568
569 (some details hidden, use --verbose to show
569 (some details hidden, use --verbose to show
570 complete help)
570 complete help)
571
571
572 Test help option with version option
572 Test help option with version option
573
573
574 $ hg add -h --version
574 $ hg add -h --version
575 Mercurial Distributed SCM (version *) (glob)
575 Mercurial Distributed SCM (version *) (glob)
576 (see https://mercurial-scm.org for more information)
576 (see https://mercurial-scm.org for more information)
577
577
578 Copyright (C) 2005-* Matt Mackall and others (glob)
578 Copyright (C) 2005-* Matt Mackall and others (glob)
579 This is free software; see the source for copying conditions. There is NO
579 This is free software; see the source for copying conditions. There is NO
580 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
580 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
581
581
582 $ hg add --skjdfks
582 $ hg add --skjdfks
583 hg add: option --skjdfks not recognized
583 hg add: option --skjdfks not recognized
584 hg add [OPTION]... [FILE]...
584 hg add [OPTION]... [FILE]...
585
585
586 add the specified files on the next commit
586 add the specified files on the next commit
587
587
588 options ([+] can be repeated):
588 options ([+] can be repeated):
589
589
590 -I --include PATTERN [+] include names matching the given patterns
590 -I --include PATTERN [+] include names matching the given patterns
591 -X --exclude PATTERN [+] exclude names matching the given patterns
591 -X --exclude PATTERN [+] exclude names matching the given patterns
592 -S --subrepos recurse into subrepositories
592 -S --subrepos recurse into subrepositories
593 -n --dry-run do not perform actions, just print output
593 -n --dry-run do not perform actions, just print output
594
594
595 (use 'hg add -h' to show more help)
595 (use 'hg add -h' to show more help)
596 [255]
596 [255]
597
597
598 Test ambiguous command help
598 Test ambiguous command help
599
599
600 $ hg help ad
600 $ hg help ad
601 list of commands:
601 list of commands:
602
602
603 add add the specified files on the next commit
603 add add the specified files on the next commit
604 addremove add all new files, delete all missing files
604 addremove add all new files, delete all missing files
605
605
606 (use 'hg help -v ad' to show built-in aliases and global options)
606 (use 'hg help -v ad' to show built-in aliases and global options)
607
607
608 Test command without options
608 Test command without options
609
609
610 $ hg help verify
610 $ hg help verify
611 hg verify
611 hg verify
612
612
613 verify the integrity of the repository
613 verify the integrity of the repository
614
614
615 Verify the integrity of the current repository.
615 Verify the integrity of the current repository.
616
616
617 This will perform an extensive check of the repository's integrity,
617 This will perform an extensive check of the repository's integrity,
618 validating the hashes and checksums of each entry in the changelog,
618 validating the hashes and checksums of each entry in the changelog,
619 manifest, and tracked files, as well as the integrity of their crosslinks
619 manifest, and tracked files, as well as the integrity of their crosslinks
620 and indices.
620 and indices.
621
621
622 Please see https://mercurial-scm.org/wiki/RepositoryCorruption for more
622 Please see https://mercurial-scm.org/wiki/RepositoryCorruption for more
623 information about recovery from corruption of the repository.
623 information about recovery from corruption of the repository.
624
624
625 Returns 0 on success, 1 if errors are encountered.
625 Returns 0 on success, 1 if errors are encountered.
626
626
627 options:
627 options:
628
628
629 (some details hidden, use --verbose to show complete help)
629 (some details hidden, use --verbose to show complete help)
630
630
631 $ hg help diff
631 $ hg help diff
632 hg diff [OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...
632 hg diff [OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...
633
633
634 diff repository (or selected files)
634 diff repository (or selected files)
635
635
636 Show differences between revisions for the specified files.
636 Show differences between revisions for the specified files.
637
637
638 Differences between files are shown using the unified diff format.
638 Differences between files are shown using the unified diff format.
639
639
640 Note:
640 Note:
641 'hg diff' may generate unexpected results for merges, as it will
641 'hg diff' may generate unexpected results for merges, as it will
642 default to comparing against the working directory's first parent
642 default to comparing against the working directory's first parent
643 changeset if no revisions are specified.
643 changeset if no revisions are specified.
644
644
645 When two revision arguments are given, then changes are shown between
645 By default, the working directory files are compared to its first parent.
646 those revisions. If only one revision is specified then that revision is
646 To see the differences from another revision, use --from. To see the
647 compared to the working directory, and, when no revisions are specified,
647 difference to another revision, use --to. For example, 'hg diff --from .^'
648 the working directory files are compared to its first parent.
648 will show the differences from the working copy's grandparent to the
649 working copy, 'hg diff --to .' will show the diff from the working copy to
650 its parent (i.e. the reverse of the default), and 'hg diff --from 1.0 --to
651 1.2' will show the diff between those two revisions.
649
652
650 Alternatively you can specify -c/--change with a revision to see the
653 Alternatively you can specify -c/--change with a revision to see the
651 changes in that changeset relative to its first parent.
654 changes in that changeset relative to its first parent (i.e. 'hg diff -c
655 42' is equivalent to 'hg diff --from 42^ --to 42')
652
656
653 Without the -a/--text option, diff will avoid generating diffs of files it
657 Without the -a/--text option, diff will avoid generating diffs of files it
654 detects as binary. With -a, diff will generate a diff anyway, probably
658 detects as binary. With -a, diff will generate a diff anyway, probably
655 with undesirable results.
659 with undesirable results.
656
660
657 Use the -g/--git option to generate diffs in the git extended diff format.
661 Use the -g/--git option to generate diffs in the git extended diff format.
658 For more information, read 'hg help diffs'.
662 For more information, read 'hg help diffs'.
659
663
660 Returns 0 on success.
664 Returns 0 on success.
661
665
662 options ([+] can be repeated):
666 options ([+] can be repeated):
663
667
664 -r --rev REV [+] revision
668 -r --rev REV [+] revision
665 --from REV revision to diff from
669 --from REV revision to diff from
666 --to REV revision to diff to
670 --to REV revision to diff to
667 -c --change REV change made by revision
671 -c --change REV change made by revision
668 -a --text treat all files as text
672 -a --text treat all files as text
669 -g --git use git extended diff format
673 -g --git use git extended diff format
670 --binary generate binary diffs in git mode (default)
674 --binary generate binary diffs in git mode (default)
671 --nodates omit dates from diff headers
675 --nodates omit dates from diff headers
672 --noprefix omit a/ and b/ prefixes from filenames
676 --noprefix omit a/ and b/ prefixes from filenames
673 -p --show-function show which function each change is in
677 -p --show-function show which function each change is in
674 --reverse produce a diff that undoes the changes
678 --reverse produce a diff that undoes the changes
675 -w --ignore-all-space ignore white space when comparing lines
679 -w --ignore-all-space ignore white space when comparing lines
676 -b --ignore-space-change ignore changes in the amount of white space
680 -b --ignore-space-change ignore changes in the amount of white space
677 -B --ignore-blank-lines ignore changes whose lines are all blank
681 -B --ignore-blank-lines ignore changes whose lines are all blank
678 -Z --ignore-space-at-eol ignore changes in whitespace at EOL
682 -Z --ignore-space-at-eol ignore changes in whitespace at EOL
679 -U --unified NUM number of lines of context to show
683 -U --unified NUM number of lines of context to show
680 --stat output diffstat-style summary of changes
684 --stat output diffstat-style summary of changes
681 --root DIR produce diffs relative to subdirectory
685 --root DIR produce diffs relative to subdirectory
682 -I --include PATTERN [+] include names matching the given patterns
686 -I --include PATTERN [+] include names matching the given patterns
683 -X --exclude PATTERN [+] exclude names matching the given patterns
687 -X --exclude PATTERN [+] exclude names matching the given patterns
684 -S --subrepos recurse into subrepositories
688 -S --subrepos recurse into subrepositories
685
689
686 (some details hidden, use --verbose to show complete help)
690 (some details hidden, use --verbose to show complete help)
687
691
688 $ hg help status
692 $ hg help status
689 hg status [OPTION]... [FILE]...
693 hg status [OPTION]... [FILE]...
690
694
691 aliases: st
695 aliases: st
692
696
693 show changed files in the working directory
697 show changed files in the working directory
694
698
695 Show status of files in the repository. If names are given, only files
699 Show status of files in the repository. If names are given, only files
696 that match are shown. Files that are clean or ignored or the source of a
700 that match are shown. Files that are clean or ignored or the source of a
697 copy/move operation, are not listed unless -c/--clean, -i/--ignored,
701 copy/move operation, are not listed unless -c/--clean, -i/--ignored,
698 -C/--copies or -A/--all are given. Unless options described with "show
702 -C/--copies or -A/--all are given. Unless options described with "show
699 only ..." are given, the options -mardu are used.
703 only ..." are given, the options -mardu are used.
700
704
701 Option -q/--quiet hides untracked (unknown and ignored) files unless
705 Option -q/--quiet hides untracked (unknown and ignored) files unless
702 explicitly requested with -u/--unknown or -i/--ignored.
706 explicitly requested with -u/--unknown or -i/--ignored.
703
707
704 Note:
708 Note:
705 'hg status' may appear to disagree with diff if permissions have
709 'hg status' may appear to disagree with diff if permissions have
706 changed or a merge has occurred. The standard diff format does not
710 changed or a merge has occurred. The standard diff format does not
707 report permission changes and diff only reports changes relative to one
711 report permission changes and diff only reports changes relative to one
708 merge parent.
712 merge parent.
709
713
710 If one revision is given, it is used as the base revision. If two
714 If one revision is given, it is used as the base revision. If two
711 revisions are given, the differences between them are shown. The --change
715 revisions are given, the differences between them are shown. The --change
712 option can also be used as a shortcut to list the changed files of a
716 option can also be used as a shortcut to list the changed files of a
713 revision from its first parent.
717 revision from its first parent.
714
718
715 The codes used to show the status of files are:
719 The codes used to show the status of files are:
716
720
717 M = modified
721 M = modified
718 A = added
722 A = added
719 R = removed
723 R = removed
720 C = clean
724 C = clean
721 ! = missing (deleted by non-hg command, but still tracked)
725 ! = missing (deleted by non-hg command, but still tracked)
722 ? = not tracked
726 ? = not tracked
723 I = ignored
727 I = ignored
724 = origin of the previous file (with --copies)
728 = origin of the previous file (with --copies)
725
729
726 Returns 0 on success.
730 Returns 0 on success.
727
731
728 options ([+] can be repeated):
732 options ([+] can be repeated):
729
733
730 -A --all show status of all files
734 -A --all show status of all files
731 -m --modified show only modified files
735 -m --modified show only modified files
732 -a --added show only added files
736 -a --added show only added files
733 -r --removed show only removed files
737 -r --removed show only removed files
734 -d --deleted show only missing files
738 -d --deleted show only missing files
735 -c --clean show only files without changes
739 -c --clean show only files without changes
736 -u --unknown show only unknown (not tracked) files
740 -u --unknown show only unknown (not tracked) files
737 -i --ignored show only ignored files
741 -i --ignored show only ignored files
738 -n --no-status hide status prefix
742 -n --no-status hide status prefix
739 -C --copies show source of copied files
743 -C --copies show source of copied files
740 -0 --print0 end filenames with NUL, for use with xargs
744 -0 --print0 end filenames with NUL, for use with xargs
741 --rev REV [+] show difference from revision
745 --rev REV [+] show difference from revision
742 --change REV list the changed files of a revision
746 --change REV list the changed files of a revision
743 -I --include PATTERN [+] include names matching the given patterns
747 -I --include PATTERN [+] include names matching the given patterns
744 -X --exclude PATTERN [+] exclude names matching the given patterns
748 -X --exclude PATTERN [+] exclude names matching the given patterns
745 -S --subrepos recurse into subrepositories
749 -S --subrepos recurse into subrepositories
746 -T --template TEMPLATE display with template
750 -T --template TEMPLATE display with template
747
751
748 (some details hidden, use --verbose to show complete help)
752 (some details hidden, use --verbose to show complete help)
749
753
750 $ hg -q help status
754 $ hg -q help status
751 hg status [OPTION]... [FILE]...
755 hg status [OPTION]... [FILE]...
752
756
753 show changed files in the working directory
757 show changed files in the working directory
754
758
755 $ hg help foo
759 $ hg help foo
756 abort: no such help topic: foo
760 abort: no such help topic: foo
757 (try 'hg help --keyword foo')
761 (try 'hg help --keyword foo')
758 [255]
762 [255]
759
763
760 $ hg skjdfks
764 $ hg skjdfks
761 hg: unknown command 'skjdfks'
765 hg: unknown command 'skjdfks'
762 (use 'hg help' for a list of commands)
766 (use 'hg help' for a list of commands)
763 [255]
767 [255]
764
768
765 Typoed command gives suggestion
769 Typoed command gives suggestion
766 $ hg puls
770 $ hg puls
767 hg: unknown command 'puls'
771 hg: unknown command 'puls'
768 (did you mean one of pull, push?)
772 (did you mean one of pull, push?)
769 [255]
773 [255]
770
774
771 Not enabled extension gets suggested
775 Not enabled extension gets suggested
772
776
773 $ hg rebase
777 $ hg rebase
774 hg: unknown command 'rebase'
778 hg: unknown command 'rebase'
775 'rebase' is provided by the following extension:
779 'rebase' is provided by the following extension:
776
780
777 rebase command to move sets of revisions to a different ancestor
781 rebase command to move sets of revisions to a different ancestor
778
782
779 (use 'hg help extensions' for information on enabling extensions)
783 (use 'hg help extensions' for information on enabling extensions)
780 [255]
784 [255]
781
785
782 Disabled extension gets suggested
786 Disabled extension gets suggested
783 $ hg --config extensions.rebase=! rebase
787 $ hg --config extensions.rebase=! rebase
784 hg: unknown command 'rebase'
788 hg: unknown command 'rebase'
785 'rebase' is provided by the following extension:
789 'rebase' is provided by the following extension:
786
790
787 rebase command to move sets of revisions to a different ancestor
791 rebase command to move sets of revisions to a different ancestor
788
792
789 (use 'hg help extensions' for information on enabling extensions)
793 (use 'hg help extensions' for information on enabling extensions)
790 [255]
794 [255]
791
795
792 Checking that help adapts based on the config:
796 Checking that help adapts based on the config:
793
797
794 $ hg help diff --config ui.tweakdefaults=true | egrep -e '^ *(-g|config)'
798 $ hg help diff --config ui.tweakdefaults=true | egrep -e '^ *(-g|config)'
795 -g --[no-]git use git extended diff format (default: on from
799 -g --[no-]git use git extended diff format (default: on from
796 config)
800 config)
797
801
798 Make sure that we don't run afoul of the help system thinking that
802 Make sure that we don't run afoul of the help system thinking that
799 this is a section and erroring out weirdly.
803 this is a section and erroring out weirdly.
800
804
801 $ hg .log
805 $ hg .log
802 hg: unknown command '.log'
806 hg: unknown command '.log'
803 (did you mean log?)
807 (did you mean log?)
804 [255]
808 [255]
805
809
806 $ hg log.
810 $ hg log.
807 hg: unknown command 'log.'
811 hg: unknown command 'log.'
808 (did you mean log?)
812 (did you mean log?)
809 [255]
813 [255]
810 $ hg pu.lh
814 $ hg pu.lh
811 hg: unknown command 'pu.lh'
815 hg: unknown command 'pu.lh'
812 (did you mean one of pull, push?)
816 (did you mean one of pull, push?)
813 [255]
817 [255]
814
818
815 $ cat > helpext.py <<EOF
819 $ cat > helpext.py <<EOF
816 > import os
820 > import os
817 > from mercurial import commands, fancyopts, registrar
821 > from mercurial import commands, fancyopts, registrar
818 >
822 >
819 > def func(arg):
823 > def func(arg):
820 > return '%sfoo' % arg
824 > return '%sfoo' % arg
821 > class customopt(fancyopts.customopt):
825 > class customopt(fancyopts.customopt):
822 > def newstate(self, oldstate, newparam, abort):
826 > def newstate(self, oldstate, newparam, abort):
823 > return '%sbar' % oldstate
827 > return '%sbar' % oldstate
824 > cmdtable = {}
828 > cmdtable = {}
825 > command = registrar.command(cmdtable)
829 > command = registrar.command(cmdtable)
826 >
830 >
827 > @command(b'nohelp',
831 > @command(b'nohelp',
828 > [(b'', b'longdesc', 3, b'x'*67),
832 > [(b'', b'longdesc', 3, b'x'*67),
829 > (b'n', b'', None, b'normal desc'),
833 > (b'n', b'', None, b'normal desc'),
830 > (b'', b'newline', b'', b'line1\nline2'),
834 > (b'', b'newline', b'', b'line1\nline2'),
831 > (b'', b'default-off', False, b'enable X'),
835 > (b'', b'default-off', False, b'enable X'),
832 > (b'', b'default-on', True, b'enable Y'),
836 > (b'', b'default-on', True, b'enable Y'),
833 > (b'', b'callableopt', func, b'adds foo'),
837 > (b'', b'callableopt', func, b'adds foo'),
834 > (b'', b'customopt', customopt(''), b'adds bar'),
838 > (b'', b'customopt', customopt(''), b'adds bar'),
835 > (b'', b'customopt-withdefault', customopt('foo'), b'adds bar')],
839 > (b'', b'customopt-withdefault', customopt('foo'), b'adds bar')],
836 > b'hg nohelp',
840 > b'hg nohelp',
837 > norepo=True)
841 > norepo=True)
838 > @command(b'debugoptADV', [(b'', b'aopt', None, b'option is (ADVANCED)')])
842 > @command(b'debugoptADV', [(b'', b'aopt', None, b'option is (ADVANCED)')])
839 > @command(b'debugoptDEP', [(b'', b'dopt', None, b'option is (DEPRECATED)')])
843 > @command(b'debugoptDEP', [(b'', b'dopt', None, b'option is (DEPRECATED)')])
840 > @command(b'debugoptEXP', [(b'', b'eopt', None, b'option is (EXPERIMENTAL)')])
844 > @command(b'debugoptEXP', [(b'', b'eopt', None, b'option is (EXPERIMENTAL)')])
841 > def nohelp(ui, *args, **kwargs):
845 > def nohelp(ui, *args, **kwargs):
842 > pass
846 > pass
843 >
847 >
844 > @command(b'hashelp', [], b'hg hashelp', norepo=True)
848 > @command(b'hashelp', [], b'hg hashelp', norepo=True)
845 > def hashelp(ui, *args, **kwargs):
849 > def hashelp(ui, *args, **kwargs):
846 > """Extension command's help"""
850 > """Extension command's help"""
847 >
851 >
848 > def uisetup(ui):
852 > def uisetup(ui):
849 > ui.setconfig(b'alias', b'shellalias', b'!echo hi', b'helpext')
853 > ui.setconfig(b'alias', b'shellalias', b'!echo hi', b'helpext')
850 > ui.setconfig(b'alias', b'hgalias', b'summary', b'helpext')
854 > ui.setconfig(b'alias', b'hgalias', b'summary', b'helpext')
851 > ui.setconfig(b'alias', b'hgalias:doc', b'My doc', b'helpext')
855 > ui.setconfig(b'alias', b'hgalias:doc', b'My doc', b'helpext')
852 > ui.setconfig(b'alias', b'hgalias:category', b'navigation', b'helpext')
856 > ui.setconfig(b'alias', b'hgalias:category', b'navigation', b'helpext')
853 > ui.setconfig(b'alias', b'hgaliasnodoc', b'summary', b'helpext')
857 > ui.setconfig(b'alias', b'hgaliasnodoc', b'summary', b'helpext')
854 >
858 >
855 > EOF
859 > EOF
856 $ echo '[extensions]' >> $HGRCPATH
860 $ echo '[extensions]' >> $HGRCPATH
857 $ echo "helpext = `pwd`/helpext.py" >> $HGRCPATH
861 $ echo "helpext = `pwd`/helpext.py" >> $HGRCPATH
858
862
859 Test for aliases
863 Test for aliases
860
864
861 $ hg help | grep hgalias
865 $ hg help | grep hgalias
862 hgalias My doc
866 hgalias My doc
863
867
864 $ hg help hgalias
868 $ hg help hgalias
865 hg hgalias [--remote]
869 hg hgalias [--remote]
866
870
867 alias for: hg summary
871 alias for: hg summary
868
872
869 My doc
873 My doc
870
874
871 defined by: helpext
875 defined by: helpext
872
876
873 options:
877 options:
874
878
875 --remote check for push and pull
879 --remote check for push and pull
876
880
877 (some details hidden, use --verbose to show complete help)
881 (some details hidden, use --verbose to show complete help)
878 $ hg help hgaliasnodoc
882 $ hg help hgaliasnodoc
879 hg hgaliasnodoc [--remote]
883 hg hgaliasnodoc [--remote]
880
884
881 alias for: hg summary
885 alias for: hg summary
882
886
883 summarize working directory state
887 summarize working directory state
884
888
885 This generates a brief summary of the working directory state, including
889 This generates a brief summary of the working directory state, including
886 parents, branch, commit status, phase and available updates.
890 parents, branch, commit status, phase and available updates.
887
891
888 With the --remote option, this will check the default paths for incoming
892 With the --remote option, this will check the default paths for incoming
889 and outgoing changes. This can be time-consuming.
893 and outgoing changes. This can be time-consuming.
890
894
891 Returns 0 on success.
895 Returns 0 on success.
892
896
893 defined by: helpext
897 defined by: helpext
894
898
895 options:
899 options:
896
900
897 --remote check for push and pull
901 --remote check for push and pull
898
902
899 (some details hidden, use --verbose to show complete help)
903 (some details hidden, use --verbose to show complete help)
900
904
901 $ hg help shellalias
905 $ hg help shellalias
902 hg shellalias
906 hg shellalias
903
907
904 shell alias for: echo hi
908 shell alias for: echo hi
905
909
906 (no help text available)
910 (no help text available)
907
911
908 defined by: helpext
912 defined by: helpext
909
913
910 (some details hidden, use --verbose to show complete help)
914 (some details hidden, use --verbose to show complete help)
911
915
912 Test command with no help text
916 Test command with no help text
913
917
914 $ hg help nohelp
918 $ hg help nohelp
915 hg nohelp
919 hg nohelp
916
920
917 (no help text available)
921 (no help text available)
918
922
919 options:
923 options:
920
924
921 --longdesc VALUE
925 --longdesc VALUE
922 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
926 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
923 xxxxxxxxxxxxxxxxxxxxxxx (default: 3)
927 xxxxxxxxxxxxxxxxxxxxxxx (default: 3)
924 -n -- normal desc
928 -n -- normal desc
925 --newline VALUE line1 line2
929 --newline VALUE line1 line2
926 --default-off enable X
930 --default-off enable X
927 --[no-]default-on enable Y (default: on)
931 --[no-]default-on enable Y (default: on)
928 --callableopt VALUE adds foo
932 --callableopt VALUE adds foo
929 --customopt VALUE adds bar
933 --customopt VALUE adds bar
930 --customopt-withdefault VALUE adds bar (default: foo)
934 --customopt-withdefault VALUE adds bar (default: foo)
931
935
932 (some details hidden, use --verbose to show complete help)
936 (some details hidden, use --verbose to show complete help)
933
937
934 Test that default list of commands includes extension commands that have help,
938 Test that default list of commands includes extension commands that have help,
935 but not those that don't, except in verbose mode, when a keyword is passed, or
939 but not those that don't, except in verbose mode, when a keyword is passed, or
936 when help about the extension is requested.
940 when help about the extension is requested.
937
941
938 #if no-extraextensions
942 #if no-extraextensions
939
943
940 $ hg help | grep hashelp
944 $ hg help | grep hashelp
941 hashelp Extension command's help
945 hashelp Extension command's help
942 $ hg help | grep nohelp
946 $ hg help | grep nohelp
943 [1]
947 [1]
944 $ hg help -v | grep nohelp
948 $ hg help -v | grep nohelp
945 nohelp (no help text available)
949 nohelp (no help text available)
946
950
947 $ hg help -k nohelp
951 $ hg help -k nohelp
948 Commands:
952 Commands:
949
953
950 nohelp hg nohelp
954 nohelp hg nohelp
951
955
952 Extension Commands:
956 Extension Commands:
953
957
954 nohelp (no help text available)
958 nohelp (no help text available)
955
959
956 $ hg help helpext
960 $ hg help helpext
957 helpext extension - no help text available
961 helpext extension - no help text available
958
962
959 list of commands:
963 list of commands:
960
964
961 hashelp Extension command's help
965 hashelp Extension command's help
962 nohelp (no help text available)
966 nohelp (no help text available)
963
967
964 (use 'hg help -v helpext' to show built-in aliases and global options)
968 (use 'hg help -v helpext' to show built-in aliases and global options)
965
969
966 #endif
970 #endif
967
971
968 Test list of internal help commands
972 Test list of internal help commands
969
973
970 $ hg help debug
974 $ hg help debug
971 debug commands (internal and unsupported):
975 debug commands (internal and unsupported):
972
976
973 debugancestor
977 debugancestor
974 find the ancestor revision of two revisions in a given index
978 find the ancestor revision of two revisions in a given index
975 debugantivirusrunning
979 debugantivirusrunning
976 attempt to trigger an antivirus scanner to see if one is active
980 attempt to trigger an antivirus scanner to see if one is active
977 debugapplystreamclonebundle
981 debugapplystreamclonebundle
978 apply a stream clone bundle file
982 apply a stream clone bundle file
979 debugbackupbundle
983 debugbackupbundle
980 lists the changesets available in backup bundles
984 lists the changesets available in backup bundles
981 debugbuilddag
985 debugbuilddag
982 builds a repo with a given DAG from scratch in the current
986 builds a repo with a given DAG from scratch in the current
983 empty repo
987 empty repo
984 debugbundle lists the contents of a bundle
988 debugbundle lists the contents of a bundle
985 debugcapabilities
989 debugcapabilities
986 lists the capabilities of a remote peer
990 lists the capabilities of a remote peer
987 debugchangedfiles
991 debugchangedfiles
988 list the stored files changes for a revision
992 list the stored files changes for a revision
989 debugcheckstate
993 debugcheckstate
990 validate the correctness of the current dirstate
994 validate the correctness of the current dirstate
991 debugcolor show available color, effects or style
995 debugcolor show available color, effects or style
992 debugcommands
996 debugcommands
993 list all available commands and options
997 list all available commands and options
994 debugcomplete
998 debugcomplete
995 returns the completion list associated with the given command
999 returns the completion list associated with the given command
996 debugcreatestreamclonebundle
1000 debugcreatestreamclonebundle
997 create a stream clone bundle file
1001 create a stream clone bundle file
998 debugdag format the changelog or an index DAG as a concise textual
1002 debugdag format the changelog or an index DAG as a concise textual
999 description
1003 description
1000 debugdata dump the contents of a data file revision
1004 debugdata dump the contents of a data file revision
1001 debugdate parse and display a date
1005 debugdate parse and display a date
1002 debugdeltachain
1006 debugdeltachain
1003 dump information about delta chains in a revlog
1007 dump information about delta chains in a revlog
1004 debugdirstate
1008 debugdirstate
1005 show the contents of the current dirstate
1009 show the contents of the current dirstate
1006 debugdiscovery
1010 debugdiscovery
1007 runs the changeset discovery protocol in isolation
1011 runs the changeset discovery protocol in isolation
1008 debugdownload
1012 debugdownload
1009 download a resource using Mercurial logic and config
1013 download a resource using Mercurial logic and config
1010 debugextensions
1014 debugextensions
1011 show information about active extensions
1015 show information about active extensions
1012 debugfileset parse and apply a fileset specification
1016 debugfileset parse and apply a fileset specification
1013 debugformat display format information about the current repository
1017 debugformat display format information about the current repository
1014 debugfsinfo show information detected about current filesystem
1018 debugfsinfo show information detected about current filesystem
1015 debuggetbundle
1019 debuggetbundle
1016 retrieves a bundle from a repo
1020 retrieves a bundle from a repo
1017 debugignore display the combined ignore pattern and information about
1021 debugignore display the combined ignore pattern and information about
1018 ignored files
1022 ignored files
1019 debugindex dump index data for a storage primitive
1023 debugindex dump index data for a storage primitive
1020 debugindexdot
1024 debugindexdot
1021 dump an index DAG as a graphviz dot file
1025 dump an index DAG as a graphviz dot file
1022 debugindexstats
1026 debugindexstats
1023 show stats related to the changelog index
1027 show stats related to the changelog index
1024 debuginstall test Mercurial installation
1028 debuginstall test Mercurial installation
1025 debugknown test whether node ids are known to a repo
1029 debugknown test whether node ids are known to a repo
1026 debuglocks show or modify state of locks
1030 debuglocks show or modify state of locks
1027 debugmanifestfulltextcache
1031 debugmanifestfulltextcache
1028 show, clear or amend the contents of the manifest fulltext
1032 show, clear or amend the contents of the manifest fulltext
1029 cache
1033 cache
1030 debugmergestate
1034 debugmergestate
1031 print merge state
1035 print merge state
1032 debugnamecomplete
1036 debugnamecomplete
1033 complete "names" - tags, open branch names, bookmark names
1037 complete "names" - tags, open branch names, bookmark names
1034 debugnodemap write and inspect on disk nodemap
1038 debugnodemap write and inspect on disk nodemap
1035 debugobsolete
1039 debugobsolete
1036 create arbitrary obsolete marker
1040 create arbitrary obsolete marker
1037 debugoptADV (no help text available)
1041 debugoptADV (no help text available)
1038 debugoptDEP (no help text available)
1042 debugoptDEP (no help text available)
1039 debugoptEXP (no help text available)
1043 debugoptEXP (no help text available)
1040 debugp1copies
1044 debugp1copies
1041 dump copy information compared to p1
1045 dump copy information compared to p1
1042 debugp2copies
1046 debugp2copies
1043 dump copy information compared to p2
1047 dump copy information compared to p2
1044 debugpathcomplete
1048 debugpathcomplete
1045 complete part or all of a tracked path
1049 complete part or all of a tracked path
1046 debugpathcopies
1050 debugpathcopies
1047 show copies between two revisions
1051 show copies between two revisions
1048 debugpeer establish a connection to a peer repository
1052 debugpeer establish a connection to a peer repository
1049 debugpickmergetool
1053 debugpickmergetool
1050 examine which merge tool is chosen for specified file
1054 examine which merge tool is chosen for specified file
1051 debugpushkey access the pushkey key/value protocol
1055 debugpushkey access the pushkey key/value protocol
1052 debugpvec (no help text available)
1056 debugpvec (no help text available)
1053 debugrebuilddirstate
1057 debugrebuilddirstate
1054 rebuild the dirstate as it would look like for the given
1058 rebuild the dirstate as it would look like for the given
1055 revision
1059 revision
1056 debugrebuildfncache
1060 debugrebuildfncache
1057 rebuild the fncache file
1061 rebuild the fncache file
1058 debugrename dump rename information
1062 debugrename dump rename information
1059 debugrequires
1063 debugrequires
1060 print the current repo requirements
1064 print the current repo requirements
1061 debugrevlog show data and statistics about a revlog
1065 debugrevlog show data and statistics about a revlog
1062 debugrevlogindex
1066 debugrevlogindex
1063 dump the contents of a revlog index
1067 dump the contents of a revlog index
1064 debugrevspec parse and apply a revision specification
1068 debugrevspec parse and apply a revision specification
1065 debugserve run a server with advanced settings
1069 debugserve run a server with advanced settings
1066 debugsetparents
1070 debugsetparents
1067 manually set the parents of the current working directory
1071 manually set the parents of the current working directory
1068 debugsidedata
1072 debugsidedata
1069 dump the side data for a cl/manifest/file revision
1073 dump the side data for a cl/manifest/file revision
1070 debugssl test a secure connection to a server
1074 debugssl test a secure connection to a server
1071 debugstrip strip changesets and all their descendants from the repository
1075 debugstrip strip changesets and all their descendants from the repository
1072 debugsub (no help text available)
1076 debugsub (no help text available)
1073 debugsuccessorssets
1077 debugsuccessorssets
1074 show set of successors for revision
1078 show set of successors for revision
1075 debugtagscache
1079 debugtagscache
1076 display the contents of .hg/cache/hgtagsfnodes1
1080 display the contents of .hg/cache/hgtagsfnodes1
1077 debugtemplate
1081 debugtemplate
1078 parse and apply a template
1082 parse and apply a template
1079 debuguigetpass
1083 debuguigetpass
1080 show prompt to type password
1084 show prompt to type password
1081 debuguiprompt
1085 debuguiprompt
1082 show plain prompt
1086 show plain prompt
1083 debugupdatecaches
1087 debugupdatecaches
1084 warm all known caches in the repository
1088 warm all known caches in the repository
1085 debugupgraderepo
1089 debugupgraderepo
1086 upgrade a repository to use different features
1090 upgrade a repository to use different features
1087 debugwalk show how files match on given patterns
1091 debugwalk show how files match on given patterns
1088 debugwhyunstable
1092 debugwhyunstable
1089 explain instabilities of a changeset
1093 explain instabilities of a changeset
1090 debugwireargs
1094 debugwireargs
1091 (no help text available)
1095 (no help text available)
1092 debugwireproto
1096 debugwireproto
1093 send wire protocol commands to a server
1097 send wire protocol commands to a server
1094
1098
1095 (use 'hg help -v debug' to show built-in aliases and global options)
1099 (use 'hg help -v debug' to show built-in aliases and global options)
1096
1100
1097 internals topic renders index of available sub-topics
1101 internals topic renders index of available sub-topics
1098
1102
1099 $ hg help internals
1103 $ hg help internals
1100 Technical implementation topics
1104 Technical implementation topics
1101 """""""""""""""""""""""""""""""
1105 """""""""""""""""""""""""""""""
1102
1106
1103 To access a subtopic, use "hg help internals.{subtopic-name}"
1107 To access a subtopic, use "hg help internals.{subtopic-name}"
1104
1108
1105 bid-merge Bid Merge Algorithm
1109 bid-merge Bid Merge Algorithm
1106 bundle2 Bundle2
1110 bundle2 Bundle2
1107 bundles Bundles
1111 bundles Bundles
1108 cbor CBOR
1112 cbor CBOR
1109 censor Censor
1113 censor Censor
1110 changegroups Changegroups
1114 changegroups Changegroups
1111 config Config Registrar
1115 config Config Registrar
1112 extensions Extension API
1116 extensions Extension API
1113 mergestate Mergestate
1117 mergestate Mergestate
1114 requirements Repository Requirements
1118 requirements Repository Requirements
1115 revlogs Revision Logs
1119 revlogs Revision Logs
1116 wireprotocol Wire Protocol
1120 wireprotocol Wire Protocol
1117 wireprotocolrpc
1121 wireprotocolrpc
1118 Wire Protocol RPC
1122 Wire Protocol RPC
1119 wireprotocolv2
1123 wireprotocolv2
1120 Wire Protocol Version 2
1124 Wire Protocol Version 2
1121
1125
1122 sub-topics can be accessed
1126 sub-topics can be accessed
1123
1127
1124 $ hg help internals.changegroups
1128 $ hg help internals.changegroups
1125 Changegroups
1129 Changegroups
1126 """"""""""""
1130 """"""""""""
1127
1131
1128 Changegroups are representations of repository revlog data, specifically
1132 Changegroups are representations of repository revlog data, specifically
1129 the changelog data, root/flat manifest data, treemanifest data, and
1133 the changelog data, root/flat manifest data, treemanifest data, and
1130 filelogs.
1134 filelogs.
1131
1135
1132 There are 3 versions of changegroups: "1", "2", and "3". From a high-
1136 There are 3 versions of changegroups: "1", "2", and "3". From a high-
1133 level, versions "1" and "2" are almost exactly the same, with the only
1137 level, versions "1" and "2" are almost exactly the same, with the only
1134 difference being an additional item in the *delta header*. Version "3"
1138 difference being an additional item in the *delta header*. Version "3"
1135 adds support for storage flags in the *delta header* and optionally
1139 adds support for storage flags in the *delta header* and optionally
1136 exchanging treemanifests (enabled by setting an option on the
1140 exchanging treemanifests (enabled by setting an option on the
1137 "changegroup" part in the bundle2).
1141 "changegroup" part in the bundle2).
1138
1142
1139 Changegroups when not exchanging treemanifests consist of 3 logical
1143 Changegroups when not exchanging treemanifests consist of 3 logical
1140 segments:
1144 segments:
1141
1145
1142 +---------------------------------+
1146 +---------------------------------+
1143 | | | |
1147 | | | |
1144 | changeset | manifest | filelogs |
1148 | changeset | manifest | filelogs |
1145 | | | |
1149 | | | |
1146 | | | |
1150 | | | |
1147 +---------------------------------+
1151 +---------------------------------+
1148
1152
1149 When exchanging treemanifests, there are 4 logical segments:
1153 When exchanging treemanifests, there are 4 logical segments:
1150
1154
1151 +-------------------------------------------------+
1155 +-------------------------------------------------+
1152 | | | | |
1156 | | | | |
1153 | changeset | root | treemanifests | filelogs |
1157 | changeset | root | treemanifests | filelogs |
1154 | | manifest | | |
1158 | | manifest | | |
1155 | | | | |
1159 | | | | |
1156 +-------------------------------------------------+
1160 +-------------------------------------------------+
1157
1161
1158 The principle building block of each segment is a *chunk*. A *chunk* is a
1162 The principle building block of each segment is a *chunk*. A *chunk* is a
1159 framed piece of data:
1163 framed piece of data:
1160
1164
1161 +---------------------------------------+
1165 +---------------------------------------+
1162 | | |
1166 | | |
1163 | length | data |
1167 | length | data |
1164 | (4 bytes) | (<length - 4> bytes) |
1168 | (4 bytes) | (<length - 4> bytes) |
1165 | | |
1169 | | |
1166 +---------------------------------------+
1170 +---------------------------------------+
1167
1171
1168 All integers are big-endian signed integers. Each chunk starts with a
1172 All integers are big-endian signed integers. Each chunk starts with a
1169 32-bit integer indicating the length of the entire chunk (including the
1173 32-bit integer indicating the length of the entire chunk (including the
1170 length field itself).
1174 length field itself).
1171
1175
1172 There is a special case chunk that has a value of 0 for the length
1176 There is a special case chunk that has a value of 0 for the length
1173 ("0x00000000"). We call this an *empty chunk*.
1177 ("0x00000000"). We call this an *empty chunk*.
1174
1178
1175 Delta Groups
1179 Delta Groups
1176 ============
1180 ============
1177
1181
1178 A *delta group* expresses the content of a revlog as a series of deltas,
1182 A *delta group* expresses the content of a revlog as a series of deltas,
1179 or patches against previous revisions.
1183 or patches against previous revisions.
1180
1184
1181 Delta groups consist of 0 or more *chunks* followed by the *empty chunk*
1185 Delta groups consist of 0 or more *chunks* followed by the *empty chunk*
1182 to signal the end of the delta group:
1186 to signal the end of the delta group:
1183
1187
1184 +------------------------------------------------------------------------+
1188 +------------------------------------------------------------------------+
1185 | | | | | |
1189 | | | | | |
1186 | chunk0 length | chunk0 data | chunk1 length | chunk1 data | 0x0 |
1190 | chunk0 length | chunk0 data | chunk1 length | chunk1 data | 0x0 |
1187 | (4 bytes) | (various) | (4 bytes) | (various) | (4 bytes) |
1191 | (4 bytes) | (various) | (4 bytes) | (various) | (4 bytes) |
1188 | | | | | |
1192 | | | | | |
1189 +------------------------------------------------------------------------+
1193 +------------------------------------------------------------------------+
1190
1194
1191 Each *chunk*'s data consists of the following:
1195 Each *chunk*'s data consists of the following:
1192
1196
1193 +---------------------------------------+
1197 +---------------------------------------+
1194 | | |
1198 | | |
1195 | delta header | delta data |
1199 | delta header | delta data |
1196 | (various by version) | (various) |
1200 | (various by version) | (various) |
1197 | | |
1201 | | |
1198 +---------------------------------------+
1202 +---------------------------------------+
1199
1203
1200 The *delta data* is a series of *delta*s that describe a diff from an
1204 The *delta data* is a series of *delta*s that describe a diff from an
1201 existing entry (either that the recipient already has, or previously
1205 existing entry (either that the recipient already has, or previously
1202 specified in the bundle/changegroup).
1206 specified in the bundle/changegroup).
1203
1207
1204 The *delta header* is different between versions "1", "2", and "3" of the
1208 The *delta header* is different between versions "1", "2", and "3" of the
1205 changegroup format.
1209 changegroup format.
1206
1210
1207 Version 1 (headerlen=80):
1211 Version 1 (headerlen=80):
1208
1212
1209 +------------------------------------------------------+
1213 +------------------------------------------------------+
1210 | | | | |
1214 | | | | |
1211 | node | p1 node | p2 node | link node |
1215 | node | p1 node | p2 node | link node |
1212 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) |
1216 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) |
1213 | | | | |
1217 | | | | |
1214 +------------------------------------------------------+
1218 +------------------------------------------------------+
1215
1219
1216 Version 2 (headerlen=100):
1220 Version 2 (headerlen=100):
1217
1221
1218 +------------------------------------------------------------------+
1222 +------------------------------------------------------------------+
1219 | | | | | |
1223 | | | | | |
1220 | node | p1 node | p2 node | base node | link node |
1224 | node | p1 node | p2 node | base node | link node |
1221 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) |
1225 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) |
1222 | | | | | |
1226 | | | | | |
1223 +------------------------------------------------------------------+
1227 +------------------------------------------------------------------+
1224
1228
1225 Version 3 (headerlen=102):
1229 Version 3 (headerlen=102):
1226
1230
1227 +------------------------------------------------------------------------------+
1231 +------------------------------------------------------------------------------+
1228 | | | | | | |
1232 | | | | | | |
1229 | node | p1 node | p2 node | base node | link node | flags |
1233 | node | p1 node | p2 node | base node | link node | flags |
1230 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (2 bytes) |
1234 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (2 bytes) |
1231 | | | | | | |
1235 | | | | | | |
1232 +------------------------------------------------------------------------------+
1236 +------------------------------------------------------------------------------+
1233
1237
1234 The *delta data* consists of "chunklen - 4 - headerlen" bytes, which
1238 The *delta data* consists of "chunklen - 4 - headerlen" bytes, which
1235 contain a series of *delta*s, densely packed (no separators). These deltas
1239 contain a series of *delta*s, densely packed (no separators). These deltas
1236 describe a diff from an existing entry (either that the recipient already
1240 describe a diff from an existing entry (either that the recipient already
1237 has, or previously specified in the bundle/changegroup). The format is
1241 has, or previously specified in the bundle/changegroup). The format is
1238 described more fully in "hg help internals.bdiff", but briefly:
1242 described more fully in "hg help internals.bdiff", but briefly:
1239
1243
1240 +---------------------------------------------------------------+
1244 +---------------------------------------------------------------+
1241 | | | | |
1245 | | | | |
1242 | start offset | end offset | new length | content |
1246 | start offset | end offset | new length | content |
1243 | (4 bytes) | (4 bytes) | (4 bytes) | (<new length> bytes) |
1247 | (4 bytes) | (4 bytes) | (4 bytes) | (<new length> bytes) |
1244 | | | | |
1248 | | | | |
1245 +---------------------------------------------------------------+
1249 +---------------------------------------------------------------+
1246
1250
1247 Please note that the length field in the delta data does *not* include
1251 Please note that the length field in the delta data does *not* include
1248 itself.
1252 itself.
1249
1253
1250 In version 1, the delta is always applied against the previous node from
1254 In version 1, the delta is always applied against the previous node from
1251 the changegroup or the first parent if this is the first entry in the
1255 the changegroup or the first parent if this is the first entry in the
1252 changegroup.
1256 changegroup.
1253
1257
1254 In version 2 and up, the delta base node is encoded in the entry in the
1258 In version 2 and up, the delta base node is encoded in the entry in the
1255 changegroup. This allows the delta to be expressed against any parent,
1259 changegroup. This allows the delta to be expressed against any parent,
1256 which can result in smaller deltas and more efficient encoding of data.
1260 which can result in smaller deltas and more efficient encoding of data.
1257
1261
1258 The *flags* field holds bitwise flags affecting the processing of revision
1262 The *flags* field holds bitwise flags affecting the processing of revision
1259 data. The following flags are defined:
1263 data. The following flags are defined:
1260
1264
1261 32768
1265 32768
1262 Censored revision. The revision's fulltext has been replaced by censor
1266 Censored revision. The revision's fulltext has been replaced by censor
1263 metadata. May only occur on file revisions.
1267 metadata. May only occur on file revisions.
1264
1268
1265 16384
1269 16384
1266 Ellipsis revision. Revision hash does not match data (likely due to
1270 Ellipsis revision. Revision hash does not match data (likely due to
1267 rewritten parents).
1271 rewritten parents).
1268
1272
1269 8192
1273 8192
1270 Externally stored. The revision fulltext contains "key:value" "\n"
1274 Externally stored. The revision fulltext contains "key:value" "\n"
1271 delimited metadata defining an object stored elsewhere. Used by the LFS
1275 delimited metadata defining an object stored elsewhere. Used by the LFS
1272 extension.
1276 extension.
1273
1277
1274 For historical reasons, the integer values are identical to revlog version
1278 For historical reasons, the integer values are identical to revlog version
1275 1 per-revision storage flags and correspond to bits being set in this
1279 1 per-revision storage flags and correspond to bits being set in this
1276 2-byte field. Bits were allocated starting from the most-significant bit,
1280 2-byte field. Bits were allocated starting from the most-significant bit,
1277 hence the reverse ordering and allocation of these flags.
1281 hence the reverse ordering and allocation of these flags.
1278
1282
1279 Changeset Segment
1283 Changeset Segment
1280 =================
1284 =================
1281
1285
1282 The *changeset segment* consists of a single *delta group* holding
1286 The *changeset segment* consists of a single *delta group* holding
1283 changelog data. The *empty chunk* at the end of the *delta group* denotes
1287 changelog data. The *empty chunk* at the end of the *delta group* denotes
1284 the boundary to the *manifest segment*.
1288 the boundary to the *manifest segment*.
1285
1289
1286 Manifest Segment
1290 Manifest Segment
1287 ================
1291 ================
1288
1292
1289 The *manifest segment* consists of a single *delta group* holding manifest
1293 The *manifest segment* consists of a single *delta group* holding manifest
1290 data. If treemanifests are in use, it contains only the manifest for the
1294 data. If treemanifests are in use, it contains only the manifest for the
1291 root directory of the repository. Otherwise, it contains the entire
1295 root directory of the repository. Otherwise, it contains the entire
1292 manifest data. The *empty chunk* at the end of the *delta group* denotes
1296 manifest data. The *empty chunk* at the end of the *delta group* denotes
1293 the boundary to the next segment (either the *treemanifests segment* or
1297 the boundary to the next segment (either the *treemanifests segment* or
1294 the *filelogs segment*, depending on version and the request options).
1298 the *filelogs segment*, depending on version and the request options).
1295
1299
1296 Treemanifests Segment
1300 Treemanifests Segment
1297 ---------------------
1301 ---------------------
1298
1302
1299 The *treemanifests segment* only exists in changegroup version "3", and
1303 The *treemanifests segment* only exists in changegroup version "3", and
1300 only if the 'treemanifest' param is part of the bundle2 changegroup part
1304 only if the 'treemanifest' param is part of the bundle2 changegroup part
1301 (it is not possible to use changegroup version 3 outside of bundle2).
1305 (it is not possible to use changegroup version 3 outside of bundle2).
1302 Aside from the filenames in the *treemanifests segment* containing a
1306 Aside from the filenames in the *treemanifests segment* containing a
1303 trailing "/" character, it behaves identically to the *filelogs segment*
1307 trailing "/" character, it behaves identically to the *filelogs segment*
1304 (see below). The final sub-segment is followed by an *empty chunk*
1308 (see below). The final sub-segment is followed by an *empty chunk*
1305 (logically, a sub-segment with filename size 0). This denotes the boundary
1309 (logically, a sub-segment with filename size 0). This denotes the boundary
1306 to the *filelogs segment*.
1310 to the *filelogs segment*.
1307
1311
1308 Filelogs Segment
1312 Filelogs Segment
1309 ================
1313 ================
1310
1314
1311 The *filelogs segment* consists of multiple sub-segments, each
1315 The *filelogs segment* consists of multiple sub-segments, each
1312 corresponding to an individual file whose data is being described:
1316 corresponding to an individual file whose data is being described:
1313
1317
1314 +--------------------------------------------------+
1318 +--------------------------------------------------+
1315 | | | | | |
1319 | | | | | |
1316 | filelog0 | filelog1 | filelog2 | ... | 0x0 |
1320 | filelog0 | filelog1 | filelog2 | ... | 0x0 |
1317 | | | | | (4 bytes) |
1321 | | | | | (4 bytes) |
1318 | | | | | |
1322 | | | | | |
1319 +--------------------------------------------------+
1323 +--------------------------------------------------+
1320
1324
1321 The final filelog sub-segment is followed by an *empty chunk* (logically,
1325 The final filelog sub-segment is followed by an *empty chunk* (logically,
1322 a sub-segment with filename size 0). This denotes the end of the segment
1326 a sub-segment with filename size 0). This denotes the end of the segment
1323 and of the overall changegroup.
1327 and of the overall changegroup.
1324
1328
1325 Each filelog sub-segment consists of the following:
1329 Each filelog sub-segment consists of the following:
1326
1330
1327 +------------------------------------------------------+
1331 +------------------------------------------------------+
1328 | | | |
1332 | | | |
1329 | filename length | filename | delta group |
1333 | filename length | filename | delta group |
1330 | (4 bytes) | (<length - 4> bytes) | (various) |
1334 | (4 bytes) | (<length - 4> bytes) | (various) |
1331 | | | |
1335 | | | |
1332 +------------------------------------------------------+
1336 +------------------------------------------------------+
1333
1337
1334 That is, a *chunk* consisting of the filename (not terminated or padded)
1338 That is, a *chunk* consisting of the filename (not terminated or padded)
1335 followed by N chunks constituting the *delta group* for this file. The
1339 followed by N chunks constituting the *delta group* for this file. The
1336 *empty chunk* at the end of each *delta group* denotes the boundary to the
1340 *empty chunk* at the end of each *delta group* denotes the boundary to the
1337 next filelog sub-segment.
1341 next filelog sub-segment.
1338
1342
1339 non-existent subtopics print an error
1343 non-existent subtopics print an error
1340
1344
1341 $ hg help internals.foo
1345 $ hg help internals.foo
1342 abort: no such help topic: internals.foo
1346 abort: no such help topic: internals.foo
1343 (try 'hg help --keyword foo')
1347 (try 'hg help --keyword foo')
1344 [255]
1348 [255]
1345
1349
1346 test advanced, deprecated and experimental options are hidden in command help
1350 test advanced, deprecated and experimental options are hidden in command help
1347 $ hg help debugoptADV
1351 $ hg help debugoptADV
1348 hg debugoptADV
1352 hg debugoptADV
1349
1353
1350 (no help text available)
1354 (no help text available)
1351
1355
1352 options:
1356 options:
1353
1357
1354 (some details hidden, use --verbose to show complete help)
1358 (some details hidden, use --verbose to show complete help)
1355 $ hg help debugoptDEP
1359 $ hg help debugoptDEP
1356 hg debugoptDEP
1360 hg debugoptDEP
1357
1361
1358 (no help text available)
1362 (no help text available)
1359
1363
1360 options:
1364 options:
1361
1365
1362 (some details hidden, use --verbose to show complete help)
1366 (some details hidden, use --verbose to show complete help)
1363
1367
1364 $ hg help debugoptEXP
1368 $ hg help debugoptEXP
1365 hg debugoptEXP
1369 hg debugoptEXP
1366
1370
1367 (no help text available)
1371 (no help text available)
1368
1372
1369 options:
1373 options:
1370
1374
1371 (some details hidden, use --verbose to show complete help)
1375 (some details hidden, use --verbose to show complete help)
1372
1376
1373 test advanced, deprecated and experimental options are shown with -v
1377 test advanced, deprecated and experimental options are shown with -v
1374 $ hg help -v debugoptADV | grep aopt
1378 $ hg help -v debugoptADV | grep aopt
1375 --aopt option is (ADVANCED)
1379 --aopt option is (ADVANCED)
1376 $ hg help -v debugoptDEP | grep dopt
1380 $ hg help -v debugoptDEP | grep dopt
1377 --dopt option is (DEPRECATED)
1381 --dopt option is (DEPRECATED)
1378 $ hg help -v debugoptEXP | grep eopt
1382 $ hg help -v debugoptEXP | grep eopt
1379 --eopt option is (EXPERIMENTAL)
1383 --eopt option is (EXPERIMENTAL)
1380
1384
1381 #if gettext
1385 #if gettext
1382 test deprecated option is hidden with translation with untranslated description
1386 test deprecated option is hidden with translation with untranslated description
1383 (use many globy for not failing on changed transaction)
1387 (use many globy for not failing on changed transaction)
1384 $ LANGUAGE=sv hg help debugoptDEP
1388 $ LANGUAGE=sv hg help debugoptDEP
1385 hg debugoptDEP
1389 hg debugoptDEP
1386
1390
1387 (*) (glob)
1391 (*) (glob)
1388
1392
1389 options:
1393 options:
1390
1394
1391 (some details hidden, use --verbose to show complete help)
1395 (some details hidden, use --verbose to show complete help)
1392 #endif
1396 #endif
1393
1397
1394 Test commands that collide with topics (issue4240)
1398 Test commands that collide with topics (issue4240)
1395
1399
1396 $ hg config -hq
1400 $ hg config -hq
1397 hg config [-u] [NAME]...
1401 hg config [-u] [NAME]...
1398
1402
1399 show combined config settings from all hgrc files
1403 show combined config settings from all hgrc files
1400 $ hg showconfig -hq
1404 $ hg showconfig -hq
1401 hg config [-u] [NAME]...
1405 hg config [-u] [NAME]...
1402
1406
1403 show combined config settings from all hgrc files
1407 show combined config settings from all hgrc files
1404
1408
1405 Test a help topic
1409 Test a help topic
1406
1410
1407 $ hg help dates
1411 $ hg help dates
1408 Date Formats
1412 Date Formats
1409 """"""""""""
1413 """"""""""""
1410
1414
1411 Some commands allow the user to specify a date, e.g.:
1415 Some commands allow the user to specify a date, e.g.:
1412
1416
1413 - backout, commit, import, tag: Specify the commit date.
1417 - backout, commit, import, tag: Specify the commit date.
1414 - log, revert, update: Select revision(s) by date.
1418 - log, revert, update: Select revision(s) by date.
1415
1419
1416 Many date formats are valid. Here are some examples:
1420 Many date formats are valid. Here are some examples:
1417
1421
1418 - "Wed Dec 6 13:18:29 2006" (local timezone assumed)
1422 - "Wed Dec 6 13:18:29 2006" (local timezone assumed)
1419 - "Dec 6 13:18 -0600" (year assumed, time offset provided)
1423 - "Dec 6 13:18 -0600" (year assumed, time offset provided)
1420 - "Dec 6 13:18 UTC" (UTC and GMT are aliases for +0000)
1424 - "Dec 6 13:18 UTC" (UTC and GMT are aliases for +0000)
1421 - "Dec 6" (midnight)
1425 - "Dec 6" (midnight)
1422 - "13:18" (today assumed)
1426 - "13:18" (today assumed)
1423 - "3:39" (3:39AM assumed)
1427 - "3:39" (3:39AM assumed)
1424 - "3:39pm" (15:39)
1428 - "3:39pm" (15:39)
1425 - "2006-12-06 13:18:29" (ISO 8601 format)
1429 - "2006-12-06 13:18:29" (ISO 8601 format)
1426 - "2006-12-6 13:18"
1430 - "2006-12-6 13:18"
1427 - "2006-12-6"
1431 - "2006-12-6"
1428 - "12-6"
1432 - "12-6"
1429 - "12/6"
1433 - "12/6"
1430 - "12/6/6" (Dec 6 2006)
1434 - "12/6/6" (Dec 6 2006)
1431 - "today" (midnight)
1435 - "today" (midnight)
1432 - "yesterday" (midnight)
1436 - "yesterday" (midnight)
1433 - "now" - right now
1437 - "now" - right now
1434
1438
1435 Lastly, there is Mercurial's internal format:
1439 Lastly, there is Mercurial's internal format:
1436
1440
1437 - "1165411109 0" (Wed Dec 6 13:18:29 2006 UTC)
1441 - "1165411109 0" (Wed Dec 6 13:18:29 2006 UTC)
1438
1442
1439 This is the internal representation format for dates. The first number is
1443 This is the internal representation format for dates. The first number is
1440 the number of seconds since the epoch (1970-01-01 00:00 UTC). The second
1444 the number of seconds since the epoch (1970-01-01 00:00 UTC). The second
1441 is the offset of the local timezone, in seconds west of UTC (negative if
1445 is the offset of the local timezone, in seconds west of UTC (negative if
1442 the timezone is east of UTC).
1446 the timezone is east of UTC).
1443
1447
1444 The log command also accepts date ranges:
1448 The log command also accepts date ranges:
1445
1449
1446 - "<DATE" - at or before a given date/time
1450 - "<DATE" - at or before a given date/time
1447 - ">DATE" - on or after a given date/time
1451 - ">DATE" - on or after a given date/time
1448 - "DATE to DATE" - a date range, inclusive
1452 - "DATE to DATE" - a date range, inclusive
1449 - "-DAYS" - within a given number of days from today
1453 - "-DAYS" - within a given number of days from today
1450
1454
1451 Test repeated config section name
1455 Test repeated config section name
1452
1456
1453 $ hg help config.host
1457 $ hg help config.host
1454 "http_proxy.host"
1458 "http_proxy.host"
1455 Host name and (optional) port of the proxy server, for example
1459 Host name and (optional) port of the proxy server, for example
1456 "myproxy:8000".
1460 "myproxy:8000".
1457
1461
1458 "smtp.host"
1462 "smtp.host"
1459 Host name of mail server, e.g. "mail.example.com".
1463 Host name of mail server, e.g. "mail.example.com".
1460
1464
1461
1465
1462 Test section name with dot
1466 Test section name with dot
1463
1467
1464 $ hg help config.ui.username
1468 $ hg help config.ui.username
1465 "ui.username"
1469 "ui.username"
1466 The committer of a changeset created when running "commit". Typically
1470 The committer of a changeset created when running "commit". Typically
1467 a person's name and email address, e.g. "Fred Widget
1471 a person's name and email address, e.g. "Fred Widget
1468 <fred@example.com>". Environment variables in the username are
1472 <fred@example.com>". Environment variables in the username are
1469 expanded.
1473 expanded.
1470
1474
1471 (default: "$EMAIL" or "username@hostname". If the username in hgrc is
1475 (default: "$EMAIL" or "username@hostname". If the username in hgrc is
1472 empty, e.g. if the system admin set "username =" in the system hgrc,
1476 empty, e.g. if the system admin set "username =" in the system hgrc,
1473 it has to be specified manually or in a different hgrc file)
1477 it has to be specified manually or in a different hgrc file)
1474
1478
1475
1479
1476 $ hg help config.annotate.git
1480 $ hg help config.annotate.git
1477 abort: help section not found: config.annotate.git
1481 abort: help section not found: config.annotate.git
1478 [255]
1482 [255]
1479
1483
1480 $ hg help config.update.check
1484 $ hg help config.update.check
1481 "commands.update.check"
1485 "commands.update.check"
1482 Determines what level of checking 'hg update' will perform before
1486 Determines what level of checking 'hg update' will perform before
1483 moving to a destination revision. Valid values are "abort", "none",
1487 moving to a destination revision. Valid values are "abort", "none",
1484 "linear", and "noconflict". "abort" always fails if the working
1488 "linear", and "noconflict". "abort" always fails if the working
1485 directory has uncommitted changes. "none" performs no checking, and
1489 directory has uncommitted changes. "none" performs no checking, and
1486 may result in a merge with uncommitted changes. "linear" allows any
1490 may result in a merge with uncommitted changes. "linear" allows any
1487 update as long as it follows a straight line in the revision history,
1491 update as long as it follows a straight line in the revision history,
1488 and may trigger a merge with uncommitted changes. "noconflict" will
1492 and may trigger a merge with uncommitted changes. "noconflict" will
1489 allow any update which would not trigger a merge with uncommitted
1493 allow any update which would not trigger a merge with uncommitted
1490 changes, if any are present. (default: "linear")
1494 changes, if any are present. (default: "linear")
1491
1495
1492
1496
1493 $ hg help config.commands.update.check
1497 $ hg help config.commands.update.check
1494 "commands.update.check"
1498 "commands.update.check"
1495 Determines what level of checking 'hg update' will perform before
1499 Determines what level of checking 'hg update' will perform before
1496 moving to a destination revision. Valid values are "abort", "none",
1500 moving to a destination revision. Valid values are "abort", "none",
1497 "linear", and "noconflict". "abort" always fails if the working
1501 "linear", and "noconflict". "abort" always fails if the working
1498 directory has uncommitted changes. "none" performs no checking, and
1502 directory has uncommitted changes. "none" performs no checking, and
1499 may result in a merge with uncommitted changes. "linear" allows any
1503 may result in a merge with uncommitted changes. "linear" allows any
1500 update as long as it follows a straight line in the revision history,
1504 update as long as it follows a straight line in the revision history,
1501 and may trigger a merge with uncommitted changes. "noconflict" will
1505 and may trigger a merge with uncommitted changes. "noconflict" will
1502 allow any update which would not trigger a merge with uncommitted
1506 allow any update which would not trigger a merge with uncommitted
1503 changes, if any are present. (default: "linear")
1507 changes, if any are present. (default: "linear")
1504
1508
1505
1509
1506 $ hg help config.ommands.update.check
1510 $ hg help config.ommands.update.check
1507 abort: help section not found: config.ommands.update.check
1511 abort: help section not found: config.ommands.update.check
1508 [255]
1512 [255]
1509
1513
1510 Unrelated trailing paragraphs shouldn't be included
1514 Unrelated trailing paragraphs shouldn't be included
1511
1515
1512 $ hg help config.extramsg | grep '^$'
1516 $ hg help config.extramsg | grep '^$'
1513
1517
1514
1518
1515 Test capitalized section name
1519 Test capitalized section name
1516
1520
1517 $ hg help scripting.HGPLAIN > /dev/null
1521 $ hg help scripting.HGPLAIN > /dev/null
1518
1522
1519 Help subsection:
1523 Help subsection:
1520
1524
1521 $ hg help config.charsets |grep "Email example:" > /dev/null
1525 $ hg help config.charsets |grep "Email example:" > /dev/null
1522 [1]
1526 [1]
1523
1527
1524 Show nested definitions
1528 Show nested definitions
1525 ("profiling.type"[break]"ls"[break]"stat"[break])
1529 ("profiling.type"[break]"ls"[break]"stat"[break])
1526
1530
1527 $ hg help config.type | egrep '^$'|wc -l
1531 $ hg help config.type | egrep '^$'|wc -l
1528 \s*3 (re)
1532 \s*3 (re)
1529
1533
1530 $ hg help config.profiling.type.ls
1534 $ hg help config.profiling.type.ls
1531 "profiling.type.ls"
1535 "profiling.type.ls"
1532 Use Python's built-in instrumenting profiler. This profiler works on
1536 Use Python's built-in instrumenting profiler. This profiler works on
1533 all platforms, but each line number it reports is the first line of
1537 all platforms, but each line number it reports is the first line of
1534 a function. This restriction makes it difficult to identify the
1538 a function. This restriction makes it difficult to identify the
1535 expensive parts of a non-trivial function.
1539 expensive parts of a non-trivial function.
1536
1540
1537
1541
1538 Separate sections from subsections
1542 Separate sections from subsections
1539
1543
1540 $ hg help config.format | egrep '^ ("|-)|^\s*$' | uniq
1544 $ hg help config.format | egrep '^ ("|-)|^\s*$' | uniq
1541 "format"
1545 "format"
1542 --------
1546 --------
1543
1547
1544 "usegeneraldelta"
1548 "usegeneraldelta"
1545
1549
1546 "dotencode"
1550 "dotencode"
1547
1551
1548 "usefncache"
1552 "usefncache"
1549
1553
1550 "usestore"
1554 "usestore"
1551
1555
1552 "sparse-revlog"
1556 "sparse-revlog"
1553
1557
1554 "revlog-compression"
1558 "revlog-compression"
1555
1559
1556 "bookmarks-in-store"
1560 "bookmarks-in-store"
1557
1561
1558 "profiling"
1562 "profiling"
1559 -----------
1563 -----------
1560
1564
1561 "format"
1565 "format"
1562
1566
1563 "progress"
1567 "progress"
1564 ----------
1568 ----------
1565
1569
1566 "format"
1570 "format"
1567
1571
1568
1572
1569 Last item in help config.*:
1573 Last item in help config.*:
1570
1574
1571 $ hg help config.`hg help config|grep '^ "'| \
1575 $ hg help config.`hg help config|grep '^ "'| \
1572 > tail -1|sed 's![ "]*!!g'`| \
1576 > tail -1|sed 's![ "]*!!g'`| \
1573 > grep 'hg help -c config' > /dev/null
1577 > grep 'hg help -c config' > /dev/null
1574 [1]
1578 [1]
1575
1579
1576 note to use help -c for general hg help config:
1580 note to use help -c for general hg help config:
1577
1581
1578 $ hg help config |grep 'hg help -c config' > /dev/null
1582 $ hg help config |grep 'hg help -c config' > /dev/null
1579
1583
1580 Test templating help
1584 Test templating help
1581
1585
1582 $ hg help templating | egrep '(desc|diffstat|firstline|nonempty) '
1586 $ hg help templating | egrep '(desc|diffstat|firstline|nonempty) '
1583 desc String. The text of the changeset description.
1587 desc String. The text of the changeset description.
1584 diffstat String. Statistics of changes with the following format:
1588 diffstat String. Statistics of changes with the following format:
1585 firstline Any text. Returns the first line of text.
1589 firstline Any text. Returns the first line of text.
1586 nonempty Any text. Returns '(none)' if the string is empty.
1590 nonempty Any text. Returns '(none)' if the string is empty.
1587
1591
1588 Test deprecated items
1592 Test deprecated items
1589
1593
1590 $ hg help -v templating | grep currentbookmark
1594 $ hg help -v templating | grep currentbookmark
1591 currentbookmark
1595 currentbookmark
1592 $ hg help templating | (grep currentbookmark || true)
1596 $ hg help templating | (grep currentbookmark || true)
1593
1597
1594 Test help hooks
1598 Test help hooks
1595
1599
1596 $ cat > helphook1.py <<EOF
1600 $ cat > helphook1.py <<EOF
1597 > from mercurial import help
1601 > from mercurial import help
1598 >
1602 >
1599 > def rewrite(ui, topic, doc):
1603 > def rewrite(ui, topic, doc):
1600 > return doc + b'\nhelphook1\n'
1604 > return doc + b'\nhelphook1\n'
1601 >
1605 >
1602 > def extsetup(ui):
1606 > def extsetup(ui):
1603 > help.addtopichook(b'revisions', rewrite)
1607 > help.addtopichook(b'revisions', rewrite)
1604 > EOF
1608 > EOF
1605 $ cat > helphook2.py <<EOF
1609 $ cat > helphook2.py <<EOF
1606 > from mercurial import help
1610 > from mercurial import help
1607 >
1611 >
1608 > def rewrite(ui, topic, doc):
1612 > def rewrite(ui, topic, doc):
1609 > return doc + b'\nhelphook2\n'
1613 > return doc + b'\nhelphook2\n'
1610 >
1614 >
1611 > def extsetup(ui):
1615 > def extsetup(ui):
1612 > help.addtopichook(b'revisions', rewrite)
1616 > help.addtopichook(b'revisions', rewrite)
1613 > EOF
1617 > EOF
1614 $ echo '[extensions]' >> $HGRCPATH
1618 $ echo '[extensions]' >> $HGRCPATH
1615 $ echo "helphook1 = `pwd`/helphook1.py" >> $HGRCPATH
1619 $ echo "helphook1 = `pwd`/helphook1.py" >> $HGRCPATH
1616 $ echo "helphook2 = `pwd`/helphook2.py" >> $HGRCPATH
1620 $ echo "helphook2 = `pwd`/helphook2.py" >> $HGRCPATH
1617 $ hg help revsets | grep helphook
1621 $ hg help revsets | grep helphook
1618 helphook1
1622 helphook1
1619 helphook2
1623 helphook2
1620
1624
1621 help -c should only show debug --debug
1625 help -c should only show debug --debug
1622
1626
1623 $ hg help -c --debug|egrep debug|wc -l|egrep '^\s*0\s*$'
1627 $ hg help -c --debug|egrep debug|wc -l|egrep '^\s*0\s*$'
1624 [1]
1628 [1]
1625
1629
1626 help -c should only show deprecated for -v
1630 help -c should only show deprecated for -v
1627
1631
1628 $ hg help -c -v|egrep DEPRECATED|wc -l|egrep '^\s*0\s*$'
1632 $ hg help -c -v|egrep DEPRECATED|wc -l|egrep '^\s*0\s*$'
1629 [1]
1633 [1]
1630
1634
1631 Test -s / --system
1635 Test -s / --system
1632
1636
1633 $ hg help config.files -s windows |grep 'etc/mercurial' | \
1637 $ hg help config.files -s windows |grep 'etc/mercurial' | \
1634 > wc -l | sed -e 's/ //g'
1638 > wc -l | sed -e 's/ //g'
1635 0
1639 0
1636 $ hg help config.files --system unix | grep 'USER' | \
1640 $ hg help config.files --system unix | grep 'USER' | \
1637 > wc -l | sed -e 's/ //g'
1641 > wc -l | sed -e 's/ //g'
1638 0
1642 0
1639
1643
1640 Test -e / -c / -k combinations
1644 Test -e / -c / -k combinations
1641
1645
1642 $ hg help -c|egrep '^[A-Z].*:|^ debug'
1646 $ hg help -c|egrep '^[A-Z].*:|^ debug'
1643 Commands:
1647 Commands:
1644 $ hg help -e|egrep '^[A-Z].*:|^ debug'
1648 $ hg help -e|egrep '^[A-Z].*:|^ debug'
1645 Extensions:
1649 Extensions:
1646 $ hg help -k|egrep '^[A-Z].*:|^ debug'
1650 $ hg help -k|egrep '^[A-Z].*:|^ debug'
1647 Topics:
1651 Topics:
1648 Commands:
1652 Commands:
1649 Extensions:
1653 Extensions:
1650 Extension Commands:
1654 Extension Commands:
1651 $ hg help -c schemes
1655 $ hg help -c schemes
1652 abort: no such help topic: schemes
1656 abort: no such help topic: schemes
1653 (try 'hg help --keyword schemes')
1657 (try 'hg help --keyword schemes')
1654 [255]
1658 [255]
1655 $ hg help -e schemes |head -1
1659 $ hg help -e schemes |head -1
1656 schemes extension - extend schemes with shortcuts to repository swarms
1660 schemes extension - extend schemes with shortcuts to repository swarms
1657 $ hg help -c -k dates |egrep '^(Topics|Extensions|Commands):'
1661 $ hg help -c -k dates |egrep '^(Topics|Extensions|Commands):'
1658 Commands:
1662 Commands:
1659 $ hg help -e -k a |egrep '^(Topics|Extensions|Commands):'
1663 $ hg help -e -k a |egrep '^(Topics|Extensions|Commands):'
1660 Extensions:
1664 Extensions:
1661 $ hg help -e -c -k date |egrep '^(Topics|Extensions|Commands):'
1665 $ hg help -e -c -k date |egrep '^(Topics|Extensions|Commands):'
1662 Extensions:
1666 Extensions:
1663 Commands:
1667 Commands:
1664 $ hg help -c commit > /dev/null
1668 $ hg help -c commit > /dev/null
1665 $ hg help -e -c commit > /dev/null
1669 $ hg help -e -c commit > /dev/null
1666 $ hg help -e commit
1670 $ hg help -e commit
1667 abort: no such help topic: commit
1671 abort: no such help topic: commit
1668 (try 'hg help --keyword commit')
1672 (try 'hg help --keyword commit')
1669 [255]
1673 [255]
1670
1674
1671 Test keyword search help
1675 Test keyword search help
1672
1676
1673 $ cat > prefixedname.py <<EOF
1677 $ cat > prefixedname.py <<EOF
1674 > '''matched against word "clone"
1678 > '''matched against word "clone"
1675 > '''
1679 > '''
1676 > EOF
1680 > EOF
1677 $ echo '[extensions]' >> $HGRCPATH
1681 $ echo '[extensions]' >> $HGRCPATH
1678 $ echo "dot.dot.prefixedname = `pwd`/prefixedname.py" >> $HGRCPATH
1682 $ echo "dot.dot.prefixedname = `pwd`/prefixedname.py" >> $HGRCPATH
1679 $ hg help -k clone
1683 $ hg help -k clone
1680 Topics:
1684 Topics:
1681
1685
1682 config Configuration Files
1686 config Configuration Files
1683 extensions Using Additional Features
1687 extensions Using Additional Features
1684 glossary Glossary
1688 glossary Glossary
1685 phases Working with Phases
1689 phases Working with Phases
1686 subrepos Subrepositories
1690 subrepos Subrepositories
1687 urls URL Paths
1691 urls URL Paths
1688
1692
1689 Commands:
1693 Commands:
1690
1694
1691 bookmarks create a new bookmark or list existing bookmarks
1695 bookmarks create a new bookmark or list existing bookmarks
1692 clone make a copy of an existing repository
1696 clone make a copy of an existing repository
1693 paths show aliases for remote repositories
1697 paths show aliases for remote repositories
1694 pull pull changes from the specified source
1698 pull pull changes from the specified source
1695 update update working directory (or switch revisions)
1699 update update working directory (or switch revisions)
1696
1700
1697 Extensions:
1701 Extensions:
1698
1702
1699 clonebundles advertise pre-generated bundles to seed clones
1703 clonebundles advertise pre-generated bundles to seed clones
1700 narrow create clones which fetch history data for subset of files
1704 narrow create clones which fetch history data for subset of files
1701 (EXPERIMENTAL)
1705 (EXPERIMENTAL)
1702 prefixedname matched against word "clone"
1706 prefixedname matched against word "clone"
1703 relink recreates hardlinks between repository clones
1707 relink recreates hardlinks between repository clones
1704
1708
1705 Extension Commands:
1709 Extension Commands:
1706
1710
1707 qclone clone main and patch repository at same time
1711 qclone clone main and patch repository at same time
1708
1712
1709 Test unfound topic
1713 Test unfound topic
1710
1714
1711 $ hg help nonexistingtopicthatwillneverexisteverever
1715 $ hg help nonexistingtopicthatwillneverexisteverever
1712 abort: no such help topic: nonexistingtopicthatwillneverexisteverever
1716 abort: no such help topic: nonexistingtopicthatwillneverexisteverever
1713 (try 'hg help --keyword nonexistingtopicthatwillneverexisteverever')
1717 (try 'hg help --keyword nonexistingtopicthatwillneverexisteverever')
1714 [255]
1718 [255]
1715
1719
1716 Test unfound keyword
1720 Test unfound keyword
1717
1721
1718 $ hg help --keyword nonexistingwordthatwillneverexisteverever
1722 $ hg help --keyword nonexistingwordthatwillneverexisteverever
1719 abort: no matches
1723 abort: no matches
1720 (try 'hg help' for a list of topics)
1724 (try 'hg help' for a list of topics)
1721 [255]
1725 [255]
1722
1726
1723 Test omit indicating for help
1727 Test omit indicating for help
1724
1728
1725 $ cat > addverboseitems.py <<EOF
1729 $ cat > addverboseitems.py <<EOF
1726 > r'''extension to test omit indicating.
1730 > r'''extension to test omit indicating.
1727 >
1731 >
1728 > This paragraph is never omitted (for extension)
1732 > This paragraph is never omitted (for extension)
1729 >
1733 >
1730 > .. container:: verbose
1734 > .. container:: verbose
1731 >
1735 >
1732 > This paragraph is omitted,
1736 > This paragraph is omitted,
1733 > if :hg:\`help\` is invoked without \`\`-v\`\` (for extension)
1737 > if :hg:\`help\` is invoked without \`\`-v\`\` (for extension)
1734 >
1738 >
1735 > This paragraph is never omitted, too (for extension)
1739 > This paragraph is never omitted, too (for extension)
1736 > '''
1740 > '''
1737 > from __future__ import absolute_import
1741 > from __future__ import absolute_import
1738 > from mercurial import commands, help
1742 > from mercurial import commands, help
1739 > testtopic = br"""This paragraph is never omitted (for topic).
1743 > testtopic = br"""This paragraph is never omitted (for topic).
1740 >
1744 >
1741 > .. container:: verbose
1745 > .. container:: verbose
1742 >
1746 >
1743 > This paragraph is omitted,
1747 > This paragraph is omitted,
1744 > if :hg:\`help\` is invoked without \`\`-v\`\` (for topic)
1748 > if :hg:\`help\` is invoked without \`\`-v\`\` (for topic)
1745 >
1749 >
1746 > This paragraph is never omitted, too (for topic)
1750 > This paragraph is never omitted, too (for topic)
1747 > """
1751 > """
1748 > def extsetup(ui):
1752 > def extsetup(ui):
1749 > help.helptable.append(([b"topic-containing-verbose"],
1753 > help.helptable.append(([b"topic-containing-verbose"],
1750 > b"This is the topic to test omit indicating.",
1754 > b"This is the topic to test omit indicating.",
1751 > lambda ui: testtopic))
1755 > lambda ui: testtopic))
1752 > EOF
1756 > EOF
1753 $ echo '[extensions]' >> $HGRCPATH
1757 $ echo '[extensions]' >> $HGRCPATH
1754 $ echo "addverboseitems = `pwd`/addverboseitems.py" >> $HGRCPATH
1758 $ echo "addverboseitems = `pwd`/addverboseitems.py" >> $HGRCPATH
1755 $ hg help addverboseitems
1759 $ hg help addverboseitems
1756 addverboseitems extension - extension to test omit indicating.
1760 addverboseitems extension - extension to test omit indicating.
1757
1761
1758 This paragraph is never omitted (for extension)
1762 This paragraph is never omitted (for extension)
1759
1763
1760 This paragraph is never omitted, too (for extension)
1764 This paragraph is never omitted, too (for extension)
1761
1765
1762 (some details hidden, use --verbose to show complete help)
1766 (some details hidden, use --verbose to show complete help)
1763
1767
1764 no commands defined
1768 no commands defined
1765 $ hg help -v addverboseitems
1769 $ hg help -v addverboseitems
1766 addverboseitems extension - extension to test omit indicating.
1770 addverboseitems extension - extension to test omit indicating.
1767
1771
1768 This paragraph is never omitted (for extension)
1772 This paragraph is never omitted (for extension)
1769
1773
1770 This paragraph is omitted, if 'hg help' is invoked without "-v" (for
1774 This paragraph is omitted, if 'hg help' is invoked without "-v" (for
1771 extension)
1775 extension)
1772
1776
1773 This paragraph is never omitted, too (for extension)
1777 This paragraph is never omitted, too (for extension)
1774
1778
1775 no commands defined
1779 no commands defined
1776 $ hg help topic-containing-verbose
1780 $ hg help topic-containing-verbose
1777 This is the topic to test omit indicating.
1781 This is the topic to test omit indicating.
1778 """"""""""""""""""""""""""""""""""""""""""
1782 """"""""""""""""""""""""""""""""""""""""""
1779
1783
1780 This paragraph is never omitted (for topic).
1784 This paragraph is never omitted (for topic).
1781
1785
1782 This paragraph is never omitted, too (for topic)
1786 This paragraph is never omitted, too (for topic)
1783
1787
1784 (some details hidden, use --verbose to show complete help)
1788 (some details hidden, use --verbose to show complete help)
1785 $ hg help -v topic-containing-verbose
1789 $ hg help -v topic-containing-verbose
1786 This is the topic to test omit indicating.
1790 This is the topic to test omit indicating.
1787 """"""""""""""""""""""""""""""""""""""""""
1791 """"""""""""""""""""""""""""""""""""""""""
1788
1792
1789 This paragraph is never omitted (for topic).
1793 This paragraph is never omitted (for topic).
1790
1794
1791 This paragraph is omitted, if 'hg help' is invoked without "-v" (for
1795 This paragraph is omitted, if 'hg help' is invoked without "-v" (for
1792 topic)
1796 topic)
1793
1797
1794 This paragraph is never omitted, too (for topic)
1798 This paragraph is never omitted, too (for topic)
1795
1799
1796 Test section lookup
1800 Test section lookup
1797
1801
1798 $ hg help revset.merge
1802 $ hg help revset.merge
1799 "merge()"
1803 "merge()"
1800 Changeset is a merge changeset.
1804 Changeset is a merge changeset.
1801
1805
1802 $ hg help glossary.dag
1806 $ hg help glossary.dag
1803 DAG
1807 DAG
1804 The repository of changesets of a distributed version control system
1808 The repository of changesets of a distributed version control system
1805 (DVCS) can be described as a directed acyclic graph (DAG), consisting
1809 (DVCS) can be described as a directed acyclic graph (DAG), consisting
1806 of nodes and edges, where nodes correspond to changesets and edges
1810 of nodes and edges, where nodes correspond to changesets and edges
1807 imply a parent -> child relation. This graph can be visualized by
1811 imply a parent -> child relation. This graph can be visualized by
1808 graphical tools such as 'hg log --graph'. In Mercurial, the DAG is
1812 graphical tools such as 'hg log --graph'. In Mercurial, the DAG is
1809 limited by the requirement for children to have at most two parents.
1813 limited by the requirement for children to have at most two parents.
1810
1814
1811
1815
1812 $ hg help hgrc.paths
1816 $ hg help hgrc.paths
1813 "paths"
1817 "paths"
1814 -------
1818 -------
1815
1819
1816 Assigns symbolic names and behavior to repositories.
1820 Assigns symbolic names and behavior to repositories.
1817
1821
1818 Options are symbolic names defining the URL or directory that is the
1822 Options are symbolic names defining the URL or directory that is the
1819 location of the repository. Example:
1823 location of the repository. Example:
1820
1824
1821 [paths]
1825 [paths]
1822 my_server = https://example.com/my_repo
1826 my_server = https://example.com/my_repo
1823 local_path = /home/me/repo
1827 local_path = /home/me/repo
1824
1828
1825 These symbolic names can be used from the command line. To pull from
1829 These symbolic names can be used from the command line. To pull from
1826 "my_server": 'hg pull my_server'. To push to "local_path": 'hg push
1830 "my_server": 'hg pull my_server'. To push to "local_path": 'hg push
1827 local_path'.
1831 local_path'.
1828
1832
1829 Options containing colons (":") denote sub-options that can influence
1833 Options containing colons (":") denote sub-options that can influence
1830 behavior for that specific path. Example:
1834 behavior for that specific path. Example:
1831
1835
1832 [paths]
1836 [paths]
1833 my_server = https://example.com/my_path
1837 my_server = https://example.com/my_path
1834 my_server:pushurl = ssh://example.com/my_path
1838 my_server:pushurl = ssh://example.com/my_path
1835
1839
1836 The following sub-options can be defined:
1840 The following sub-options can be defined:
1837
1841
1838 "pushurl"
1842 "pushurl"
1839 The URL to use for push operations. If not defined, the location
1843 The URL to use for push operations. If not defined, the location
1840 defined by the path's main entry is used.
1844 defined by the path's main entry is used.
1841
1845
1842 "pushrev"
1846 "pushrev"
1843 A revset defining which revisions to push by default.
1847 A revset defining which revisions to push by default.
1844
1848
1845 When 'hg push' is executed without a "-r" argument, the revset defined
1849 When 'hg push' is executed without a "-r" argument, the revset defined
1846 by this sub-option is evaluated to determine what to push.
1850 by this sub-option is evaluated to determine what to push.
1847
1851
1848 For example, a value of "." will push the working directory's revision
1852 For example, a value of "." will push the working directory's revision
1849 by default.
1853 by default.
1850
1854
1851 Revsets specifying bookmarks will not result in the bookmark being
1855 Revsets specifying bookmarks will not result in the bookmark being
1852 pushed.
1856 pushed.
1853
1857
1854 The following special named paths exist:
1858 The following special named paths exist:
1855
1859
1856 "default"
1860 "default"
1857 The URL or directory to use when no source or remote is specified.
1861 The URL or directory to use when no source or remote is specified.
1858
1862
1859 'hg clone' will automatically define this path to the location the
1863 'hg clone' will automatically define this path to the location the
1860 repository was cloned from.
1864 repository was cloned from.
1861
1865
1862 "default-push"
1866 "default-push"
1863 (deprecated) The URL or directory for the default 'hg push' location.
1867 (deprecated) The URL or directory for the default 'hg push' location.
1864 "default:pushurl" should be used instead.
1868 "default:pushurl" should be used instead.
1865
1869
1866 $ hg help glossary.mcguffin
1870 $ hg help glossary.mcguffin
1867 abort: help section not found: glossary.mcguffin
1871 abort: help section not found: glossary.mcguffin
1868 [255]
1872 [255]
1869
1873
1870 $ hg help glossary.mc.guffin
1874 $ hg help glossary.mc.guffin
1871 abort: help section not found: glossary.mc.guffin
1875 abort: help section not found: glossary.mc.guffin
1872 [255]
1876 [255]
1873
1877
1874 $ hg help template.files
1878 $ hg help template.files
1875 files List of strings. All files modified, added, or removed by
1879 files List of strings. All files modified, added, or removed by
1876 this changeset.
1880 this changeset.
1877 files(pattern)
1881 files(pattern)
1878 All files of the current changeset matching the pattern. See
1882 All files of the current changeset matching the pattern. See
1879 'hg help patterns'.
1883 'hg help patterns'.
1880
1884
1881 Test section lookup by translated message
1885 Test section lookup by translated message
1882
1886
1883 str.lower() instead of encoding.lower(str) on translated message might
1887 str.lower() instead of encoding.lower(str) on translated message might
1884 make message meaningless, because some encoding uses 0x41(A) - 0x5a(Z)
1888 make message meaningless, because some encoding uses 0x41(A) - 0x5a(Z)
1885 as the second or later byte of multi-byte character.
1889 as the second or later byte of multi-byte character.
1886
1890
1887 For example, "\x8bL\x98^" (translation of "record" in ja_JP.cp932)
1891 For example, "\x8bL\x98^" (translation of "record" in ja_JP.cp932)
1888 contains 0x4c (L). str.lower() replaces 0x4c(L) by 0x6c(l) and this
1892 contains 0x4c (L). str.lower() replaces 0x4c(L) by 0x6c(l) and this
1889 replacement makes message meaningless.
1893 replacement makes message meaningless.
1890
1894
1891 This tests that section lookup by translated string isn't broken by
1895 This tests that section lookup by translated string isn't broken by
1892 such str.lower().
1896 such str.lower().
1893
1897
1894 $ "$PYTHON" <<EOF
1898 $ "$PYTHON" <<EOF
1895 > def escape(s):
1899 > def escape(s):
1896 > return b''.join(b'\\u%x' % ord(uc) for uc in s.decode('cp932'))
1900 > return b''.join(b'\\u%x' % ord(uc) for uc in s.decode('cp932'))
1897 > # translation of "record" in ja_JP.cp932
1901 > # translation of "record" in ja_JP.cp932
1898 > upper = b"\x8bL\x98^"
1902 > upper = b"\x8bL\x98^"
1899 > # str.lower()-ed section name should be treated as different one
1903 > # str.lower()-ed section name should be treated as different one
1900 > lower = b"\x8bl\x98^"
1904 > lower = b"\x8bl\x98^"
1901 > with open('ambiguous.py', 'wb') as fp:
1905 > with open('ambiguous.py', 'wb') as fp:
1902 > fp.write(b"""# ambiguous section names in ja_JP.cp932
1906 > fp.write(b"""# ambiguous section names in ja_JP.cp932
1903 > u'''summary of extension
1907 > u'''summary of extension
1904 >
1908 >
1905 > %s
1909 > %s
1906 > ----
1910 > ----
1907 >
1911 >
1908 > Upper name should show only this message
1912 > Upper name should show only this message
1909 >
1913 >
1910 > %s
1914 > %s
1911 > ----
1915 > ----
1912 >
1916 >
1913 > Lower name should show only this message
1917 > Lower name should show only this message
1914 >
1918 >
1915 > subsequent section
1919 > subsequent section
1916 > ------------------
1920 > ------------------
1917 >
1921 >
1918 > This should be hidden at 'hg help ambiguous' with section name.
1922 > This should be hidden at 'hg help ambiguous' with section name.
1919 > '''
1923 > '''
1920 > """ % (escape(upper), escape(lower)))
1924 > """ % (escape(upper), escape(lower)))
1921 > EOF
1925 > EOF
1922
1926
1923 $ cat >> $HGRCPATH <<EOF
1927 $ cat >> $HGRCPATH <<EOF
1924 > [extensions]
1928 > [extensions]
1925 > ambiguous = ./ambiguous.py
1929 > ambiguous = ./ambiguous.py
1926 > EOF
1930 > EOF
1927
1931
1928 $ "$PYTHON" <<EOF | sh
1932 $ "$PYTHON" <<EOF | sh
1929 > from mercurial.utils import procutil
1933 > from mercurial.utils import procutil
1930 > upper = b"\x8bL\x98^"
1934 > upper = b"\x8bL\x98^"
1931 > procutil.stdout.write(b"hg --encoding cp932 help -e ambiguous.%s\n" % upper)
1935 > procutil.stdout.write(b"hg --encoding cp932 help -e ambiguous.%s\n" % upper)
1932 > EOF
1936 > EOF
1933 \x8bL\x98^ (esc)
1937 \x8bL\x98^ (esc)
1934 ----
1938 ----
1935
1939
1936 Upper name should show only this message
1940 Upper name should show only this message
1937
1941
1938
1942
1939 $ "$PYTHON" <<EOF | sh
1943 $ "$PYTHON" <<EOF | sh
1940 > from mercurial.utils import procutil
1944 > from mercurial.utils import procutil
1941 > lower = b"\x8bl\x98^"
1945 > lower = b"\x8bl\x98^"
1942 > procutil.stdout.write(b"hg --encoding cp932 help -e ambiguous.%s\n" % lower)
1946 > procutil.stdout.write(b"hg --encoding cp932 help -e ambiguous.%s\n" % lower)
1943 > EOF
1947 > EOF
1944 \x8bl\x98^ (esc)
1948 \x8bl\x98^ (esc)
1945 ----
1949 ----
1946
1950
1947 Lower name should show only this message
1951 Lower name should show only this message
1948
1952
1949
1953
1950 $ cat >> $HGRCPATH <<EOF
1954 $ cat >> $HGRCPATH <<EOF
1951 > [extensions]
1955 > [extensions]
1952 > ambiguous = !
1956 > ambiguous = !
1953 > EOF
1957 > EOF
1954
1958
1955 Show help content of disabled extensions
1959 Show help content of disabled extensions
1956
1960
1957 $ cat >> $HGRCPATH <<EOF
1961 $ cat >> $HGRCPATH <<EOF
1958 > [extensions]
1962 > [extensions]
1959 > ambiguous = !./ambiguous.py
1963 > ambiguous = !./ambiguous.py
1960 > EOF
1964 > EOF
1961 $ hg help -e ambiguous
1965 $ hg help -e ambiguous
1962 ambiguous extension - (no help text available)
1966 ambiguous extension - (no help text available)
1963
1967
1964 (use 'hg help extensions' for information on enabling extensions)
1968 (use 'hg help extensions' for information on enabling extensions)
1965
1969
1966 Test dynamic list of merge tools only shows up once
1970 Test dynamic list of merge tools only shows up once
1967 $ hg help merge-tools
1971 $ hg help merge-tools
1968 Merge Tools
1972 Merge Tools
1969 """""""""""
1973 """""""""""
1970
1974
1971 To merge files Mercurial uses merge tools.
1975 To merge files Mercurial uses merge tools.
1972
1976
1973 A merge tool combines two different versions of a file into a merged file.
1977 A merge tool combines two different versions of a file into a merged file.
1974 Merge tools are given the two files and the greatest common ancestor of
1978 Merge tools are given the two files and the greatest common ancestor of
1975 the two file versions, so they can determine the changes made on both
1979 the two file versions, so they can determine the changes made on both
1976 branches.
1980 branches.
1977
1981
1978 Merge tools are used both for 'hg resolve', 'hg merge', 'hg update', 'hg
1982 Merge tools are used both for 'hg resolve', 'hg merge', 'hg update', 'hg
1979 backout' and in several extensions.
1983 backout' and in several extensions.
1980
1984
1981 Usually, the merge tool tries to automatically reconcile the files by
1985 Usually, the merge tool tries to automatically reconcile the files by
1982 combining all non-overlapping changes that occurred separately in the two
1986 combining all non-overlapping changes that occurred separately in the two
1983 different evolutions of the same initial base file. Furthermore, some
1987 different evolutions of the same initial base file. Furthermore, some
1984 interactive merge programs make it easier to manually resolve conflicting
1988 interactive merge programs make it easier to manually resolve conflicting
1985 merges, either in a graphical way, or by inserting some conflict markers.
1989 merges, either in a graphical way, or by inserting some conflict markers.
1986 Mercurial does not include any interactive merge programs but relies on
1990 Mercurial does not include any interactive merge programs but relies on
1987 external tools for that.
1991 external tools for that.
1988
1992
1989 Available merge tools
1993 Available merge tools
1990 =====================
1994 =====================
1991
1995
1992 External merge tools and their properties are configured in the merge-
1996 External merge tools and their properties are configured in the merge-
1993 tools configuration section - see hgrc(5) - but they can often just be
1997 tools configuration section - see hgrc(5) - but they can often just be
1994 named by their executable.
1998 named by their executable.
1995
1999
1996 A merge tool is generally usable if its executable can be found on the
2000 A merge tool is generally usable if its executable can be found on the
1997 system and if it can handle the merge. The executable is found if it is an
2001 system and if it can handle the merge. The executable is found if it is an
1998 absolute or relative executable path or the name of an application in the
2002 absolute or relative executable path or the name of an application in the
1999 executable search path. The tool is assumed to be able to handle the merge
2003 executable search path. The tool is assumed to be able to handle the merge
2000 if it can handle symlinks if the file is a symlink, if it can handle
2004 if it can handle symlinks if the file is a symlink, if it can handle
2001 binary files if the file is binary, and if a GUI is available if the tool
2005 binary files if the file is binary, and if a GUI is available if the tool
2002 requires a GUI.
2006 requires a GUI.
2003
2007
2004 There are some internal merge tools which can be used. The internal merge
2008 There are some internal merge tools which can be used. The internal merge
2005 tools are:
2009 tools are:
2006
2010
2007 ":dump"
2011 ":dump"
2008 Creates three versions of the files to merge, containing the contents of
2012 Creates three versions of the files to merge, containing the contents of
2009 local, other and base. These files can then be used to perform a merge
2013 local, other and base. These files can then be used to perform a merge
2010 manually. If the file to be merged is named "a.txt", these files will
2014 manually. If the file to be merged is named "a.txt", these files will
2011 accordingly be named "a.txt.local", "a.txt.other" and "a.txt.base" and
2015 accordingly be named "a.txt.local", "a.txt.other" and "a.txt.base" and
2012 they will be placed in the same directory as "a.txt".
2016 they will be placed in the same directory as "a.txt".
2013
2017
2014 This implies premerge. Therefore, files aren't dumped, if premerge runs
2018 This implies premerge. Therefore, files aren't dumped, if premerge runs
2015 successfully. Use :forcedump to forcibly write files out.
2019 successfully. Use :forcedump to forcibly write files out.
2016
2020
2017 (actual capabilities: binary, symlink)
2021 (actual capabilities: binary, symlink)
2018
2022
2019 ":fail"
2023 ":fail"
2020 Rather than attempting to merge files that were modified on both
2024 Rather than attempting to merge files that were modified on both
2021 branches, it marks them as unresolved. The resolve command must be used
2025 branches, it marks them as unresolved. The resolve command must be used
2022 to resolve these conflicts.
2026 to resolve these conflicts.
2023
2027
2024 (actual capabilities: binary, symlink)
2028 (actual capabilities: binary, symlink)
2025
2029
2026 ":forcedump"
2030 ":forcedump"
2027 Creates three versions of the files as same as :dump, but omits
2031 Creates three versions of the files as same as :dump, but omits
2028 premerge.
2032 premerge.
2029
2033
2030 (actual capabilities: binary, symlink)
2034 (actual capabilities: binary, symlink)
2031
2035
2032 ":local"
2036 ":local"
2033 Uses the local 'p1()' version of files as the merged version.
2037 Uses the local 'p1()' version of files as the merged version.
2034
2038
2035 (actual capabilities: binary, symlink)
2039 (actual capabilities: binary, symlink)
2036
2040
2037 ":merge"
2041 ":merge"
2038 Uses the internal non-interactive simple merge algorithm for merging
2042 Uses the internal non-interactive simple merge algorithm for merging
2039 files. It will fail if there are any conflicts and leave markers in the
2043 files. It will fail if there are any conflicts and leave markers in the
2040 partially merged file. Markers will have two sections, one for each side
2044 partially merged file. Markers will have two sections, one for each side
2041 of merge.
2045 of merge.
2042
2046
2043 ":merge-local"
2047 ":merge-local"
2044 Like :merge, but resolve all conflicts non-interactively in favor of the
2048 Like :merge, but resolve all conflicts non-interactively in favor of the
2045 local 'p1()' changes.
2049 local 'p1()' changes.
2046
2050
2047 ":merge-other"
2051 ":merge-other"
2048 Like :merge, but resolve all conflicts non-interactively in favor of the
2052 Like :merge, but resolve all conflicts non-interactively in favor of the
2049 other 'p2()' changes.
2053 other 'p2()' changes.
2050
2054
2051 ":merge3"
2055 ":merge3"
2052 Uses the internal non-interactive simple merge algorithm for merging
2056 Uses the internal non-interactive simple merge algorithm for merging
2053 files. It will fail if there are any conflicts and leave markers in the
2057 files. It will fail if there are any conflicts and leave markers in the
2054 partially merged file. Marker will have three sections, one from each
2058 partially merged file. Marker will have three sections, one from each
2055 side of the merge and one for the base content.
2059 side of the merge and one for the base content.
2056
2060
2057 ":other"
2061 ":other"
2058 Uses the other 'p2()' version of files as the merged version.
2062 Uses the other 'p2()' version of files as the merged version.
2059
2063
2060 (actual capabilities: binary, symlink)
2064 (actual capabilities: binary, symlink)
2061
2065
2062 ":prompt"
2066 ":prompt"
2063 Asks the user which of the local 'p1()' or the other 'p2()' version to
2067 Asks the user which of the local 'p1()' or the other 'p2()' version to
2064 keep as the merged version.
2068 keep as the merged version.
2065
2069
2066 (actual capabilities: binary, symlink)
2070 (actual capabilities: binary, symlink)
2067
2071
2068 ":tagmerge"
2072 ":tagmerge"
2069 Uses the internal tag merge algorithm (experimental).
2073 Uses the internal tag merge algorithm (experimental).
2070
2074
2071 ":union"
2075 ":union"
2072 Uses the internal non-interactive simple merge algorithm for merging
2076 Uses the internal non-interactive simple merge algorithm for merging
2073 files. It will use both left and right sides for conflict regions. No
2077 files. It will use both left and right sides for conflict regions. No
2074 markers are inserted.
2078 markers are inserted.
2075
2079
2076 Internal tools are always available and do not require a GUI but will by
2080 Internal tools are always available and do not require a GUI but will by
2077 default not handle symlinks or binary files. See next section for detail
2081 default not handle symlinks or binary files. See next section for detail
2078 about "actual capabilities" described above.
2082 about "actual capabilities" described above.
2079
2083
2080 Choosing a merge tool
2084 Choosing a merge tool
2081 =====================
2085 =====================
2082
2086
2083 Mercurial uses these rules when deciding which merge tool to use:
2087 Mercurial uses these rules when deciding which merge tool to use:
2084
2088
2085 1. If a tool has been specified with the --tool option to merge or
2089 1. If a tool has been specified with the --tool option to merge or
2086 resolve, it is used. If it is the name of a tool in the merge-tools
2090 resolve, it is used. If it is the name of a tool in the merge-tools
2087 configuration, its configuration is used. Otherwise the specified tool
2091 configuration, its configuration is used. Otherwise the specified tool
2088 must be executable by the shell.
2092 must be executable by the shell.
2089 2. If the "HGMERGE" environment variable is present, its value is used and
2093 2. If the "HGMERGE" environment variable is present, its value is used and
2090 must be executable by the shell.
2094 must be executable by the shell.
2091 3. If the filename of the file to be merged matches any of the patterns in
2095 3. If the filename of the file to be merged matches any of the patterns in
2092 the merge-patterns configuration section, the first usable merge tool
2096 the merge-patterns configuration section, the first usable merge tool
2093 corresponding to a matching pattern is used.
2097 corresponding to a matching pattern is used.
2094 4. If ui.merge is set it will be considered next. If the value is not the
2098 4. If ui.merge is set it will be considered next. If the value is not the
2095 name of a configured tool, the specified value is used and must be
2099 name of a configured tool, the specified value is used and must be
2096 executable by the shell. Otherwise the named tool is used if it is
2100 executable by the shell. Otherwise the named tool is used if it is
2097 usable.
2101 usable.
2098 5. If any usable merge tools are present in the merge-tools configuration
2102 5. If any usable merge tools are present in the merge-tools configuration
2099 section, the one with the highest priority is used.
2103 section, the one with the highest priority is used.
2100 6. If a program named "hgmerge" can be found on the system, it is used -
2104 6. If a program named "hgmerge" can be found on the system, it is used -
2101 but it will by default not be used for symlinks and binary files.
2105 but it will by default not be used for symlinks and binary files.
2102 7. If the file to be merged is not binary and is not a symlink, then
2106 7. If the file to be merged is not binary and is not a symlink, then
2103 internal ":merge" is used.
2107 internal ":merge" is used.
2104 8. Otherwise, ":prompt" is used.
2108 8. Otherwise, ":prompt" is used.
2105
2109
2106 For historical reason, Mercurial treats merge tools as below while
2110 For historical reason, Mercurial treats merge tools as below while
2107 examining rules above.
2111 examining rules above.
2108
2112
2109 step specified via binary symlink
2113 step specified via binary symlink
2110 ----------------------------------
2114 ----------------------------------
2111 1. --tool o/o o/o
2115 1. --tool o/o o/o
2112 2. HGMERGE o/o o/o
2116 2. HGMERGE o/o o/o
2113 3. merge-patterns o/o(*) x/?(*)
2117 3. merge-patterns o/o(*) x/?(*)
2114 4. ui.merge x/?(*) x/?(*)
2118 4. ui.merge x/?(*) x/?(*)
2115
2119
2116 Each capability column indicates Mercurial behavior for internal/external
2120 Each capability column indicates Mercurial behavior for internal/external
2117 merge tools at examining each rule.
2121 merge tools at examining each rule.
2118
2122
2119 - "o": "assume that a tool has capability"
2123 - "o": "assume that a tool has capability"
2120 - "x": "assume that a tool does not have capability"
2124 - "x": "assume that a tool does not have capability"
2121 - "?": "check actual capability of a tool"
2125 - "?": "check actual capability of a tool"
2122
2126
2123 If "merge.strict-capability-check" configuration is true, Mercurial checks
2127 If "merge.strict-capability-check" configuration is true, Mercurial checks
2124 capabilities of merge tools strictly in (*) cases above (= each capability
2128 capabilities of merge tools strictly in (*) cases above (= each capability
2125 column becomes "?/?"). It is false by default for backward compatibility.
2129 column becomes "?/?"). It is false by default for backward compatibility.
2126
2130
2127 Note:
2131 Note:
2128 After selecting a merge program, Mercurial will by default attempt to
2132 After selecting a merge program, Mercurial will by default attempt to
2129 merge the files using a simple merge algorithm first. Only if it
2133 merge the files using a simple merge algorithm first. Only if it
2130 doesn't succeed because of conflicting changes will Mercurial actually
2134 doesn't succeed because of conflicting changes will Mercurial actually
2131 execute the merge program. Whether to use the simple merge algorithm
2135 execute the merge program. Whether to use the simple merge algorithm
2132 first can be controlled by the premerge setting of the merge tool.
2136 first can be controlled by the premerge setting of the merge tool.
2133 Premerge is enabled by default unless the file is binary or a symlink.
2137 Premerge is enabled by default unless the file is binary or a symlink.
2134
2138
2135 See the merge-tools and ui sections of hgrc(5) for details on the
2139 See the merge-tools and ui sections of hgrc(5) for details on the
2136 configuration of merge tools.
2140 configuration of merge tools.
2137
2141
2138 Compression engines listed in `hg help bundlespec`
2142 Compression engines listed in `hg help bundlespec`
2139
2143
2140 $ hg help bundlespec | grep gzip
2144 $ hg help bundlespec | grep gzip
2141 "v1" bundles can only use the "gzip", "bzip2", and "none" compression
2145 "v1" bundles can only use the "gzip", "bzip2", and "none" compression
2142 An algorithm that produces smaller bundles than "gzip".
2146 An algorithm that produces smaller bundles than "gzip".
2143 This engine will likely produce smaller bundles than "gzip" but will be
2147 This engine will likely produce smaller bundles than "gzip" but will be
2144 "gzip"
2148 "gzip"
2145 better compression than "gzip". It also frequently yields better (?)
2149 better compression than "gzip". It also frequently yields better (?)
2146
2150
2147 Test usage of section marks in help documents
2151 Test usage of section marks in help documents
2148
2152
2149 $ cd "$TESTDIR"/../doc
2153 $ cd "$TESTDIR"/../doc
2150 $ "$PYTHON" check-seclevel.py
2154 $ "$PYTHON" check-seclevel.py
2151 $ cd $TESTTMP
2155 $ cd $TESTTMP
2152
2156
2153 #if serve
2157 #if serve
2154
2158
2155 Test the help pages in hgweb.
2159 Test the help pages in hgweb.
2156
2160
2157 Dish up an empty repo; serve it cold.
2161 Dish up an empty repo; serve it cold.
2158
2162
2159 $ hg init "$TESTTMP/test"
2163 $ hg init "$TESTTMP/test"
2160 $ hg serve -R "$TESTTMP/test" -n test -p $HGPORT -d --pid-file=hg.pid
2164 $ hg serve -R "$TESTTMP/test" -n test -p $HGPORT -d --pid-file=hg.pid
2161 $ cat hg.pid >> $DAEMON_PIDS
2165 $ cat hg.pid >> $DAEMON_PIDS
2162
2166
2163 $ get-with-headers.py $LOCALIP:$HGPORT "help"
2167 $ get-with-headers.py $LOCALIP:$HGPORT "help"
2164 200 Script output follows
2168 200 Script output follows
2165
2169
2166 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2170 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2167 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
2171 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
2168 <head>
2172 <head>
2169 <link rel="icon" href="/static/hgicon.png" type="image/png" />
2173 <link rel="icon" href="/static/hgicon.png" type="image/png" />
2170 <meta name="robots" content="index, nofollow" />
2174 <meta name="robots" content="index, nofollow" />
2171 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
2175 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
2172 <script type="text/javascript" src="/static/mercurial.js"></script>
2176 <script type="text/javascript" src="/static/mercurial.js"></script>
2173
2177
2174 <title>Help: Index</title>
2178 <title>Help: Index</title>
2175 </head>
2179 </head>
2176 <body>
2180 <body>
2177
2181
2178 <div class="container">
2182 <div class="container">
2179 <div class="menu">
2183 <div class="menu">
2180 <div class="logo">
2184 <div class="logo">
2181 <a href="https://mercurial-scm.org/">
2185 <a href="https://mercurial-scm.org/">
2182 <img src="/static/hglogo.png" alt="mercurial" /></a>
2186 <img src="/static/hglogo.png" alt="mercurial" /></a>
2183 </div>
2187 </div>
2184 <ul>
2188 <ul>
2185 <li><a href="/shortlog">log</a></li>
2189 <li><a href="/shortlog">log</a></li>
2186 <li><a href="/graph">graph</a></li>
2190 <li><a href="/graph">graph</a></li>
2187 <li><a href="/tags">tags</a></li>
2191 <li><a href="/tags">tags</a></li>
2188 <li><a href="/bookmarks">bookmarks</a></li>
2192 <li><a href="/bookmarks">bookmarks</a></li>
2189 <li><a href="/branches">branches</a></li>
2193 <li><a href="/branches">branches</a></li>
2190 </ul>
2194 </ul>
2191 <ul>
2195 <ul>
2192 <li class="active">help</li>
2196 <li class="active">help</li>
2193 </ul>
2197 </ul>
2194 </div>
2198 </div>
2195
2199
2196 <div class="main">
2200 <div class="main">
2197 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
2201 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
2198
2202
2199 <form class="search" action="/log">
2203 <form class="search" action="/log">
2200
2204
2201 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
2205 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
2202 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
2206 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
2203 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
2207 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
2204 </form>
2208 </form>
2205 <table class="bigtable">
2209 <table class="bigtable">
2206 <tr><td colspan="2"><h2><a name="topics" href="#topics">Topics</a></h2></td></tr>
2210 <tr><td colspan="2"><h2><a name="topics" href="#topics">Topics</a></h2></td></tr>
2207
2211
2208 <tr><td>
2212 <tr><td>
2209 <a href="/help/bundlespec">
2213 <a href="/help/bundlespec">
2210 bundlespec
2214 bundlespec
2211 </a>
2215 </a>
2212 </td><td>
2216 </td><td>
2213 Bundle File Formats
2217 Bundle File Formats
2214 </td></tr>
2218 </td></tr>
2215 <tr><td>
2219 <tr><td>
2216 <a href="/help/color">
2220 <a href="/help/color">
2217 color
2221 color
2218 </a>
2222 </a>
2219 </td><td>
2223 </td><td>
2220 Colorizing Outputs
2224 Colorizing Outputs
2221 </td></tr>
2225 </td></tr>
2222 <tr><td>
2226 <tr><td>
2223 <a href="/help/config">
2227 <a href="/help/config">
2224 config
2228 config
2225 </a>
2229 </a>
2226 </td><td>
2230 </td><td>
2227 Configuration Files
2231 Configuration Files
2228 </td></tr>
2232 </td></tr>
2229 <tr><td>
2233 <tr><td>
2230 <a href="/help/dates">
2234 <a href="/help/dates">
2231 dates
2235 dates
2232 </a>
2236 </a>
2233 </td><td>
2237 </td><td>
2234 Date Formats
2238 Date Formats
2235 </td></tr>
2239 </td></tr>
2236 <tr><td>
2240 <tr><td>
2237 <a href="/help/deprecated">
2241 <a href="/help/deprecated">
2238 deprecated
2242 deprecated
2239 </a>
2243 </a>
2240 </td><td>
2244 </td><td>
2241 Deprecated Features
2245 Deprecated Features
2242 </td></tr>
2246 </td></tr>
2243 <tr><td>
2247 <tr><td>
2244 <a href="/help/diffs">
2248 <a href="/help/diffs">
2245 diffs
2249 diffs
2246 </a>
2250 </a>
2247 </td><td>
2251 </td><td>
2248 Diff Formats
2252 Diff Formats
2249 </td></tr>
2253 </td></tr>
2250 <tr><td>
2254 <tr><td>
2251 <a href="/help/environment">
2255 <a href="/help/environment">
2252 environment
2256 environment
2253 </a>
2257 </a>
2254 </td><td>
2258 </td><td>
2255 Environment Variables
2259 Environment Variables
2256 </td></tr>
2260 </td></tr>
2257 <tr><td>
2261 <tr><td>
2258 <a href="/help/extensions">
2262 <a href="/help/extensions">
2259 extensions
2263 extensions
2260 </a>
2264 </a>
2261 </td><td>
2265 </td><td>
2262 Using Additional Features
2266 Using Additional Features
2263 </td></tr>
2267 </td></tr>
2264 <tr><td>
2268 <tr><td>
2265 <a href="/help/filesets">
2269 <a href="/help/filesets">
2266 filesets
2270 filesets
2267 </a>
2271 </a>
2268 </td><td>
2272 </td><td>
2269 Specifying File Sets
2273 Specifying File Sets
2270 </td></tr>
2274 </td></tr>
2271 <tr><td>
2275 <tr><td>
2272 <a href="/help/flags">
2276 <a href="/help/flags">
2273 flags
2277 flags
2274 </a>
2278 </a>
2275 </td><td>
2279 </td><td>
2276 Command-line flags
2280 Command-line flags
2277 </td></tr>
2281 </td></tr>
2278 <tr><td>
2282 <tr><td>
2279 <a href="/help/glossary">
2283 <a href="/help/glossary">
2280 glossary
2284 glossary
2281 </a>
2285 </a>
2282 </td><td>
2286 </td><td>
2283 Glossary
2287 Glossary
2284 </td></tr>
2288 </td></tr>
2285 <tr><td>
2289 <tr><td>
2286 <a href="/help/hgignore">
2290 <a href="/help/hgignore">
2287 hgignore
2291 hgignore
2288 </a>
2292 </a>
2289 </td><td>
2293 </td><td>
2290 Syntax for Mercurial Ignore Files
2294 Syntax for Mercurial Ignore Files
2291 </td></tr>
2295 </td></tr>
2292 <tr><td>
2296 <tr><td>
2293 <a href="/help/hgweb">
2297 <a href="/help/hgweb">
2294 hgweb
2298 hgweb
2295 </a>
2299 </a>
2296 </td><td>
2300 </td><td>
2297 Configuring hgweb
2301 Configuring hgweb
2298 </td></tr>
2302 </td></tr>
2299 <tr><td>
2303 <tr><td>
2300 <a href="/help/internals">
2304 <a href="/help/internals">
2301 internals
2305 internals
2302 </a>
2306 </a>
2303 </td><td>
2307 </td><td>
2304 Technical implementation topics
2308 Technical implementation topics
2305 </td></tr>
2309 </td></tr>
2306 <tr><td>
2310 <tr><td>
2307 <a href="/help/merge-tools">
2311 <a href="/help/merge-tools">
2308 merge-tools
2312 merge-tools
2309 </a>
2313 </a>
2310 </td><td>
2314 </td><td>
2311 Merge Tools
2315 Merge Tools
2312 </td></tr>
2316 </td></tr>
2313 <tr><td>
2317 <tr><td>
2314 <a href="/help/pager">
2318 <a href="/help/pager">
2315 pager
2319 pager
2316 </a>
2320 </a>
2317 </td><td>
2321 </td><td>
2318 Pager Support
2322 Pager Support
2319 </td></tr>
2323 </td></tr>
2320 <tr><td>
2324 <tr><td>
2321 <a href="/help/patterns">
2325 <a href="/help/patterns">
2322 patterns
2326 patterns
2323 </a>
2327 </a>
2324 </td><td>
2328 </td><td>
2325 File Name Patterns
2329 File Name Patterns
2326 </td></tr>
2330 </td></tr>
2327 <tr><td>
2331 <tr><td>
2328 <a href="/help/phases">
2332 <a href="/help/phases">
2329 phases
2333 phases
2330 </a>
2334 </a>
2331 </td><td>
2335 </td><td>
2332 Working with Phases
2336 Working with Phases
2333 </td></tr>
2337 </td></tr>
2334 <tr><td>
2338 <tr><td>
2335 <a href="/help/revisions">
2339 <a href="/help/revisions">
2336 revisions
2340 revisions
2337 </a>
2341 </a>
2338 </td><td>
2342 </td><td>
2339 Specifying Revisions
2343 Specifying Revisions
2340 </td></tr>
2344 </td></tr>
2341 <tr><td>
2345 <tr><td>
2342 <a href="/help/scripting">
2346 <a href="/help/scripting">
2343 scripting
2347 scripting
2344 </a>
2348 </a>
2345 </td><td>
2349 </td><td>
2346 Using Mercurial from scripts and automation
2350 Using Mercurial from scripts and automation
2347 </td></tr>
2351 </td></tr>
2348 <tr><td>
2352 <tr><td>
2349 <a href="/help/subrepos">
2353 <a href="/help/subrepos">
2350 subrepos
2354 subrepos
2351 </a>
2355 </a>
2352 </td><td>
2356 </td><td>
2353 Subrepositories
2357 Subrepositories
2354 </td></tr>
2358 </td></tr>
2355 <tr><td>
2359 <tr><td>
2356 <a href="/help/templating">
2360 <a href="/help/templating">
2357 templating
2361 templating
2358 </a>
2362 </a>
2359 </td><td>
2363 </td><td>
2360 Template Usage
2364 Template Usage
2361 </td></tr>
2365 </td></tr>
2362 <tr><td>
2366 <tr><td>
2363 <a href="/help/urls">
2367 <a href="/help/urls">
2364 urls
2368 urls
2365 </a>
2369 </a>
2366 </td><td>
2370 </td><td>
2367 URL Paths
2371 URL Paths
2368 </td></tr>
2372 </td></tr>
2369 <tr><td>
2373 <tr><td>
2370 <a href="/help/topic-containing-verbose">
2374 <a href="/help/topic-containing-verbose">
2371 topic-containing-verbose
2375 topic-containing-verbose
2372 </a>
2376 </a>
2373 </td><td>
2377 </td><td>
2374 This is the topic to test omit indicating.
2378 This is the topic to test omit indicating.
2375 </td></tr>
2379 </td></tr>
2376
2380
2377
2381
2378 <tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
2382 <tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
2379
2383
2380 <tr><td>
2384 <tr><td>
2381 <a href="/help/abort">
2385 <a href="/help/abort">
2382 abort
2386 abort
2383 </a>
2387 </a>
2384 </td><td>
2388 </td><td>
2385 abort an unfinished operation (EXPERIMENTAL)
2389 abort an unfinished operation (EXPERIMENTAL)
2386 </td></tr>
2390 </td></tr>
2387 <tr><td>
2391 <tr><td>
2388 <a href="/help/add">
2392 <a href="/help/add">
2389 add
2393 add
2390 </a>
2394 </a>
2391 </td><td>
2395 </td><td>
2392 add the specified files on the next commit
2396 add the specified files on the next commit
2393 </td></tr>
2397 </td></tr>
2394 <tr><td>
2398 <tr><td>
2395 <a href="/help/annotate">
2399 <a href="/help/annotate">
2396 annotate
2400 annotate
2397 </a>
2401 </a>
2398 </td><td>
2402 </td><td>
2399 show changeset information by line for each file
2403 show changeset information by line for each file
2400 </td></tr>
2404 </td></tr>
2401 <tr><td>
2405 <tr><td>
2402 <a href="/help/clone">
2406 <a href="/help/clone">
2403 clone
2407 clone
2404 </a>
2408 </a>
2405 </td><td>
2409 </td><td>
2406 make a copy of an existing repository
2410 make a copy of an existing repository
2407 </td></tr>
2411 </td></tr>
2408 <tr><td>
2412 <tr><td>
2409 <a href="/help/commit">
2413 <a href="/help/commit">
2410 commit
2414 commit
2411 </a>
2415 </a>
2412 </td><td>
2416 </td><td>
2413 commit the specified files or all outstanding changes
2417 commit the specified files or all outstanding changes
2414 </td></tr>
2418 </td></tr>
2415 <tr><td>
2419 <tr><td>
2416 <a href="/help/continue">
2420 <a href="/help/continue">
2417 continue
2421 continue
2418 </a>
2422 </a>
2419 </td><td>
2423 </td><td>
2420 resumes an interrupted operation (EXPERIMENTAL)
2424 resumes an interrupted operation (EXPERIMENTAL)
2421 </td></tr>
2425 </td></tr>
2422 <tr><td>
2426 <tr><td>
2423 <a href="/help/diff">
2427 <a href="/help/diff">
2424 diff
2428 diff
2425 </a>
2429 </a>
2426 </td><td>
2430 </td><td>
2427 diff repository (or selected files)
2431 diff repository (or selected files)
2428 </td></tr>
2432 </td></tr>
2429 <tr><td>
2433 <tr><td>
2430 <a href="/help/export">
2434 <a href="/help/export">
2431 export
2435 export
2432 </a>
2436 </a>
2433 </td><td>
2437 </td><td>
2434 dump the header and diffs for one or more changesets
2438 dump the header and diffs for one or more changesets
2435 </td></tr>
2439 </td></tr>
2436 <tr><td>
2440 <tr><td>
2437 <a href="/help/forget">
2441 <a href="/help/forget">
2438 forget
2442 forget
2439 </a>
2443 </a>
2440 </td><td>
2444 </td><td>
2441 forget the specified files on the next commit
2445 forget the specified files on the next commit
2442 </td></tr>
2446 </td></tr>
2443 <tr><td>
2447 <tr><td>
2444 <a href="/help/init">
2448 <a href="/help/init">
2445 init
2449 init
2446 </a>
2450 </a>
2447 </td><td>
2451 </td><td>
2448 create a new repository in the given directory
2452 create a new repository in the given directory
2449 </td></tr>
2453 </td></tr>
2450 <tr><td>
2454 <tr><td>
2451 <a href="/help/log">
2455 <a href="/help/log">
2452 log
2456 log
2453 </a>
2457 </a>
2454 </td><td>
2458 </td><td>
2455 show revision history of entire repository or files
2459 show revision history of entire repository or files
2456 </td></tr>
2460 </td></tr>
2457 <tr><td>
2461 <tr><td>
2458 <a href="/help/merge">
2462 <a href="/help/merge">
2459 merge
2463 merge
2460 </a>
2464 </a>
2461 </td><td>
2465 </td><td>
2462 merge another revision into working directory
2466 merge another revision into working directory
2463 </td></tr>
2467 </td></tr>
2464 <tr><td>
2468 <tr><td>
2465 <a href="/help/pull">
2469 <a href="/help/pull">
2466 pull
2470 pull
2467 </a>
2471 </a>
2468 </td><td>
2472 </td><td>
2469 pull changes from the specified source
2473 pull changes from the specified source
2470 </td></tr>
2474 </td></tr>
2471 <tr><td>
2475 <tr><td>
2472 <a href="/help/push">
2476 <a href="/help/push">
2473 push
2477 push
2474 </a>
2478 </a>
2475 </td><td>
2479 </td><td>
2476 push changes to the specified destination
2480 push changes to the specified destination
2477 </td></tr>
2481 </td></tr>
2478 <tr><td>
2482 <tr><td>
2479 <a href="/help/remove">
2483 <a href="/help/remove">
2480 remove
2484 remove
2481 </a>
2485 </a>
2482 </td><td>
2486 </td><td>
2483 remove the specified files on the next commit
2487 remove the specified files on the next commit
2484 </td></tr>
2488 </td></tr>
2485 <tr><td>
2489 <tr><td>
2486 <a href="/help/serve">
2490 <a href="/help/serve">
2487 serve
2491 serve
2488 </a>
2492 </a>
2489 </td><td>
2493 </td><td>
2490 start stand-alone webserver
2494 start stand-alone webserver
2491 </td></tr>
2495 </td></tr>
2492 <tr><td>
2496 <tr><td>
2493 <a href="/help/status">
2497 <a href="/help/status">
2494 status
2498 status
2495 </a>
2499 </a>
2496 </td><td>
2500 </td><td>
2497 show changed files in the working directory
2501 show changed files in the working directory
2498 </td></tr>
2502 </td></tr>
2499 <tr><td>
2503 <tr><td>
2500 <a href="/help/summary">
2504 <a href="/help/summary">
2501 summary
2505 summary
2502 </a>
2506 </a>
2503 </td><td>
2507 </td><td>
2504 summarize working directory state
2508 summarize working directory state
2505 </td></tr>
2509 </td></tr>
2506 <tr><td>
2510 <tr><td>
2507 <a href="/help/update">
2511 <a href="/help/update">
2508 update
2512 update
2509 </a>
2513 </a>
2510 </td><td>
2514 </td><td>
2511 update working directory (or switch revisions)
2515 update working directory (or switch revisions)
2512 </td></tr>
2516 </td></tr>
2513
2517
2514
2518
2515
2519
2516 <tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
2520 <tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
2517
2521
2518 <tr><td>
2522 <tr><td>
2519 <a href="/help/addremove">
2523 <a href="/help/addremove">
2520 addremove
2524 addremove
2521 </a>
2525 </a>
2522 </td><td>
2526 </td><td>
2523 add all new files, delete all missing files
2527 add all new files, delete all missing files
2524 </td></tr>
2528 </td></tr>
2525 <tr><td>
2529 <tr><td>
2526 <a href="/help/archive">
2530 <a href="/help/archive">
2527 archive
2531 archive
2528 </a>
2532 </a>
2529 </td><td>
2533 </td><td>
2530 create an unversioned archive of a repository revision
2534 create an unversioned archive of a repository revision
2531 </td></tr>
2535 </td></tr>
2532 <tr><td>
2536 <tr><td>
2533 <a href="/help/backout">
2537 <a href="/help/backout">
2534 backout
2538 backout
2535 </a>
2539 </a>
2536 </td><td>
2540 </td><td>
2537 reverse effect of earlier changeset
2541 reverse effect of earlier changeset
2538 </td></tr>
2542 </td></tr>
2539 <tr><td>
2543 <tr><td>
2540 <a href="/help/bisect">
2544 <a href="/help/bisect">
2541 bisect
2545 bisect
2542 </a>
2546 </a>
2543 </td><td>
2547 </td><td>
2544 subdivision search of changesets
2548 subdivision search of changesets
2545 </td></tr>
2549 </td></tr>
2546 <tr><td>
2550 <tr><td>
2547 <a href="/help/bookmarks">
2551 <a href="/help/bookmarks">
2548 bookmarks
2552 bookmarks
2549 </a>
2553 </a>
2550 </td><td>
2554 </td><td>
2551 create a new bookmark or list existing bookmarks
2555 create a new bookmark or list existing bookmarks
2552 </td></tr>
2556 </td></tr>
2553 <tr><td>
2557 <tr><td>
2554 <a href="/help/branch">
2558 <a href="/help/branch">
2555 branch
2559 branch
2556 </a>
2560 </a>
2557 </td><td>
2561 </td><td>
2558 set or show the current branch name
2562 set or show the current branch name
2559 </td></tr>
2563 </td></tr>
2560 <tr><td>
2564 <tr><td>
2561 <a href="/help/branches">
2565 <a href="/help/branches">
2562 branches
2566 branches
2563 </a>
2567 </a>
2564 </td><td>
2568 </td><td>
2565 list repository named branches
2569 list repository named branches
2566 </td></tr>
2570 </td></tr>
2567 <tr><td>
2571 <tr><td>
2568 <a href="/help/bundle">
2572 <a href="/help/bundle">
2569 bundle
2573 bundle
2570 </a>
2574 </a>
2571 </td><td>
2575 </td><td>
2572 create a bundle file
2576 create a bundle file
2573 </td></tr>
2577 </td></tr>
2574 <tr><td>
2578 <tr><td>
2575 <a href="/help/cat">
2579 <a href="/help/cat">
2576 cat
2580 cat
2577 </a>
2581 </a>
2578 </td><td>
2582 </td><td>
2579 output the current or given revision of files
2583 output the current or given revision of files
2580 </td></tr>
2584 </td></tr>
2581 <tr><td>
2585 <tr><td>
2582 <a href="/help/config">
2586 <a href="/help/config">
2583 config
2587 config
2584 </a>
2588 </a>
2585 </td><td>
2589 </td><td>
2586 show combined config settings from all hgrc files
2590 show combined config settings from all hgrc files
2587 </td></tr>
2591 </td></tr>
2588 <tr><td>
2592 <tr><td>
2589 <a href="/help/copy">
2593 <a href="/help/copy">
2590 copy
2594 copy
2591 </a>
2595 </a>
2592 </td><td>
2596 </td><td>
2593 mark files as copied for the next commit
2597 mark files as copied for the next commit
2594 </td></tr>
2598 </td></tr>
2595 <tr><td>
2599 <tr><td>
2596 <a href="/help/files">
2600 <a href="/help/files">
2597 files
2601 files
2598 </a>
2602 </a>
2599 </td><td>
2603 </td><td>
2600 list tracked files
2604 list tracked files
2601 </td></tr>
2605 </td></tr>
2602 <tr><td>
2606 <tr><td>
2603 <a href="/help/graft">
2607 <a href="/help/graft">
2604 graft
2608 graft
2605 </a>
2609 </a>
2606 </td><td>
2610 </td><td>
2607 copy changes from other branches onto the current branch
2611 copy changes from other branches onto the current branch
2608 </td></tr>
2612 </td></tr>
2609 <tr><td>
2613 <tr><td>
2610 <a href="/help/grep">
2614 <a href="/help/grep">
2611 grep
2615 grep
2612 </a>
2616 </a>
2613 </td><td>
2617 </td><td>
2614 search for a pattern in specified files
2618 search for a pattern in specified files
2615 </td></tr>
2619 </td></tr>
2616 <tr><td>
2620 <tr><td>
2617 <a href="/help/hashelp">
2621 <a href="/help/hashelp">
2618 hashelp
2622 hashelp
2619 </a>
2623 </a>
2620 </td><td>
2624 </td><td>
2621 Extension command's help
2625 Extension command's help
2622 </td></tr>
2626 </td></tr>
2623 <tr><td>
2627 <tr><td>
2624 <a href="/help/heads">
2628 <a href="/help/heads">
2625 heads
2629 heads
2626 </a>
2630 </a>
2627 </td><td>
2631 </td><td>
2628 show branch heads
2632 show branch heads
2629 </td></tr>
2633 </td></tr>
2630 <tr><td>
2634 <tr><td>
2631 <a href="/help/help">
2635 <a href="/help/help">
2632 help
2636 help
2633 </a>
2637 </a>
2634 </td><td>
2638 </td><td>
2635 show help for a given topic or a help overview
2639 show help for a given topic or a help overview
2636 </td></tr>
2640 </td></tr>
2637 <tr><td>
2641 <tr><td>
2638 <a href="/help/hgalias">
2642 <a href="/help/hgalias">
2639 hgalias
2643 hgalias
2640 </a>
2644 </a>
2641 </td><td>
2645 </td><td>
2642 My doc
2646 My doc
2643 </td></tr>
2647 </td></tr>
2644 <tr><td>
2648 <tr><td>
2645 <a href="/help/hgaliasnodoc">
2649 <a href="/help/hgaliasnodoc">
2646 hgaliasnodoc
2650 hgaliasnodoc
2647 </a>
2651 </a>
2648 </td><td>
2652 </td><td>
2649 summarize working directory state
2653 summarize working directory state
2650 </td></tr>
2654 </td></tr>
2651 <tr><td>
2655 <tr><td>
2652 <a href="/help/identify">
2656 <a href="/help/identify">
2653 identify
2657 identify
2654 </a>
2658 </a>
2655 </td><td>
2659 </td><td>
2656 identify the working directory or specified revision
2660 identify the working directory or specified revision
2657 </td></tr>
2661 </td></tr>
2658 <tr><td>
2662 <tr><td>
2659 <a href="/help/import">
2663 <a href="/help/import">
2660 import
2664 import
2661 </a>
2665 </a>
2662 </td><td>
2666 </td><td>
2663 import an ordered set of patches
2667 import an ordered set of patches
2664 </td></tr>
2668 </td></tr>
2665 <tr><td>
2669 <tr><td>
2666 <a href="/help/incoming">
2670 <a href="/help/incoming">
2667 incoming
2671 incoming
2668 </a>
2672 </a>
2669 </td><td>
2673 </td><td>
2670 show new changesets found in source
2674 show new changesets found in source
2671 </td></tr>
2675 </td></tr>
2672 <tr><td>
2676 <tr><td>
2673 <a href="/help/manifest">
2677 <a href="/help/manifest">
2674 manifest
2678 manifest
2675 </a>
2679 </a>
2676 </td><td>
2680 </td><td>
2677 output the current or given revision of the project manifest
2681 output the current or given revision of the project manifest
2678 </td></tr>
2682 </td></tr>
2679 <tr><td>
2683 <tr><td>
2680 <a href="/help/nohelp">
2684 <a href="/help/nohelp">
2681 nohelp
2685 nohelp
2682 </a>
2686 </a>
2683 </td><td>
2687 </td><td>
2684 (no help text available)
2688 (no help text available)
2685 </td></tr>
2689 </td></tr>
2686 <tr><td>
2690 <tr><td>
2687 <a href="/help/outgoing">
2691 <a href="/help/outgoing">
2688 outgoing
2692 outgoing
2689 </a>
2693 </a>
2690 </td><td>
2694 </td><td>
2691 show changesets not found in the destination
2695 show changesets not found in the destination
2692 </td></tr>
2696 </td></tr>
2693 <tr><td>
2697 <tr><td>
2694 <a href="/help/paths">
2698 <a href="/help/paths">
2695 paths
2699 paths
2696 </a>
2700 </a>
2697 </td><td>
2701 </td><td>
2698 show aliases for remote repositories
2702 show aliases for remote repositories
2699 </td></tr>
2703 </td></tr>
2700 <tr><td>
2704 <tr><td>
2701 <a href="/help/phase">
2705 <a href="/help/phase">
2702 phase
2706 phase
2703 </a>
2707 </a>
2704 </td><td>
2708 </td><td>
2705 set or show the current phase name
2709 set or show the current phase name
2706 </td></tr>
2710 </td></tr>
2707 <tr><td>
2711 <tr><td>
2708 <a href="/help/recover">
2712 <a href="/help/recover">
2709 recover
2713 recover
2710 </a>
2714 </a>
2711 </td><td>
2715 </td><td>
2712 roll back an interrupted transaction
2716 roll back an interrupted transaction
2713 </td></tr>
2717 </td></tr>
2714 <tr><td>
2718 <tr><td>
2715 <a href="/help/rename">
2719 <a href="/help/rename">
2716 rename
2720 rename
2717 </a>
2721 </a>
2718 </td><td>
2722 </td><td>
2719 rename files; equivalent of copy + remove
2723 rename files; equivalent of copy + remove
2720 </td></tr>
2724 </td></tr>
2721 <tr><td>
2725 <tr><td>
2722 <a href="/help/resolve">
2726 <a href="/help/resolve">
2723 resolve
2727 resolve
2724 </a>
2728 </a>
2725 </td><td>
2729 </td><td>
2726 redo merges or set/view the merge status of files
2730 redo merges or set/view the merge status of files
2727 </td></tr>
2731 </td></tr>
2728 <tr><td>
2732 <tr><td>
2729 <a href="/help/revert">
2733 <a href="/help/revert">
2730 revert
2734 revert
2731 </a>
2735 </a>
2732 </td><td>
2736 </td><td>
2733 restore files to their checkout state
2737 restore files to their checkout state
2734 </td></tr>
2738 </td></tr>
2735 <tr><td>
2739 <tr><td>
2736 <a href="/help/root">
2740 <a href="/help/root">
2737 root
2741 root
2738 </a>
2742 </a>
2739 </td><td>
2743 </td><td>
2740 print the root (top) of the current working directory
2744 print the root (top) of the current working directory
2741 </td></tr>
2745 </td></tr>
2742 <tr><td>
2746 <tr><td>
2743 <a href="/help/shellalias">
2747 <a href="/help/shellalias">
2744 shellalias
2748 shellalias
2745 </a>
2749 </a>
2746 </td><td>
2750 </td><td>
2747 (no help text available)
2751 (no help text available)
2748 </td></tr>
2752 </td></tr>
2749 <tr><td>
2753 <tr><td>
2750 <a href="/help/shelve">
2754 <a href="/help/shelve">
2751 shelve
2755 shelve
2752 </a>
2756 </a>
2753 </td><td>
2757 </td><td>
2754 save and set aside changes from the working directory
2758 save and set aside changes from the working directory
2755 </td></tr>
2759 </td></tr>
2756 <tr><td>
2760 <tr><td>
2757 <a href="/help/tag">
2761 <a href="/help/tag">
2758 tag
2762 tag
2759 </a>
2763 </a>
2760 </td><td>
2764 </td><td>
2761 add one or more tags for the current or given revision
2765 add one or more tags for the current or given revision
2762 </td></tr>
2766 </td></tr>
2763 <tr><td>
2767 <tr><td>
2764 <a href="/help/tags">
2768 <a href="/help/tags">
2765 tags
2769 tags
2766 </a>
2770 </a>
2767 </td><td>
2771 </td><td>
2768 list repository tags
2772 list repository tags
2769 </td></tr>
2773 </td></tr>
2770 <tr><td>
2774 <tr><td>
2771 <a href="/help/unbundle">
2775 <a href="/help/unbundle">
2772 unbundle
2776 unbundle
2773 </a>
2777 </a>
2774 </td><td>
2778 </td><td>
2775 apply one or more bundle files
2779 apply one or more bundle files
2776 </td></tr>
2780 </td></tr>
2777 <tr><td>
2781 <tr><td>
2778 <a href="/help/unshelve">
2782 <a href="/help/unshelve">
2779 unshelve
2783 unshelve
2780 </a>
2784 </a>
2781 </td><td>
2785 </td><td>
2782 restore a shelved change to the working directory
2786 restore a shelved change to the working directory
2783 </td></tr>
2787 </td></tr>
2784 <tr><td>
2788 <tr><td>
2785 <a href="/help/verify">
2789 <a href="/help/verify">
2786 verify
2790 verify
2787 </a>
2791 </a>
2788 </td><td>
2792 </td><td>
2789 verify the integrity of the repository
2793 verify the integrity of the repository
2790 </td></tr>
2794 </td></tr>
2791 <tr><td>
2795 <tr><td>
2792 <a href="/help/version">
2796 <a href="/help/version">
2793 version
2797 version
2794 </a>
2798 </a>
2795 </td><td>
2799 </td><td>
2796 output version and copyright information
2800 output version and copyright information
2797 </td></tr>
2801 </td></tr>
2798
2802
2799
2803
2800 </table>
2804 </table>
2801 </div>
2805 </div>
2802 </div>
2806 </div>
2803
2807
2804
2808
2805
2809
2806 </body>
2810 </body>
2807 </html>
2811 </html>
2808
2812
2809
2813
2810 $ get-with-headers.py $LOCALIP:$HGPORT "help/add"
2814 $ get-with-headers.py $LOCALIP:$HGPORT "help/add"
2811 200 Script output follows
2815 200 Script output follows
2812
2816
2813 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2817 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2814 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
2818 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
2815 <head>
2819 <head>
2816 <link rel="icon" href="/static/hgicon.png" type="image/png" />
2820 <link rel="icon" href="/static/hgicon.png" type="image/png" />
2817 <meta name="robots" content="index, nofollow" />
2821 <meta name="robots" content="index, nofollow" />
2818 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
2822 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
2819 <script type="text/javascript" src="/static/mercurial.js"></script>
2823 <script type="text/javascript" src="/static/mercurial.js"></script>
2820
2824
2821 <title>Help: add</title>
2825 <title>Help: add</title>
2822 </head>
2826 </head>
2823 <body>
2827 <body>
2824
2828
2825 <div class="container">
2829 <div class="container">
2826 <div class="menu">
2830 <div class="menu">
2827 <div class="logo">
2831 <div class="logo">
2828 <a href="https://mercurial-scm.org/">
2832 <a href="https://mercurial-scm.org/">
2829 <img src="/static/hglogo.png" alt="mercurial" /></a>
2833 <img src="/static/hglogo.png" alt="mercurial" /></a>
2830 </div>
2834 </div>
2831 <ul>
2835 <ul>
2832 <li><a href="/shortlog">log</a></li>
2836 <li><a href="/shortlog">log</a></li>
2833 <li><a href="/graph">graph</a></li>
2837 <li><a href="/graph">graph</a></li>
2834 <li><a href="/tags">tags</a></li>
2838 <li><a href="/tags">tags</a></li>
2835 <li><a href="/bookmarks">bookmarks</a></li>
2839 <li><a href="/bookmarks">bookmarks</a></li>
2836 <li><a href="/branches">branches</a></li>
2840 <li><a href="/branches">branches</a></li>
2837 </ul>
2841 </ul>
2838 <ul>
2842 <ul>
2839 <li class="active"><a href="/help">help</a></li>
2843 <li class="active"><a href="/help">help</a></li>
2840 </ul>
2844 </ul>
2841 </div>
2845 </div>
2842
2846
2843 <div class="main">
2847 <div class="main">
2844 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
2848 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
2845 <h3>Help: add</h3>
2849 <h3>Help: add</h3>
2846
2850
2847 <form class="search" action="/log">
2851 <form class="search" action="/log">
2848
2852
2849 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
2853 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
2850 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
2854 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
2851 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
2855 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
2852 </form>
2856 </form>
2853 <div id="doc">
2857 <div id="doc">
2854 <p>
2858 <p>
2855 hg add [OPTION]... [FILE]...
2859 hg add [OPTION]... [FILE]...
2856 </p>
2860 </p>
2857 <p>
2861 <p>
2858 add the specified files on the next commit
2862 add the specified files on the next commit
2859 </p>
2863 </p>
2860 <p>
2864 <p>
2861 Schedule files to be version controlled and added to the
2865 Schedule files to be version controlled and added to the
2862 repository.
2866 repository.
2863 </p>
2867 </p>
2864 <p>
2868 <p>
2865 The files will be added to the repository at the next commit. To
2869 The files will be added to the repository at the next commit. To
2866 undo an add before that, see 'hg forget'.
2870 undo an add before that, see 'hg forget'.
2867 </p>
2871 </p>
2868 <p>
2872 <p>
2869 If no names are given, add all files to the repository (except
2873 If no names are given, add all files to the repository (except
2870 files matching &quot;.hgignore&quot;).
2874 files matching &quot;.hgignore&quot;).
2871 </p>
2875 </p>
2872 <p>
2876 <p>
2873 Examples:
2877 Examples:
2874 </p>
2878 </p>
2875 <ul>
2879 <ul>
2876 <li> New (unknown) files are added automatically by 'hg add':
2880 <li> New (unknown) files are added automatically by 'hg add':
2877 <pre>
2881 <pre>
2878 \$ ls (re)
2882 \$ ls (re)
2879 foo.c
2883 foo.c
2880 \$ hg status (re)
2884 \$ hg status (re)
2881 ? foo.c
2885 ? foo.c
2882 \$ hg add (re)
2886 \$ hg add (re)
2883 adding foo.c
2887 adding foo.c
2884 \$ hg status (re)
2888 \$ hg status (re)
2885 A foo.c
2889 A foo.c
2886 </pre>
2890 </pre>
2887 <li> Specific files to be added can be specified:
2891 <li> Specific files to be added can be specified:
2888 <pre>
2892 <pre>
2889 \$ ls (re)
2893 \$ ls (re)
2890 bar.c foo.c
2894 bar.c foo.c
2891 \$ hg status (re)
2895 \$ hg status (re)
2892 ? bar.c
2896 ? bar.c
2893 ? foo.c
2897 ? foo.c
2894 \$ hg add bar.c (re)
2898 \$ hg add bar.c (re)
2895 \$ hg status (re)
2899 \$ hg status (re)
2896 A bar.c
2900 A bar.c
2897 ? foo.c
2901 ? foo.c
2898 </pre>
2902 </pre>
2899 </ul>
2903 </ul>
2900 <p>
2904 <p>
2901 Returns 0 if all files are successfully added.
2905 Returns 0 if all files are successfully added.
2902 </p>
2906 </p>
2903 <p>
2907 <p>
2904 options ([+] can be repeated):
2908 options ([+] can be repeated):
2905 </p>
2909 </p>
2906 <table>
2910 <table>
2907 <tr><td>-I</td>
2911 <tr><td>-I</td>
2908 <td>--include PATTERN [+]</td>
2912 <td>--include PATTERN [+]</td>
2909 <td>include names matching the given patterns</td></tr>
2913 <td>include names matching the given patterns</td></tr>
2910 <tr><td>-X</td>
2914 <tr><td>-X</td>
2911 <td>--exclude PATTERN [+]</td>
2915 <td>--exclude PATTERN [+]</td>
2912 <td>exclude names matching the given patterns</td></tr>
2916 <td>exclude names matching the given patterns</td></tr>
2913 <tr><td>-S</td>
2917 <tr><td>-S</td>
2914 <td>--subrepos</td>
2918 <td>--subrepos</td>
2915 <td>recurse into subrepositories</td></tr>
2919 <td>recurse into subrepositories</td></tr>
2916 <tr><td>-n</td>
2920 <tr><td>-n</td>
2917 <td>--dry-run</td>
2921 <td>--dry-run</td>
2918 <td>do not perform actions, just print output</td></tr>
2922 <td>do not perform actions, just print output</td></tr>
2919 </table>
2923 </table>
2920 <p>
2924 <p>
2921 global options ([+] can be repeated):
2925 global options ([+] can be repeated):
2922 </p>
2926 </p>
2923 <table>
2927 <table>
2924 <tr><td>-R</td>
2928 <tr><td>-R</td>
2925 <td>--repository REPO</td>
2929 <td>--repository REPO</td>
2926 <td>repository root directory or name of overlay bundle file</td></tr>
2930 <td>repository root directory or name of overlay bundle file</td></tr>
2927 <tr><td></td>
2931 <tr><td></td>
2928 <td>--cwd DIR</td>
2932 <td>--cwd DIR</td>
2929 <td>change working directory</td></tr>
2933 <td>change working directory</td></tr>
2930 <tr><td>-y</td>
2934 <tr><td>-y</td>
2931 <td>--noninteractive</td>
2935 <td>--noninteractive</td>
2932 <td>do not prompt, automatically pick the first choice for all prompts</td></tr>
2936 <td>do not prompt, automatically pick the first choice for all prompts</td></tr>
2933 <tr><td>-q</td>
2937 <tr><td>-q</td>
2934 <td>--quiet</td>
2938 <td>--quiet</td>
2935 <td>suppress output</td></tr>
2939 <td>suppress output</td></tr>
2936 <tr><td>-v</td>
2940 <tr><td>-v</td>
2937 <td>--verbose</td>
2941 <td>--verbose</td>
2938 <td>enable additional output</td></tr>
2942 <td>enable additional output</td></tr>
2939 <tr><td></td>
2943 <tr><td></td>
2940 <td>--color TYPE</td>
2944 <td>--color TYPE</td>
2941 <td>when to colorize (boolean, always, auto, never, or debug)</td></tr>
2945 <td>when to colorize (boolean, always, auto, never, or debug)</td></tr>
2942 <tr><td></td>
2946 <tr><td></td>
2943 <td>--config CONFIG [+]</td>
2947 <td>--config CONFIG [+]</td>
2944 <td>set/override config option (use 'section.name=value')</td></tr>
2948 <td>set/override config option (use 'section.name=value')</td></tr>
2945 <tr><td></td>
2949 <tr><td></td>
2946 <td>--debug</td>
2950 <td>--debug</td>
2947 <td>enable debugging output</td></tr>
2951 <td>enable debugging output</td></tr>
2948 <tr><td></td>
2952 <tr><td></td>
2949 <td>--debugger</td>
2953 <td>--debugger</td>
2950 <td>start debugger</td></tr>
2954 <td>start debugger</td></tr>
2951 <tr><td></td>
2955 <tr><td></td>
2952 <td>--encoding ENCODE</td>
2956 <td>--encoding ENCODE</td>
2953 <td>set the charset encoding (default: ascii)</td></tr>
2957 <td>set the charset encoding (default: ascii)</td></tr>
2954 <tr><td></td>
2958 <tr><td></td>
2955 <td>--encodingmode MODE</td>
2959 <td>--encodingmode MODE</td>
2956 <td>set the charset encoding mode (default: strict)</td></tr>
2960 <td>set the charset encoding mode (default: strict)</td></tr>
2957 <tr><td></td>
2961 <tr><td></td>
2958 <td>--traceback</td>
2962 <td>--traceback</td>
2959 <td>always print a traceback on exception</td></tr>
2963 <td>always print a traceback on exception</td></tr>
2960 <tr><td></td>
2964 <tr><td></td>
2961 <td>--time</td>
2965 <td>--time</td>
2962 <td>time how long the command takes</td></tr>
2966 <td>time how long the command takes</td></tr>
2963 <tr><td></td>
2967 <tr><td></td>
2964 <td>--profile</td>
2968 <td>--profile</td>
2965 <td>print command execution profile</td></tr>
2969 <td>print command execution profile</td></tr>
2966 <tr><td></td>
2970 <tr><td></td>
2967 <td>--version</td>
2971 <td>--version</td>
2968 <td>output version information and exit</td></tr>
2972 <td>output version information and exit</td></tr>
2969 <tr><td>-h</td>
2973 <tr><td>-h</td>
2970 <td>--help</td>
2974 <td>--help</td>
2971 <td>display help and exit</td></tr>
2975 <td>display help and exit</td></tr>
2972 <tr><td></td>
2976 <tr><td></td>
2973 <td>--hidden</td>
2977 <td>--hidden</td>
2974 <td>consider hidden changesets</td></tr>
2978 <td>consider hidden changesets</td></tr>
2975 <tr><td></td>
2979 <tr><td></td>
2976 <td>--pager TYPE</td>
2980 <td>--pager TYPE</td>
2977 <td>when to paginate (boolean, always, auto, or never) (default: auto)</td></tr>
2981 <td>when to paginate (boolean, always, auto, or never) (default: auto)</td></tr>
2978 </table>
2982 </table>
2979
2983
2980 </div>
2984 </div>
2981 </div>
2985 </div>
2982 </div>
2986 </div>
2983
2987
2984
2988
2985
2989
2986 </body>
2990 </body>
2987 </html>
2991 </html>
2988
2992
2989
2993
2990 $ get-with-headers.py $LOCALIP:$HGPORT "help/remove"
2994 $ get-with-headers.py $LOCALIP:$HGPORT "help/remove"
2991 200 Script output follows
2995 200 Script output follows
2992
2996
2993 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2997 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2994 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
2998 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
2995 <head>
2999 <head>
2996 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3000 <link rel="icon" href="/static/hgicon.png" type="image/png" />
2997 <meta name="robots" content="index, nofollow" />
3001 <meta name="robots" content="index, nofollow" />
2998 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3002 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
2999 <script type="text/javascript" src="/static/mercurial.js"></script>
3003 <script type="text/javascript" src="/static/mercurial.js"></script>
3000
3004
3001 <title>Help: remove</title>
3005 <title>Help: remove</title>
3002 </head>
3006 </head>
3003 <body>
3007 <body>
3004
3008
3005 <div class="container">
3009 <div class="container">
3006 <div class="menu">
3010 <div class="menu">
3007 <div class="logo">
3011 <div class="logo">
3008 <a href="https://mercurial-scm.org/">
3012 <a href="https://mercurial-scm.org/">
3009 <img src="/static/hglogo.png" alt="mercurial" /></a>
3013 <img src="/static/hglogo.png" alt="mercurial" /></a>
3010 </div>
3014 </div>
3011 <ul>
3015 <ul>
3012 <li><a href="/shortlog">log</a></li>
3016 <li><a href="/shortlog">log</a></li>
3013 <li><a href="/graph">graph</a></li>
3017 <li><a href="/graph">graph</a></li>
3014 <li><a href="/tags">tags</a></li>
3018 <li><a href="/tags">tags</a></li>
3015 <li><a href="/bookmarks">bookmarks</a></li>
3019 <li><a href="/bookmarks">bookmarks</a></li>
3016 <li><a href="/branches">branches</a></li>
3020 <li><a href="/branches">branches</a></li>
3017 </ul>
3021 </ul>
3018 <ul>
3022 <ul>
3019 <li class="active"><a href="/help">help</a></li>
3023 <li class="active"><a href="/help">help</a></li>
3020 </ul>
3024 </ul>
3021 </div>
3025 </div>
3022
3026
3023 <div class="main">
3027 <div class="main">
3024 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3028 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3025 <h3>Help: remove</h3>
3029 <h3>Help: remove</h3>
3026
3030
3027 <form class="search" action="/log">
3031 <form class="search" action="/log">
3028
3032
3029 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3033 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3030 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3034 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3031 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3035 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3032 </form>
3036 </form>
3033 <div id="doc">
3037 <div id="doc">
3034 <p>
3038 <p>
3035 hg remove [OPTION]... FILE...
3039 hg remove [OPTION]... FILE...
3036 </p>
3040 </p>
3037 <p>
3041 <p>
3038 aliases: rm
3042 aliases: rm
3039 </p>
3043 </p>
3040 <p>
3044 <p>
3041 remove the specified files on the next commit
3045 remove the specified files on the next commit
3042 </p>
3046 </p>
3043 <p>
3047 <p>
3044 Schedule the indicated files for removal from the current branch.
3048 Schedule the indicated files for removal from the current branch.
3045 </p>
3049 </p>
3046 <p>
3050 <p>
3047 This command schedules the files to be removed at the next commit.
3051 This command schedules the files to be removed at the next commit.
3048 To undo a remove before that, see 'hg revert'. To undo added
3052 To undo a remove before that, see 'hg revert'. To undo added
3049 files, see 'hg forget'.
3053 files, see 'hg forget'.
3050 </p>
3054 </p>
3051 <p>
3055 <p>
3052 -A/--after can be used to remove only files that have already
3056 -A/--after can be used to remove only files that have already
3053 been deleted, -f/--force can be used to force deletion, and -Af
3057 been deleted, -f/--force can be used to force deletion, and -Af
3054 can be used to remove files from the next revision without
3058 can be used to remove files from the next revision without
3055 deleting them from the working directory.
3059 deleting them from the working directory.
3056 </p>
3060 </p>
3057 <p>
3061 <p>
3058 The following table details the behavior of remove for different
3062 The following table details the behavior of remove for different
3059 file states (columns) and option combinations (rows). The file
3063 file states (columns) and option combinations (rows). The file
3060 states are Added [A], Clean [C], Modified [M] and Missing [!]
3064 states are Added [A], Clean [C], Modified [M] and Missing [!]
3061 (as reported by 'hg status'). The actions are Warn, Remove
3065 (as reported by 'hg status'). The actions are Warn, Remove
3062 (from branch) and Delete (from disk):
3066 (from branch) and Delete (from disk):
3063 </p>
3067 </p>
3064 <table>
3068 <table>
3065 <tr><td>opt/state</td>
3069 <tr><td>opt/state</td>
3066 <td>A</td>
3070 <td>A</td>
3067 <td>C</td>
3071 <td>C</td>
3068 <td>M</td>
3072 <td>M</td>
3069 <td>!</td></tr>
3073 <td>!</td></tr>
3070 <tr><td>none</td>
3074 <tr><td>none</td>
3071 <td>W</td>
3075 <td>W</td>
3072 <td>RD</td>
3076 <td>RD</td>
3073 <td>W</td>
3077 <td>W</td>
3074 <td>R</td></tr>
3078 <td>R</td></tr>
3075 <tr><td>-f</td>
3079 <tr><td>-f</td>
3076 <td>R</td>
3080 <td>R</td>
3077 <td>RD</td>
3081 <td>RD</td>
3078 <td>RD</td>
3082 <td>RD</td>
3079 <td>R</td></tr>
3083 <td>R</td></tr>
3080 <tr><td>-A</td>
3084 <tr><td>-A</td>
3081 <td>W</td>
3085 <td>W</td>
3082 <td>W</td>
3086 <td>W</td>
3083 <td>W</td>
3087 <td>W</td>
3084 <td>R</td></tr>
3088 <td>R</td></tr>
3085 <tr><td>-Af</td>
3089 <tr><td>-Af</td>
3086 <td>R</td>
3090 <td>R</td>
3087 <td>R</td>
3091 <td>R</td>
3088 <td>R</td>
3092 <td>R</td>
3089 <td>R</td></tr>
3093 <td>R</td></tr>
3090 </table>
3094 </table>
3091 <p>
3095 <p>
3092 <b>Note:</b>
3096 <b>Note:</b>
3093 </p>
3097 </p>
3094 <p>
3098 <p>
3095 'hg remove' never deletes files in Added [A] state from the
3099 'hg remove' never deletes files in Added [A] state from the
3096 working directory, not even if &quot;--force&quot; is specified.
3100 working directory, not even if &quot;--force&quot; is specified.
3097 </p>
3101 </p>
3098 <p>
3102 <p>
3099 Returns 0 on success, 1 if any warnings encountered.
3103 Returns 0 on success, 1 if any warnings encountered.
3100 </p>
3104 </p>
3101 <p>
3105 <p>
3102 options ([+] can be repeated):
3106 options ([+] can be repeated):
3103 </p>
3107 </p>
3104 <table>
3108 <table>
3105 <tr><td>-A</td>
3109 <tr><td>-A</td>
3106 <td>--after</td>
3110 <td>--after</td>
3107 <td>record delete for missing files</td></tr>
3111 <td>record delete for missing files</td></tr>
3108 <tr><td>-f</td>
3112 <tr><td>-f</td>
3109 <td>--force</td>
3113 <td>--force</td>
3110 <td>forget added files, delete modified files</td></tr>
3114 <td>forget added files, delete modified files</td></tr>
3111 <tr><td>-S</td>
3115 <tr><td>-S</td>
3112 <td>--subrepos</td>
3116 <td>--subrepos</td>
3113 <td>recurse into subrepositories</td></tr>
3117 <td>recurse into subrepositories</td></tr>
3114 <tr><td>-I</td>
3118 <tr><td>-I</td>
3115 <td>--include PATTERN [+]</td>
3119 <td>--include PATTERN [+]</td>
3116 <td>include names matching the given patterns</td></tr>
3120 <td>include names matching the given patterns</td></tr>
3117 <tr><td>-X</td>
3121 <tr><td>-X</td>
3118 <td>--exclude PATTERN [+]</td>
3122 <td>--exclude PATTERN [+]</td>
3119 <td>exclude names matching the given patterns</td></tr>
3123 <td>exclude names matching the given patterns</td></tr>
3120 <tr><td>-n</td>
3124 <tr><td>-n</td>
3121 <td>--dry-run</td>
3125 <td>--dry-run</td>
3122 <td>do not perform actions, just print output</td></tr>
3126 <td>do not perform actions, just print output</td></tr>
3123 </table>
3127 </table>
3124 <p>
3128 <p>
3125 global options ([+] can be repeated):
3129 global options ([+] can be repeated):
3126 </p>
3130 </p>
3127 <table>
3131 <table>
3128 <tr><td>-R</td>
3132 <tr><td>-R</td>
3129 <td>--repository REPO</td>
3133 <td>--repository REPO</td>
3130 <td>repository root directory or name of overlay bundle file</td></tr>
3134 <td>repository root directory or name of overlay bundle file</td></tr>
3131 <tr><td></td>
3135 <tr><td></td>
3132 <td>--cwd DIR</td>
3136 <td>--cwd DIR</td>
3133 <td>change working directory</td></tr>
3137 <td>change working directory</td></tr>
3134 <tr><td>-y</td>
3138 <tr><td>-y</td>
3135 <td>--noninteractive</td>
3139 <td>--noninteractive</td>
3136 <td>do not prompt, automatically pick the first choice for all prompts</td></tr>
3140 <td>do not prompt, automatically pick the first choice for all prompts</td></tr>
3137 <tr><td>-q</td>
3141 <tr><td>-q</td>
3138 <td>--quiet</td>
3142 <td>--quiet</td>
3139 <td>suppress output</td></tr>
3143 <td>suppress output</td></tr>
3140 <tr><td>-v</td>
3144 <tr><td>-v</td>
3141 <td>--verbose</td>
3145 <td>--verbose</td>
3142 <td>enable additional output</td></tr>
3146 <td>enable additional output</td></tr>
3143 <tr><td></td>
3147 <tr><td></td>
3144 <td>--color TYPE</td>
3148 <td>--color TYPE</td>
3145 <td>when to colorize (boolean, always, auto, never, or debug)</td></tr>
3149 <td>when to colorize (boolean, always, auto, never, or debug)</td></tr>
3146 <tr><td></td>
3150 <tr><td></td>
3147 <td>--config CONFIG [+]</td>
3151 <td>--config CONFIG [+]</td>
3148 <td>set/override config option (use 'section.name=value')</td></tr>
3152 <td>set/override config option (use 'section.name=value')</td></tr>
3149 <tr><td></td>
3153 <tr><td></td>
3150 <td>--debug</td>
3154 <td>--debug</td>
3151 <td>enable debugging output</td></tr>
3155 <td>enable debugging output</td></tr>
3152 <tr><td></td>
3156 <tr><td></td>
3153 <td>--debugger</td>
3157 <td>--debugger</td>
3154 <td>start debugger</td></tr>
3158 <td>start debugger</td></tr>
3155 <tr><td></td>
3159 <tr><td></td>
3156 <td>--encoding ENCODE</td>
3160 <td>--encoding ENCODE</td>
3157 <td>set the charset encoding (default: ascii)</td></tr>
3161 <td>set the charset encoding (default: ascii)</td></tr>
3158 <tr><td></td>
3162 <tr><td></td>
3159 <td>--encodingmode MODE</td>
3163 <td>--encodingmode MODE</td>
3160 <td>set the charset encoding mode (default: strict)</td></tr>
3164 <td>set the charset encoding mode (default: strict)</td></tr>
3161 <tr><td></td>
3165 <tr><td></td>
3162 <td>--traceback</td>
3166 <td>--traceback</td>
3163 <td>always print a traceback on exception</td></tr>
3167 <td>always print a traceback on exception</td></tr>
3164 <tr><td></td>
3168 <tr><td></td>
3165 <td>--time</td>
3169 <td>--time</td>
3166 <td>time how long the command takes</td></tr>
3170 <td>time how long the command takes</td></tr>
3167 <tr><td></td>
3171 <tr><td></td>
3168 <td>--profile</td>
3172 <td>--profile</td>
3169 <td>print command execution profile</td></tr>
3173 <td>print command execution profile</td></tr>
3170 <tr><td></td>
3174 <tr><td></td>
3171 <td>--version</td>
3175 <td>--version</td>
3172 <td>output version information and exit</td></tr>
3176 <td>output version information and exit</td></tr>
3173 <tr><td>-h</td>
3177 <tr><td>-h</td>
3174 <td>--help</td>
3178 <td>--help</td>
3175 <td>display help and exit</td></tr>
3179 <td>display help and exit</td></tr>
3176 <tr><td></td>
3180 <tr><td></td>
3177 <td>--hidden</td>
3181 <td>--hidden</td>
3178 <td>consider hidden changesets</td></tr>
3182 <td>consider hidden changesets</td></tr>
3179 <tr><td></td>
3183 <tr><td></td>
3180 <td>--pager TYPE</td>
3184 <td>--pager TYPE</td>
3181 <td>when to paginate (boolean, always, auto, or never) (default: auto)</td></tr>
3185 <td>when to paginate (boolean, always, auto, or never) (default: auto)</td></tr>
3182 </table>
3186 </table>
3183
3187
3184 </div>
3188 </div>
3185 </div>
3189 </div>
3186 </div>
3190 </div>
3187
3191
3188
3192
3189
3193
3190 </body>
3194 </body>
3191 </html>
3195 </html>
3192
3196
3193
3197
3194 $ get-with-headers.py $LOCALIP:$HGPORT "help/dates"
3198 $ get-with-headers.py $LOCALIP:$HGPORT "help/dates"
3195 200 Script output follows
3199 200 Script output follows
3196
3200
3197 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3201 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3198 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
3202 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
3199 <head>
3203 <head>
3200 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3204 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3201 <meta name="robots" content="index, nofollow" />
3205 <meta name="robots" content="index, nofollow" />
3202 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3206 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3203 <script type="text/javascript" src="/static/mercurial.js"></script>
3207 <script type="text/javascript" src="/static/mercurial.js"></script>
3204
3208
3205 <title>Help: dates</title>
3209 <title>Help: dates</title>
3206 </head>
3210 </head>
3207 <body>
3211 <body>
3208
3212
3209 <div class="container">
3213 <div class="container">
3210 <div class="menu">
3214 <div class="menu">
3211 <div class="logo">
3215 <div class="logo">
3212 <a href="https://mercurial-scm.org/">
3216 <a href="https://mercurial-scm.org/">
3213 <img src="/static/hglogo.png" alt="mercurial" /></a>
3217 <img src="/static/hglogo.png" alt="mercurial" /></a>
3214 </div>
3218 </div>
3215 <ul>
3219 <ul>
3216 <li><a href="/shortlog">log</a></li>
3220 <li><a href="/shortlog">log</a></li>
3217 <li><a href="/graph">graph</a></li>
3221 <li><a href="/graph">graph</a></li>
3218 <li><a href="/tags">tags</a></li>
3222 <li><a href="/tags">tags</a></li>
3219 <li><a href="/bookmarks">bookmarks</a></li>
3223 <li><a href="/bookmarks">bookmarks</a></li>
3220 <li><a href="/branches">branches</a></li>
3224 <li><a href="/branches">branches</a></li>
3221 </ul>
3225 </ul>
3222 <ul>
3226 <ul>
3223 <li class="active"><a href="/help">help</a></li>
3227 <li class="active"><a href="/help">help</a></li>
3224 </ul>
3228 </ul>
3225 </div>
3229 </div>
3226
3230
3227 <div class="main">
3231 <div class="main">
3228 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3232 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3229 <h3>Help: dates</h3>
3233 <h3>Help: dates</h3>
3230
3234
3231 <form class="search" action="/log">
3235 <form class="search" action="/log">
3232
3236
3233 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3237 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3234 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3238 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3235 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3239 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3236 </form>
3240 </form>
3237 <div id="doc">
3241 <div id="doc">
3238 <h1>Date Formats</h1>
3242 <h1>Date Formats</h1>
3239 <p>
3243 <p>
3240 Some commands allow the user to specify a date, e.g.:
3244 Some commands allow the user to specify a date, e.g.:
3241 </p>
3245 </p>
3242 <ul>
3246 <ul>
3243 <li> backout, commit, import, tag: Specify the commit date.
3247 <li> backout, commit, import, tag: Specify the commit date.
3244 <li> log, revert, update: Select revision(s) by date.
3248 <li> log, revert, update: Select revision(s) by date.
3245 </ul>
3249 </ul>
3246 <p>
3250 <p>
3247 Many date formats are valid. Here are some examples:
3251 Many date formats are valid. Here are some examples:
3248 </p>
3252 </p>
3249 <ul>
3253 <ul>
3250 <li> &quot;Wed Dec 6 13:18:29 2006&quot; (local timezone assumed)
3254 <li> &quot;Wed Dec 6 13:18:29 2006&quot; (local timezone assumed)
3251 <li> &quot;Dec 6 13:18 -0600&quot; (year assumed, time offset provided)
3255 <li> &quot;Dec 6 13:18 -0600&quot; (year assumed, time offset provided)
3252 <li> &quot;Dec 6 13:18 UTC&quot; (UTC and GMT are aliases for +0000)
3256 <li> &quot;Dec 6 13:18 UTC&quot; (UTC and GMT are aliases for +0000)
3253 <li> &quot;Dec 6&quot; (midnight)
3257 <li> &quot;Dec 6&quot; (midnight)
3254 <li> &quot;13:18&quot; (today assumed)
3258 <li> &quot;13:18&quot; (today assumed)
3255 <li> &quot;3:39&quot; (3:39AM assumed)
3259 <li> &quot;3:39&quot; (3:39AM assumed)
3256 <li> &quot;3:39pm&quot; (15:39)
3260 <li> &quot;3:39pm&quot; (15:39)
3257 <li> &quot;2006-12-06 13:18:29&quot; (ISO 8601 format)
3261 <li> &quot;2006-12-06 13:18:29&quot; (ISO 8601 format)
3258 <li> &quot;2006-12-6 13:18&quot;
3262 <li> &quot;2006-12-6 13:18&quot;
3259 <li> &quot;2006-12-6&quot;
3263 <li> &quot;2006-12-6&quot;
3260 <li> &quot;12-6&quot;
3264 <li> &quot;12-6&quot;
3261 <li> &quot;12/6&quot;
3265 <li> &quot;12/6&quot;
3262 <li> &quot;12/6/6&quot; (Dec 6 2006)
3266 <li> &quot;12/6/6&quot; (Dec 6 2006)
3263 <li> &quot;today&quot; (midnight)
3267 <li> &quot;today&quot; (midnight)
3264 <li> &quot;yesterday&quot; (midnight)
3268 <li> &quot;yesterday&quot; (midnight)
3265 <li> &quot;now&quot; - right now
3269 <li> &quot;now&quot; - right now
3266 </ul>
3270 </ul>
3267 <p>
3271 <p>
3268 Lastly, there is Mercurial's internal format:
3272 Lastly, there is Mercurial's internal format:
3269 </p>
3273 </p>
3270 <ul>
3274 <ul>
3271 <li> &quot;1165411109 0&quot; (Wed Dec 6 13:18:29 2006 UTC)
3275 <li> &quot;1165411109 0&quot; (Wed Dec 6 13:18:29 2006 UTC)
3272 </ul>
3276 </ul>
3273 <p>
3277 <p>
3274 This is the internal representation format for dates. The first number
3278 This is the internal representation format for dates. The first number
3275 is the number of seconds since the epoch (1970-01-01 00:00 UTC). The
3279 is the number of seconds since the epoch (1970-01-01 00:00 UTC). The
3276 second is the offset of the local timezone, in seconds west of UTC
3280 second is the offset of the local timezone, in seconds west of UTC
3277 (negative if the timezone is east of UTC).
3281 (negative if the timezone is east of UTC).
3278 </p>
3282 </p>
3279 <p>
3283 <p>
3280 The log command also accepts date ranges:
3284 The log command also accepts date ranges:
3281 </p>
3285 </p>
3282 <ul>
3286 <ul>
3283 <li> &quot;&lt;DATE&quot; - at or before a given date/time
3287 <li> &quot;&lt;DATE&quot; - at or before a given date/time
3284 <li> &quot;&gt;DATE&quot; - on or after a given date/time
3288 <li> &quot;&gt;DATE&quot; - on or after a given date/time
3285 <li> &quot;DATE to DATE&quot; - a date range, inclusive
3289 <li> &quot;DATE to DATE&quot; - a date range, inclusive
3286 <li> &quot;-DAYS&quot; - within a given number of days from today
3290 <li> &quot;-DAYS&quot; - within a given number of days from today
3287 </ul>
3291 </ul>
3288
3292
3289 </div>
3293 </div>
3290 </div>
3294 </div>
3291 </div>
3295 </div>
3292
3296
3293
3297
3294
3298
3295 </body>
3299 </body>
3296 </html>
3300 </html>
3297
3301
3298
3302
3299 $ get-with-headers.py $LOCALIP:$HGPORT "help/pager"
3303 $ get-with-headers.py $LOCALIP:$HGPORT "help/pager"
3300 200 Script output follows
3304 200 Script output follows
3301
3305
3302 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3306 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3303 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
3307 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
3304 <head>
3308 <head>
3305 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3309 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3306 <meta name="robots" content="index, nofollow" />
3310 <meta name="robots" content="index, nofollow" />
3307 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3311 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3308 <script type="text/javascript" src="/static/mercurial.js"></script>
3312 <script type="text/javascript" src="/static/mercurial.js"></script>
3309
3313
3310 <title>Help: pager</title>
3314 <title>Help: pager</title>
3311 </head>
3315 </head>
3312 <body>
3316 <body>
3313
3317
3314 <div class="container">
3318 <div class="container">
3315 <div class="menu">
3319 <div class="menu">
3316 <div class="logo">
3320 <div class="logo">
3317 <a href="https://mercurial-scm.org/">
3321 <a href="https://mercurial-scm.org/">
3318 <img src="/static/hglogo.png" alt="mercurial" /></a>
3322 <img src="/static/hglogo.png" alt="mercurial" /></a>
3319 </div>
3323 </div>
3320 <ul>
3324 <ul>
3321 <li><a href="/shortlog">log</a></li>
3325 <li><a href="/shortlog">log</a></li>
3322 <li><a href="/graph">graph</a></li>
3326 <li><a href="/graph">graph</a></li>
3323 <li><a href="/tags">tags</a></li>
3327 <li><a href="/tags">tags</a></li>
3324 <li><a href="/bookmarks">bookmarks</a></li>
3328 <li><a href="/bookmarks">bookmarks</a></li>
3325 <li><a href="/branches">branches</a></li>
3329 <li><a href="/branches">branches</a></li>
3326 </ul>
3330 </ul>
3327 <ul>
3331 <ul>
3328 <li class="active"><a href="/help">help</a></li>
3332 <li class="active"><a href="/help">help</a></li>
3329 </ul>
3333 </ul>
3330 </div>
3334 </div>
3331
3335
3332 <div class="main">
3336 <div class="main">
3333 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3337 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3334 <h3>Help: pager</h3>
3338 <h3>Help: pager</h3>
3335
3339
3336 <form class="search" action="/log">
3340 <form class="search" action="/log">
3337
3341
3338 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3342 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3339 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3343 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3340 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3344 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3341 </form>
3345 </form>
3342 <div id="doc">
3346 <div id="doc">
3343 <h1>Pager Support</h1>
3347 <h1>Pager Support</h1>
3344 <p>
3348 <p>
3345 Some Mercurial commands can produce a lot of output, and Mercurial will
3349 Some Mercurial commands can produce a lot of output, and Mercurial will
3346 attempt to use a pager to make those commands more pleasant.
3350 attempt to use a pager to make those commands more pleasant.
3347 </p>
3351 </p>
3348 <p>
3352 <p>
3349 To set the pager that should be used, set the application variable:
3353 To set the pager that should be used, set the application variable:
3350 </p>
3354 </p>
3351 <pre>
3355 <pre>
3352 [pager]
3356 [pager]
3353 pager = less -FRX
3357 pager = less -FRX
3354 </pre>
3358 </pre>
3355 <p>
3359 <p>
3356 If no pager is set in the user or repository configuration, Mercurial uses the
3360 If no pager is set in the user or repository configuration, Mercurial uses the
3357 environment variable $PAGER. If $PAGER is not set, pager.pager from the default
3361 environment variable $PAGER. If $PAGER is not set, pager.pager from the default
3358 or system configuration is used. If none of these are set, a default pager will
3362 or system configuration is used. If none of these are set, a default pager will
3359 be used, typically 'less' on Unix and 'more' on Windows.
3363 be used, typically 'less' on Unix and 'more' on Windows.
3360 </p>
3364 </p>
3361 <p>
3365 <p>
3362 You can disable the pager for certain commands by adding them to the
3366 You can disable the pager for certain commands by adding them to the
3363 pager.ignore list:
3367 pager.ignore list:
3364 </p>
3368 </p>
3365 <pre>
3369 <pre>
3366 [pager]
3370 [pager]
3367 ignore = version, help, update
3371 ignore = version, help, update
3368 </pre>
3372 </pre>
3369 <p>
3373 <p>
3370 To ignore global commands like 'hg version' or 'hg help', you have
3374 To ignore global commands like 'hg version' or 'hg help', you have
3371 to specify them in your user configuration file.
3375 to specify them in your user configuration file.
3372 </p>
3376 </p>
3373 <p>
3377 <p>
3374 To control whether the pager is used at all for an individual command,
3378 To control whether the pager is used at all for an individual command,
3375 you can use --pager=&lt;value&gt;:
3379 you can use --pager=&lt;value&gt;:
3376 </p>
3380 </p>
3377 <ul>
3381 <ul>
3378 <li> use as needed: 'auto'.
3382 <li> use as needed: 'auto'.
3379 <li> require the pager: 'yes' or 'on'.
3383 <li> require the pager: 'yes' or 'on'.
3380 <li> suppress the pager: 'no' or 'off' (any unrecognized value will also work).
3384 <li> suppress the pager: 'no' or 'off' (any unrecognized value will also work).
3381 </ul>
3385 </ul>
3382 <p>
3386 <p>
3383 To globally turn off all attempts to use a pager, set:
3387 To globally turn off all attempts to use a pager, set:
3384 </p>
3388 </p>
3385 <pre>
3389 <pre>
3386 [ui]
3390 [ui]
3387 paginate = never
3391 paginate = never
3388 </pre>
3392 </pre>
3389 <p>
3393 <p>
3390 which will prevent the pager from running.
3394 which will prevent the pager from running.
3391 </p>
3395 </p>
3392
3396
3393 </div>
3397 </div>
3394 </div>
3398 </div>
3395 </div>
3399 </div>
3396
3400
3397
3401
3398
3402
3399 </body>
3403 </body>
3400 </html>
3404 </html>
3401
3405
3402
3406
3403 Sub-topic indexes rendered properly
3407 Sub-topic indexes rendered properly
3404
3408
3405 $ get-with-headers.py $LOCALIP:$HGPORT "help/internals"
3409 $ get-with-headers.py $LOCALIP:$HGPORT "help/internals"
3406 200 Script output follows
3410 200 Script output follows
3407
3411
3408 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3412 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3409 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
3413 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
3410 <head>
3414 <head>
3411 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3415 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3412 <meta name="robots" content="index, nofollow" />
3416 <meta name="robots" content="index, nofollow" />
3413 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3417 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3414 <script type="text/javascript" src="/static/mercurial.js"></script>
3418 <script type="text/javascript" src="/static/mercurial.js"></script>
3415
3419
3416 <title>Help: internals</title>
3420 <title>Help: internals</title>
3417 </head>
3421 </head>
3418 <body>
3422 <body>
3419
3423
3420 <div class="container">
3424 <div class="container">
3421 <div class="menu">
3425 <div class="menu">
3422 <div class="logo">
3426 <div class="logo">
3423 <a href="https://mercurial-scm.org/">
3427 <a href="https://mercurial-scm.org/">
3424 <img src="/static/hglogo.png" alt="mercurial" /></a>
3428 <img src="/static/hglogo.png" alt="mercurial" /></a>
3425 </div>
3429 </div>
3426 <ul>
3430 <ul>
3427 <li><a href="/shortlog">log</a></li>
3431 <li><a href="/shortlog">log</a></li>
3428 <li><a href="/graph">graph</a></li>
3432 <li><a href="/graph">graph</a></li>
3429 <li><a href="/tags">tags</a></li>
3433 <li><a href="/tags">tags</a></li>
3430 <li><a href="/bookmarks">bookmarks</a></li>
3434 <li><a href="/bookmarks">bookmarks</a></li>
3431 <li><a href="/branches">branches</a></li>
3435 <li><a href="/branches">branches</a></li>
3432 </ul>
3436 </ul>
3433 <ul>
3437 <ul>
3434 <li><a href="/help">help</a></li>
3438 <li><a href="/help">help</a></li>
3435 </ul>
3439 </ul>
3436 </div>
3440 </div>
3437
3441
3438 <div class="main">
3442 <div class="main">
3439 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3443 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3440
3444
3441 <form class="search" action="/log">
3445 <form class="search" action="/log">
3442
3446
3443 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3447 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3444 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3448 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3445 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3449 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3446 </form>
3450 </form>
3447 <table class="bigtable">
3451 <table class="bigtable">
3448 <tr><td colspan="2"><h2><a name="topics" href="#topics">Topics</a></h2></td></tr>
3452 <tr><td colspan="2"><h2><a name="topics" href="#topics">Topics</a></h2></td></tr>
3449
3453
3450 <tr><td>
3454 <tr><td>
3451 <a href="/help/internals.bid-merge">
3455 <a href="/help/internals.bid-merge">
3452 bid-merge
3456 bid-merge
3453 </a>
3457 </a>
3454 </td><td>
3458 </td><td>
3455 Bid Merge Algorithm
3459 Bid Merge Algorithm
3456 </td></tr>
3460 </td></tr>
3457 <tr><td>
3461 <tr><td>
3458 <a href="/help/internals.bundle2">
3462 <a href="/help/internals.bundle2">
3459 bundle2
3463 bundle2
3460 </a>
3464 </a>
3461 </td><td>
3465 </td><td>
3462 Bundle2
3466 Bundle2
3463 </td></tr>
3467 </td></tr>
3464 <tr><td>
3468 <tr><td>
3465 <a href="/help/internals.bundles">
3469 <a href="/help/internals.bundles">
3466 bundles
3470 bundles
3467 </a>
3471 </a>
3468 </td><td>
3472 </td><td>
3469 Bundles
3473 Bundles
3470 </td></tr>
3474 </td></tr>
3471 <tr><td>
3475 <tr><td>
3472 <a href="/help/internals.cbor">
3476 <a href="/help/internals.cbor">
3473 cbor
3477 cbor
3474 </a>
3478 </a>
3475 </td><td>
3479 </td><td>
3476 CBOR
3480 CBOR
3477 </td></tr>
3481 </td></tr>
3478 <tr><td>
3482 <tr><td>
3479 <a href="/help/internals.censor">
3483 <a href="/help/internals.censor">
3480 censor
3484 censor
3481 </a>
3485 </a>
3482 </td><td>
3486 </td><td>
3483 Censor
3487 Censor
3484 </td></tr>
3488 </td></tr>
3485 <tr><td>
3489 <tr><td>
3486 <a href="/help/internals.changegroups">
3490 <a href="/help/internals.changegroups">
3487 changegroups
3491 changegroups
3488 </a>
3492 </a>
3489 </td><td>
3493 </td><td>
3490 Changegroups
3494 Changegroups
3491 </td></tr>
3495 </td></tr>
3492 <tr><td>
3496 <tr><td>
3493 <a href="/help/internals.config">
3497 <a href="/help/internals.config">
3494 config
3498 config
3495 </a>
3499 </a>
3496 </td><td>
3500 </td><td>
3497 Config Registrar
3501 Config Registrar
3498 </td></tr>
3502 </td></tr>
3499 <tr><td>
3503 <tr><td>
3500 <a href="/help/internals.extensions">
3504 <a href="/help/internals.extensions">
3501 extensions
3505 extensions
3502 </a>
3506 </a>
3503 </td><td>
3507 </td><td>
3504 Extension API
3508 Extension API
3505 </td></tr>
3509 </td></tr>
3506 <tr><td>
3510 <tr><td>
3507 <a href="/help/internals.mergestate">
3511 <a href="/help/internals.mergestate">
3508 mergestate
3512 mergestate
3509 </a>
3513 </a>
3510 </td><td>
3514 </td><td>
3511 Mergestate
3515 Mergestate
3512 </td></tr>
3516 </td></tr>
3513 <tr><td>
3517 <tr><td>
3514 <a href="/help/internals.requirements">
3518 <a href="/help/internals.requirements">
3515 requirements
3519 requirements
3516 </a>
3520 </a>
3517 </td><td>
3521 </td><td>
3518 Repository Requirements
3522 Repository Requirements
3519 </td></tr>
3523 </td></tr>
3520 <tr><td>
3524 <tr><td>
3521 <a href="/help/internals.revlogs">
3525 <a href="/help/internals.revlogs">
3522 revlogs
3526 revlogs
3523 </a>
3527 </a>
3524 </td><td>
3528 </td><td>
3525 Revision Logs
3529 Revision Logs
3526 </td></tr>
3530 </td></tr>
3527 <tr><td>
3531 <tr><td>
3528 <a href="/help/internals.wireprotocol">
3532 <a href="/help/internals.wireprotocol">
3529 wireprotocol
3533 wireprotocol
3530 </a>
3534 </a>
3531 </td><td>
3535 </td><td>
3532 Wire Protocol
3536 Wire Protocol
3533 </td></tr>
3537 </td></tr>
3534 <tr><td>
3538 <tr><td>
3535 <a href="/help/internals.wireprotocolrpc">
3539 <a href="/help/internals.wireprotocolrpc">
3536 wireprotocolrpc
3540 wireprotocolrpc
3537 </a>
3541 </a>
3538 </td><td>
3542 </td><td>
3539 Wire Protocol RPC
3543 Wire Protocol RPC
3540 </td></tr>
3544 </td></tr>
3541 <tr><td>
3545 <tr><td>
3542 <a href="/help/internals.wireprotocolv2">
3546 <a href="/help/internals.wireprotocolv2">
3543 wireprotocolv2
3547 wireprotocolv2
3544 </a>
3548 </a>
3545 </td><td>
3549 </td><td>
3546 Wire Protocol Version 2
3550 Wire Protocol Version 2
3547 </td></tr>
3551 </td></tr>
3548
3552
3549
3553
3550
3554
3551
3555
3552
3556
3553 </table>
3557 </table>
3554 </div>
3558 </div>
3555 </div>
3559 </div>
3556
3560
3557
3561
3558
3562
3559 </body>
3563 </body>
3560 </html>
3564 </html>
3561
3565
3562
3566
3563 Sub-topic topics rendered properly
3567 Sub-topic topics rendered properly
3564
3568
3565 $ get-with-headers.py $LOCALIP:$HGPORT "help/internals.changegroups"
3569 $ get-with-headers.py $LOCALIP:$HGPORT "help/internals.changegroups"
3566 200 Script output follows
3570 200 Script output follows
3567
3571
3568 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3572 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3569 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
3573 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
3570 <head>
3574 <head>
3571 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3575 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3572 <meta name="robots" content="index, nofollow" />
3576 <meta name="robots" content="index, nofollow" />
3573 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3577 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3574 <script type="text/javascript" src="/static/mercurial.js"></script>
3578 <script type="text/javascript" src="/static/mercurial.js"></script>
3575
3579
3576 <title>Help: internals.changegroups</title>
3580 <title>Help: internals.changegroups</title>
3577 </head>
3581 </head>
3578 <body>
3582 <body>
3579
3583
3580 <div class="container">
3584 <div class="container">
3581 <div class="menu">
3585 <div class="menu">
3582 <div class="logo">
3586 <div class="logo">
3583 <a href="https://mercurial-scm.org/">
3587 <a href="https://mercurial-scm.org/">
3584 <img src="/static/hglogo.png" alt="mercurial" /></a>
3588 <img src="/static/hglogo.png" alt="mercurial" /></a>
3585 </div>
3589 </div>
3586 <ul>
3590 <ul>
3587 <li><a href="/shortlog">log</a></li>
3591 <li><a href="/shortlog">log</a></li>
3588 <li><a href="/graph">graph</a></li>
3592 <li><a href="/graph">graph</a></li>
3589 <li><a href="/tags">tags</a></li>
3593 <li><a href="/tags">tags</a></li>
3590 <li><a href="/bookmarks">bookmarks</a></li>
3594 <li><a href="/bookmarks">bookmarks</a></li>
3591 <li><a href="/branches">branches</a></li>
3595 <li><a href="/branches">branches</a></li>
3592 </ul>
3596 </ul>
3593 <ul>
3597 <ul>
3594 <li class="active"><a href="/help">help</a></li>
3598 <li class="active"><a href="/help">help</a></li>
3595 </ul>
3599 </ul>
3596 </div>
3600 </div>
3597
3601
3598 <div class="main">
3602 <div class="main">
3599 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3603 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3600 <h3>Help: internals.changegroups</h3>
3604 <h3>Help: internals.changegroups</h3>
3601
3605
3602 <form class="search" action="/log">
3606 <form class="search" action="/log">
3603
3607
3604 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3608 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3605 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3609 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3606 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3610 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3607 </form>
3611 </form>
3608 <div id="doc">
3612 <div id="doc">
3609 <h1>Changegroups</h1>
3613 <h1>Changegroups</h1>
3610 <p>
3614 <p>
3611 Changegroups are representations of repository revlog data, specifically
3615 Changegroups are representations of repository revlog data, specifically
3612 the changelog data, root/flat manifest data, treemanifest data, and
3616 the changelog data, root/flat manifest data, treemanifest data, and
3613 filelogs.
3617 filelogs.
3614 </p>
3618 </p>
3615 <p>
3619 <p>
3616 There are 3 versions of changegroups: &quot;1&quot;, &quot;2&quot;, and &quot;3&quot;. From a
3620 There are 3 versions of changegroups: &quot;1&quot;, &quot;2&quot;, and &quot;3&quot;. From a
3617 high-level, versions &quot;1&quot; and &quot;2&quot; are almost exactly the same, with the
3621 high-level, versions &quot;1&quot; and &quot;2&quot; are almost exactly the same, with the
3618 only difference being an additional item in the *delta header*. Version
3622 only difference being an additional item in the *delta header*. Version
3619 &quot;3&quot; adds support for storage flags in the *delta header* and optionally
3623 &quot;3&quot; adds support for storage flags in the *delta header* and optionally
3620 exchanging treemanifests (enabled by setting an option on the
3624 exchanging treemanifests (enabled by setting an option on the
3621 &quot;changegroup&quot; part in the bundle2).
3625 &quot;changegroup&quot; part in the bundle2).
3622 </p>
3626 </p>
3623 <p>
3627 <p>
3624 Changegroups when not exchanging treemanifests consist of 3 logical
3628 Changegroups when not exchanging treemanifests consist of 3 logical
3625 segments:
3629 segments:
3626 </p>
3630 </p>
3627 <pre>
3631 <pre>
3628 +---------------------------------+
3632 +---------------------------------+
3629 | | | |
3633 | | | |
3630 | changeset | manifest | filelogs |
3634 | changeset | manifest | filelogs |
3631 | | | |
3635 | | | |
3632 | | | |
3636 | | | |
3633 +---------------------------------+
3637 +---------------------------------+
3634 </pre>
3638 </pre>
3635 <p>
3639 <p>
3636 When exchanging treemanifests, there are 4 logical segments:
3640 When exchanging treemanifests, there are 4 logical segments:
3637 </p>
3641 </p>
3638 <pre>
3642 <pre>
3639 +-------------------------------------------------+
3643 +-------------------------------------------------+
3640 | | | | |
3644 | | | | |
3641 | changeset | root | treemanifests | filelogs |
3645 | changeset | root | treemanifests | filelogs |
3642 | | manifest | | |
3646 | | manifest | | |
3643 | | | | |
3647 | | | | |
3644 +-------------------------------------------------+
3648 +-------------------------------------------------+
3645 </pre>
3649 </pre>
3646 <p>
3650 <p>
3647 The principle building block of each segment is a *chunk*. A *chunk*
3651 The principle building block of each segment is a *chunk*. A *chunk*
3648 is a framed piece of data:
3652 is a framed piece of data:
3649 </p>
3653 </p>
3650 <pre>
3654 <pre>
3651 +---------------------------------------+
3655 +---------------------------------------+
3652 | | |
3656 | | |
3653 | length | data |
3657 | length | data |
3654 | (4 bytes) | (&lt;length - 4&gt; bytes) |
3658 | (4 bytes) | (&lt;length - 4&gt; bytes) |
3655 | | |
3659 | | |
3656 +---------------------------------------+
3660 +---------------------------------------+
3657 </pre>
3661 </pre>
3658 <p>
3662 <p>
3659 All integers are big-endian signed integers. Each chunk starts with a 32-bit
3663 All integers are big-endian signed integers. Each chunk starts with a 32-bit
3660 integer indicating the length of the entire chunk (including the length field
3664 integer indicating the length of the entire chunk (including the length field
3661 itself).
3665 itself).
3662 </p>
3666 </p>
3663 <p>
3667 <p>
3664 There is a special case chunk that has a value of 0 for the length
3668 There is a special case chunk that has a value of 0 for the length
3665 (&quot;0x00000000&quot;). We call this an *empty chunk*.
3669 (&quot;0x00000000&quot;). We call this an *empty chunk*.
3666 </p>
3670 </p>
3667 <h2>Delta Groups</h2>
3671 <h2>Delta Groups</h2>
3668 <p>
3672 <p>
3669 A *delta group* expresses the content of a revlog as a series of deltas,
3673 A *delta group* expresses the content of a revlog as a series of deltas,
3670 or patches against previous revisions.
3674 or patches against previous revisions.
3671 </p>
3675 </p>
3672 <p>
3676 <p>
3673 Delta groups consist of 0 or more *chunks* followed by the *empty chunk*
3677 Delta groups consist of 0 or more *chunks* followed by the *empty chunk*
3674 to signal the end of the delta group:
3678 to signal the end of the delta group:
3675 </p>
3679 </p>
3676 <pre>
3680 <pre>
3677 +------------------------------------------------------------------------+
3681 +------------------------------------------------------------------------+
3678 | | | | | |
3682 | | | | | |
3679 | chunk0 length | chunk0 data | chunk1 length | chunk1 data | 0x0 |
3683 | chunk0 length | chunk0 data | chunk1 length | chunk1 data | 0x0 |
3680 | (4 bytes) | (various) | (4 bytes) | (various) | (4 bytes) |
3684 | (4 bytes) | (various) | (4 bytes) | (various) | (4 bytes) |
3681 | | | | | |
3685 | | | | | |
3682 +------------------------------------------------------------------------+
3686 +------------------------------------------------------------------------+
3683 </pre>
3687 </pre>
3684 <p>
3688 <p>
3685 Each *chunk*'s data consists of the following:
3689 Each *chunk*'s data consists of the following:
3686 </p>
3690 </p>
3687 <pre>
3691 <pre>
3688 +---------------------------------------+
3692 +---------------------------------------+
3689 | | |
3693 | | |
3690 | delta header | delta data |
3694 | delta header | delta data |
3691 | (various by version) | (various) |
3695 | (various by version) | (various) |
3692 | | |
3696 | | |
3693 +---------------------------------------+
3697 +---------------------------------------+
3694 </pre>
3698 </pre>
3695 <p>
3699 <p>
3696 The *delta data* is a series of *delta*s that describe a diff from an existing
3700 The *delta data* is a series of *delta*s that describe a diff from an existing
3697 entry (either that the recipient already has, or previously specified in the
3701 entry (either that the recipient already has, or previously specified in the
3698 bundle/changegroup).
3702 bundle/changegroup).
3699 </p>
3703 </p>
3700 <p>
3704 <p>
3701 The *delta header* is different between versions &quot;1&quot;, &quot;2&quot;, and
3705 The *delta header* is different between versions &quot;1&quot;, &quot;2&quot;, and
3702 &quot;3&quot; of the changegroup format.
3706 &quot;3&quot; of the changegroup format.
3703 </p>
3707 </p>
3704 <p>
3708 <p>
3705 Version 1 (headerlen=80):
3709 Version 1 (headerlen=80):
3706 </p>
3710 </p>
3707 <pre>
3711 <pre>
3708 +------------------------------------------------------+
3712 +------------------------------------------------------+
3709 | | | | |
3713 | | | | |
3710 | node | p1 node | p2 node | link node |
3714 | node | p1 node | p2 node | link node |
3711 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) |
3715 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) |
3712 | | | | |
3716 | | | | |
3713 +------------------------------------------------------+
3717 +------------------------------------------------------+
3714 </pre>
3718 </pre>
3715 <p>
3719 <p>
3716 Version 2 (headerlen=100):
3720 Version 2 (headerlen=100):
3717 </p>
3721 </p>
3718 <pre>
3722 <pre>
3719 +------------------------------------------------------------------+
3723 +------------------------------------------------------------------+
3720 | | | | | |
3724 | | | | | |
3721 | node | p1 node | p2 node | base node | link node |
3725 | node | p1 node | p2 node | base node | link node |
3722 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) |
3726 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) |
3723 | | | | | |
3727 | | | | | |
3724 +------------------------------------------------------------------+
3728 +------------------------------------------------------------------+
3725 </pre>
3729 </pre>
3726 <p>
3730 <p>
3727 Version 3 (headerlen=102):
3731 Version 3 (headerlen=102):
3728 </p>
3732 </p>
3729 <pre>
3733 <pre>
3730 +------------------------------------------------------------------------------+
3734 +------------------------------------------------------------------------------+
3731 | | | | | | |
3735 | | | | | | |
3732 | node | p1 node | p2 node | base node | link node | flags |
3736 | node | p1 node | p2 node | base node | link node | flags |
3733 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (2 bytes) |
3737 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (2 bytes) |
3734 | | | | | | |
3738 | | | | | | |
3735 +------------------------------------------------------------------------------+
3739 +------------------------------------------------------------------------------+
3736 </pre>
3740 </pre>
3737 <p>
3741 <p>
3738 The *delta data* consists of &quot;chunklen - 4 - headerlen&quot; bytes, which contain a
3742 The *delta data* consists of &quot;chunklen - 4 - headerlen&quot; bytes, which contain a
3739 series of *delta*s, densely packed (no separators). These deltas describe a diff
3743 series of *delta*s, densely packed (no separators). These deltas describe a diff
3740 from an existing entry (either that the recipient already has, or previously
3744 from an existing entry (either that the recipient already has, or previously
3741 specified in the bundle/changegroup). The format is described more fully in
3745 specified in the bundle/changegroup). The format is described more fully in
3742 &quot;hg help internals.bdiff&quot;, but briefly:
3746 &quot;hg help internals.bdiff&quot;, but briefly:
3743 </p>
3747 </p>
3744 <pre>
3748 <pre>
3745 +---------------------------------------------------------------+
3749 +---------------------------------------------------------------+
3746 | | | | |
3750 | | | | |
3747 | start offset | end offset | new length | content |
3751 | start offset | end offset | new length | content |
3748 | (4 bytes) | (4 bytes) | (4 bytes) | (&lt;new length&gt; bytes) |
3752 | (4 bytes) | (4 bytes) | (4 bytes) | (&lt;new length&gt; bytes) |
3749 | | | | |
3753 | | | | |
3750 +---------------------------------------------------------------+
3754 +---------------------------------------------------------------+
3751 </pre>
3755 </pre>
3752 <p>
3756 <p>
3753 Please note that the length field in the delta data does *not* include itself.
3757 Please note that the length field in the delta data does *not* include itself.
3754 </p>
3758 </p>
3755 <p>
3759 <p>
3756 In version 1, the delta is always applied against the previous node from
3760 In version 1, the delta is always applied against the previous node from
3757 the changegroup or the first parent if this is the first entry in the
3761 the changegroup or the first parent if this is the first entry in the
3758 changegroup.
3762 changegroup.
3759 </p>
3763 </p>
3760 <p>
3764 <p>
3761 In version 2 and up, the delta base node is encoded in the entry in the
3765 In version 2 and up, the delta base node is encoded in the entry in the
3762 changegroup. This allows the delta to be expressed against any parent,
3766 changegroup. This allows the delta to be expressed against any parent,
3763 which can result in smaller deltas and more efficient encoding of data.
3767 which can result in smaller deltas and more efficient encoding of data.
3764 </p>
3768 </p>
3765 <p>
3769 <p>
3766 The *flags* field holds bitwise flags affecting the processing of revision
3770 The *flags* field holds bitwise flags affecting the processing of revision
3767 data. The following flags are defined:
3771 data. The following flags are defined:
3768 </p>
3772 </p>
3769 <dl>
3773 <dl>
3770 <dt>32768
3774 <dt>32768
3771 <dd>Censored revision. The revision's fulltext has been replaced by censor metadata. May only occur on file revisions.
3775 <dd>Censored revision. The revision's fulltext has been replaced by censor metadata. May only occur on file revisions.
3772 <dt>16384
3776 <dt>16384
3773 <dd>Ellipsis revision. Revision hash does not match data (likely due to rewritten parents).
3777 <dd>Ellipsis revision. Revision hash does not match data (likely due to rewritten parents).
3774 <dt>8192
3778 <dt>8192
3775 <dd>Externally stored. The revision fulltext contains &quot;key:value&quot; &quot;\n&quot; delimited metadata defining an object stored elsewhere. Used by the LFS extension.
3779 <dd>Externally stored. The revision fulltext contains &quot;key:value&quot; &quot;\n&quot; delimited metadata defining an object stored elsewhere. Used by the LFS extension.
3776 </dl>
3780 </dl>
3777 <p>
3781 <p>
3778 For historical reasons, the integer values are identical to revlog version 1
3782 For historical reasons, the integer values are identical to revlog version 1
3779 per-revision storage flags and correspond to bits being set in this 2-byte
3783 per-revision storage flags and correspond to bits being set in this 2-byte
3780 field. Bits were allocated starting from the most-significant bit, hence the
3784 field. Bits were allocated starting from the most-significant bit, hence the
3781 reverse ordering and allocation of these flags.
3785 reverse ordering and allocation of these flags.
3782 </p>
3786 </p>
3783 <h2>Changeset Segment</h2>
3787 <h2>Changeset Segment</h2>
3784 <p>
3788 <p>
3785 The *changeset segment* consists of a single *delta group* holding
3789 The *changeset segment* consists of a single *delta group* holding
3786 changelog data. The *empty chunk* at the end of the *delta group* denotes
3790 changelog data. The *empty chunk* at the end of the *delta group* denotes
3787 the boundary to the *manifest segment*.
3791 the boundary to the *manifest segment*.
3788 </p>
3792 </p>
3789 <h2>Manifest Segment</h2>
3793 <h2>Manifest Segment</h2>
3790 <p>
3794 <p>
3791 The *manifest segment* consists of a single *delta group* holding manifest
3795 The *manifest segment* consists of a single *delta group* holding manifest
3792 data. If treemanifests are in use, it contains only the manifest for the
3796 data. If treemanifests are in use, it contains only the manifest for the
3793 root directory of the repository. Otherwise, it contains the entire
3797 root directory of the repository. Otherwise, it contains the entire
3794 manifest data. The *empty chunk* at the end of the *delta group* denotes
3798 manifest data. The *empty chunk* at the end of the *delta group* denotes
3795 the boundary to the next segment (either the *treemanifests segment* or the
3799 the boundary to the next segment (either the *treemanifests segment* or the
3796 *filelogs segment*, depending on version and the request options).
3800 *filelogs segment*, depending on version and the request options).
3797 </p>
3801 </p>
3798 <h3>Treemanifests Segment</h3>
3802 <h3>Treemanifests Segment</h3>
3799 <p>
3803 <p>
3800 The *treemanifests segment* only exists in changegroup version &quot;3&quot;, and
3804 The *treemanifests segment* only exists in changegroup version &quot;3&quot;, and
3801 only if the 'treemanifest' param is part of the bundle2 changegroup part
3805 only if the 'treemanifest' param is part of the bundle2 changegroup part
3802 (it is not possible to use changegroup version 3 outside of bundle2).
3806 (it is not possible to use changegroup version 3 outside of bundle2).
3803 Aside from the filenames in the *treemanifests segment* containing a
3807 Aside from the filenames in the *treemanifests segment* containing a
3804 trailing &quot;/&quot; character, it behaves identically to the *filelogs segment*
3808 trailing &quot;/&quot; character, it behaves identically to the *filelogs segment*
3805 (see below). The final sub-segment is followed by an *empty chunk* (logically,
3809 (see below). The final sub-segment is followed by an *empty chunk* (logically,
3806 a sub-segment with filename size 0). This denotes the boundary to the
3810 a sub-segment with filename size 0). This denotes the boundary to the
3807 *filelogs segment*.
3811 *filelogs segment*.
3808 </p>
3812 </p>
3809 <h2>Filelogs Segment</h2>
3813 <h2>Filelogs Segment</h2>
3810 <p>
3814 <p>
3811 The *filelogs segment* consists of multiple sub-segments, each
3815 The *filelogs segment* consists of multiple sub-segments, each
3812 corresponding to an individual file whose data is being described:
3816 corresponding to an individual file whose data is being described:
3813 </p>
3817 </p>
3814 <pre>
3818 <pre>
3815 +--------------------------------------------------+
3819 +--------------------------------------------------+
3816 | | | | | |
3820 | | | | | |
3817 | filelog0 | filelog1 | filelog2 | ... | 0x0 |
3821 | filelog0 | filelog1 | filelog2 | ... | 0x0 |
3818 | | | | | (4 bytes) |
3822 | | | | | (4 bytes) |
3819 | | | | | |
3823 | | | | | |
3820 +--------------------------------------------------+
3824 +--------------------------------------------------+
3821 </pre>
3825 </pre>
3822 <p>
3826 <p>
3823 The final filelog sub-segment is followed by an *empty chunk* (logically,
3827 The final filelog sub-segment is followed by an *empty chunk* (logically,
3824 a sub-segment with filename size 0). This denotes the end of the segment
3828 a sub-segment with filename size 0). This denotes the end of the segment
3825 and of the overall changegroup.
3829 and of the overall changegroup.
3826 </p>
3830 </p>
3827 <p>
3831 <p>
3828 Each filelog sub-segment consists of the following:
3832 Each filelog sub-segment consists of the following:
3829 </p>
3833 </p>
3830 <pre>
3834 <pre>
3831 +------------------------------------------------------+
3835 +------------------------------------------------------+
3832 | | | |
3836 | | | |
3833 | filename length | filename | delta group |
3837 | filename length | filename | delta group |
3834 | (4 bytes) | (&lt;length - 4&gt; bytes) | (various) |
3838 | (4 bytes) | (&lt;length - 4&gt; bytes) | (various) |
3835 | | | |
3839 | | | |
3836 +------------------------------------------------------+
3840 +------------------------------------------------------+
3837 </pre>
3841 </pre>
3838 <p>
3842 <p>
3839 That is, a *chunk* consisting of the filename (not terminated or padded)
3843 That is, a *chunk* consisting of the filename (not terminated or padded)
3840 followed by N chunks constituting the *delta group* for this file. The
3844 followed by N chunks constituting the *delta group* for this file. The
3841 *empty chunk* at the end of each *delta group* denotes the boundary to the
3845 *empty chunk* at the end of each *delta group* denotes the boundary to the
3842 next filelog sub-segment.
3846 next filelog sub-segment.
3843 </p>
3847 </p>
3844
3848
3845 </div>
3849 </div>
3846 </div>
3850 </div>
3847 </div>
3851 </div>
3848
3852
3849
3853
3850
3854
3851 </body>
3855 </body>
3852 </html>
3856 </html>
3853
3857
3854
3858
3855 $ get-with-headers.py 127.0.0.1:$HGPORT "help/unknowntopic"
3859 $ get-with-headers.py 127.0.0.1:$HGPORT "help/unknowntopic"
3856 404 Not Found
3860 404 Not Found
3857
3861
3858 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3862 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3859 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
3863 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
3860 <head>
3864 <head>
3861 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3865 <link rel="icon" href="/static/hgicon.png" type="image/png" />
3862 <meta name="robots" content="index, nofollow" />
3866 <meta name="robots" content="index, nofollow" />
3863 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3867 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
3864 <script type="text/javascript" src="/static/mercurial.js"></script>
3868 <script type="text/javascript" src="/static/mercurial.js"></script>
3865
3869
3866 <title>test: error</title>
3870 <title>test: error</title>
3867 </head>
3871 </head>
3868 <body>
3872 <body>
3869
3873
3870 <div class="container">
3874 <div class="container">
3871 <div class="menu">
3875 <div class="menu">
3872 <div class="logo">
3876 <div class="logo">
3873 <a href="https://mercurial-scm.org/">
3877 <a href="https://mercurial-scm.org/">
3874 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
3878 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
3875 </div>
3879 </div>
3876 <ul>
3880 <ul>
3877 <li><a href="/shortlog">log</a></li>
3881 <li><a href="/shortlog">log</a></li>
3878 <li><a href="/graph">graph</a></li>
3882 <li><a href="/graph">graph</a></li>
3879 <li><a href="/tags">tags</a></li>
3883 <li><a href="/tags">tags</a></li>
3880 <li><a href="/bookmarks">bookmarks</a></li>
3884 <li><a href="/bookmarks">bookmarks</a></li>
3881 <li><a href="/branches">branches</a></li>
3885 <li><a href="/branches">branches</a></li>
3882 </ul>
3886 </ul>
3883 <ul>
3887 <ul>
3884 <li><a href="/help">help</a></li>
3888 <li><a href="/help">help</a></li>
3885 </ul>
3889 </ul>
3886 </div>
3890 </div>
3887
3891
3888 <div class="main">
3892 <div class="main">
3889
3893
3890 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3894 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
3891 <h3>error</h3>
3895 <h3>error</h3>
3892
3896
3893
3897
3894 <form class="search" action="/log">
3898 <form class="search" action="/log">
3895
3899
3896 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3900 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
3897 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3901 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
3898 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3902 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
3899 </form>
3903 </form>
3900
3904
3901 <div class="description">
3905 <div class="description">
3902 <p>
3906 <p>
3903 An error occurred while processing your request:
3907 An error occurred while processing your request:
3904 </p>
3908 </p>
3905 <p>
3909 <p>
3906 Not Found
3910 Not Found
3907 </p>
3911 </p>
3908 </div>
3912 </div>
3909 </div>
3913 </div>
3910 </div>
3914 </div>
3911
3915
3912
3916
3913
3917
3914 </body>
3918 </body>
3915 </html>
3919 </html>
3916
3920
3917 [1]
3921 [1]
3918
3922
3919 $ killdaemons.py
3923 $ killdaemons.py
3920
3924
3921 #endif
3925 #endif
General Comments 0
You need to be logged in to leave comments. Login now