comparison mercurial/commands.py @ 43077:687b865b95ad

formatting: byteify all mercurial/ and hgext/ string literals Done with python3.7 contrib/byteify-strings.py -i $(hg files 'set:mercurial/**.py - mercurial/thirdparty/** + hgext/**.py - hgext/fsmonitor/pywatchman/** - mercurial/__init__.py') black -l 80 -t py33 -S $(hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**" - hgext/fsmonitor/pywatchman/**') # skip-blame mass-reformatting only Differential Revision: https://phab.mercurial-scm.org/D6972
author Augie Fackler <augie@google.com>
date Sun, 06 Oct 2019 09:48:39 -0400
parents 2372284d9457
children eef9a2d67051
comparison
equal deleted inserted replaced
43076:2372284d9457 43077:687b865b95ad
79 79
80 # common command options 80 # common command options
81 81
82 globalopts = [ 82 globalopts = [
83 ( 83 (
84 'R', 84 b'R',
85 'repository', 85 b'repository',
86 '', 86 b'',
87 _('repository root directory or name of overlay bundle file'), 87 _(b'repository root directory or name of overlay bundle file'),
88 _('REPO'), 88 _(b'REPO'),
89 ), 89 ),
90 ('', 'cwd', '', _('change working directory'), _('DIR')), 90 (b'', b'cwd', b'', _(b'change working directory'), _(b'DIR')),
91 ( 91 (
92 'y', 92 b'y',
93 'noninteractive', 93 b'noninteractive',
94 None, 94 None,
95 _('do not prompt, automatically pick the first choice for all prompts'), 95 _(
96 b'do not prompt, automatically pick the first choice for all prompts'
97 ),
96 ), 98 ),
97 ('q', 'quiet', None, _('suppress output')), 99 (b'q', b'quiet', None, _(b'suppress output')),
98 ('v', 'verbose', None, _('enable additional output')), 100 (b'v', b'verbose', None, _(b'enable additional output')),
99 ( 101 (
100 '', 102 b'',
101 'color', 103 b'color',
102 '', 104 b'',
103 # i18n: 'always', 'auto', 'never', and 'debug' are keywords 105 # i18n: 'always', 'auto', 'never', and 'debug' are keywords
104 # and should not be translated 106 # and should not be translated
105 _("when to colorize (boolean, always, auto, never, or debug)"), 107 _(b"when to colorize (boolean, always, auto, never, or debug)"),
106 _('TYPE'), 108 _(b'TYPE'),
107 ), 109 ),
108 ( 110 (
109 '', 111 b'',
110 'config', 112 b'config',
111 [], 113 [],
112 _('set/override config option (use \'section.name=value\')'), 114 _(b'set/override config option (use \'section.name=value\')'),
113 _('CONFIG'), 115 _(b'CONFIG'),
114 ), 116 ),
115 ('', 'debug', None, _('enable debugging output')), 117 (b'', b'debug', None, _(b'enable debugging output')),
116 ('', 'debugger', None, _('start debugger')), 118 (b'', b'debugger', None, _(b'start debugger')),
117 ( 119 (
118 '', 120 b'',
119 'encoding', 121 b'encoding',
120 encoding.encoding, 122 encoding.encoding,
121 _('set the charset encoding'), 123 _(b'set the charset encoding'),
122 _('ENCODE'), 124 _(b'ENCODE'),
123 ), 125 ),
124 ( 126 (
125 '', 127 b'',
126 'encodingmode', 128 b'encodingmode',
127 encoding.encodingmode, 129 encoding.encodingmode,
128 _('set the charset encoding mode'), 130 _(b'set the charset encoding mode'),
129 _('MODE'), 131 _(b'MODE'),
130 ), 132 ),
131 ('', 'traceback', None, _('always print a traceback on exception')), 133 (b'', b'traceback', None, _(b'always print a traceback on exception')),
132 ('', 'time', None, _('time how long the command takes')), 134 (b'', b'time', None, _(b'time how long the command takes')),
133 ('', 'profile', None, _('print command execution profile')), 135 (b'', b'profile', None, _(b'print command execution profile')),
134 ('', 'version', None, _('output version information and exit')), 136 (b'', b'version', None, _(b'output version information and exit')),
135 ('h', 'help', None, _('display help and exit')), 137 (b'h', b'help', None, _(b'display help and exit')),
136 ('', 'hidden', False, _('consider hidden changesets')), 138 (b'', b'hidden', False, _(b'consider hidden changesets')),
137 ( 139 (
138 '', 140 b'',
139 'pager', 141 b'pager',
140 'auto', 142 b'auto',
141 _("when to paginate (boolean, always, auto, or never)"), 143 _(b"when to paginate (boolean, always, auto, or never)"),
142 _('TYPE'), 144 _(b'TYPE'),
143 ), 145 ),
144 ] 146 ]
145 147
146 dryrunopts = cmdutil.dryrunopts 148 dryrunopts = cmdutil.dryrunopts
147 remoteopts = cmdutil.remoteopts 149 remoteopts = cmdutil.remoteopts
162 164
163 # Commands start here, listed alphabetically 165 # Commands start here, listed alphabetically
164 166
165 167
166 @command( 168 @command(
167 'abort', 169 b'abort',
168 dryrunopts, 170 dryrunopts,
169 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT, 171 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
170 helpbasic=True, 172 helpbasic=True,
171 ) 173 )
172 def abort(ui, repo, **opts): 174 def abort(ui, repo, **opts):
178 use --dry-run/-n to dry run the command. 180 use --dry-run/-n to dry run the command.
179 """ 181 """
180 dryrun = opts.get(r'dry_run') 182 dryrun = opts.get(r'dry_run')
181 abortstate = cmdutil.getunfinishedstate(repo) 183 abortstate = cmdutil.getunfinishedstate(repo)
182 if not abortstate: 184 if not abortstate:
183 raise error.Abort(_('no operation in progress')) 185 raise error.Abort(_(b'no operation in progress'))
184 if not abortstate.abortfunc: 186 if not abortstate.abortfunc:
185 raise error.Abort( 187 raise error.Abort(
186 ( 188 (
187 _("%s in progress but does not support 'hg abort'") 189 _(b"%s in progress but does not support 'hg abort'")
188 % (abortstate._opname) 190 % (abortstate._opname)
189 ), 191 ),
190 hint=abortstate.hint(), 192 hint=abortstate.hint(),
191 ) 193 )
192 if dryrun: 194 if dryrun:
193 ui.status(_('%s in progress, will be aborted\n') % (abortstate._opname)) 195 ui.status(
196 _(b'%s in progress, will be aborted\n') % (abortstate._opname)
197 )
194 return 198 return
195 return abortstate.abortfunc(ui, repo) 199 return abortstate.abortfunc(ui, repo)
196 200
197 201
198 @command( 202 @command(
199 'add', 203 b'add',
200 walkopts + subrepoopts + dryrunopts, 204 walkopts + subrepoopts + dryrunopts,
201 _('[OPTION]... [FILE]...'), 205 _(b'[OPTION]... [FILE]...'),
202 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 206 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
203 helpbasic=True, 207 helpbasic=True,
204 inferrepo=True, 208 inferrepo=True,
205 ) 209 )
206 def add(ui, repo, *pats, **opts): 210 def add(ui, repo, *pats, **opts):
246 Returns 0 if all files are successfully added. 250 Returns 0 if all files are successfully added.
247 """ 251 """
248 252
249 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts)) 253 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
250 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True) 254 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
251 rejected = cmdutil.add(ui, repo, m, "", uipathfn, False, **opts) 255 rejected = cmdutil.add(ui, repo, m, b"", uipathfn, False, **opts)
252 return rejected and 1 or 0 256 return rejected and 1 or 0
253 257
254 258
255 @command( 259 @command(
256 'addremove', 260 b'addremove',
257 similarityopts + subrepoopts + walkopts + dryrunopts, 261 similarityopts + subrepoopts + walkopts + dryrunopts,
258 _('[OPTION]... [FILE]...'), 262 _(b'[OPTION]... [FILE]...'),
259 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 263 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
260 inferrepo=True, 264 inferrepo=True,
261 ) 265 )
262 def addremove(ui, repo, *pats, **opts): 266 def addremove(ui, repo, *pats, **opts):
263 """add all new files, delete all missing files 267 """add all new files, delete all missing files
320 R foobar.c 324 R foobar.c
321 325
322 Returns 0 if all files are successfully added. 326 Returns 0 if all files are successfully added.
323 """ 327 """
324 opts = pycompat.byteskwargs(opts) 328 opts = pycompat.byteskwargs(opts)
325 if not opts.get('similarity'): 329 if not opts.get(b'similarity'):
326 opts['similarity'] = '100' 330 opts[b'similarity'] = b'100'
327 matcher = scmutil.match(repo[None], pats, opts) 331 matcher = scmutil.match(repo[None], pats, opts)
328 relative = scmutil.anypats(pats, opts) 332 relative = scmutil.anypats(pats, opts)
329 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative) 333 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative)
330 return scmutil.addremove(repo, matcher, "", uipathfn, opts) 334 return scmutil.addremove(repo, matcher, b"", uipathfn, opts)
331 335
332 336
333 @command( 337 @command(
334 'annotate|blame', 338 b'annotate|blame',
335 [ 339 [
336 ('r', 'rev', '', _('annotate the specified revision'), _('REV')), 340 (b'r', b'rev', b'', _(b'annotate the specified revision'), _(b'REV')),
337 ( 341 (
338 '', 342 b'',
339 'follow', 343 b'follow',
340 None, 344 None,
341 _('follow copies/renames and list the filename (DEPRECATED)'), 345 _(b'follow copies/renames and list the filename (DEPRECATED)'),
342 ), 346 ),
343 ('', 'no-follow', None, _("don't follow copies and renames")), 347 (b'', b'no-follow', None, _(b"don't follow copies and renames")),
344 ('a', 'text', None, _('treat all files as text')), 348 (b'a', b'text', None, _(b'treat all files as text')),
345 ('u', 'user', None, _('list the author (long with -v)')), 349 (b'u', b'user', None, _(b'list the author (long with -v)')),
346 ('f', 'file', None, _('list the filename')), 350 (b'f', b'file', None, _(b'list the filename')),
347 ('d', 'date', None, _('list the date (short with -q)')), 351 (b'd', b'date', None, _(b'list the date (short with -q)')),
348 ('n', 'number', None, _('list the revision number (default)')), 352 (b'n', b'number', None, _(b'list the revision number (default)')),
349 ('c', 'changeset', None, _('list the changeset')), 353 (b'c', b'changeset', None, _(b'list the changeset')),
350 ( 354 (
351 'l', 355 b'l',
352 'line-number', 356 b'line-number',
353 None, 357 None,
354 _('show line number at the first appearance'), 358 _(b'show line number at the first appearance'),
355 ), 359 ),
356 ('', 'skip', [], _('revision to not display (EXPERIMENTAL)'), _('REV')), 360 (
361 b'',
362 b'skip',
363 [],
364 _(b'revision to not display (EXPERIMENTAL)'),
365 _(b'REV'),
366 ),
357 ] 367 ]
358 + diffwsopts 368 + diffwsopts
359 + walkopts 369 + walkopts
360 + formatteropts, 370 + formatteropts,
361 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'), 371 _(b'[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
362 helpcategory=command.CATEGORY_FILE_CONTENTS, 372 helpcategory=command.CATEGORY_FILE_CONTENTS,
363 helpbasic=True, 373 helpbasic=True,
364 inferrepo=True, 374 inferrepo=True,
365 ) 375 )
366 def annotate(ui, repo, *pats, **opts): 376 def annotate(ui, repo, *pats, **opts):
401 411
402 Returns 0 on success. 412 Returns 0 on success.
403 """ 413 """
404 opts = pycompat.byteskwargs(opts) 414 opts = pycompat.byteskwargs(opts)
405 if not pats: 415 if not pats:
406 raise error.Abort(_('at least one filename or pattern is required')) 416 raise error.Abort(_(b'at least one filename or pattern is required'))
407 417
408 if opts.get('follow'): 418 if opts.get(b'follow'):
409 # --follow is deprecated and now just an alias for -f/--file 419 # --follow is deprecated and now just an alias for -f/--file
410 # to mimic the behavior of Mercurial before version 1.5 420 # to mimic the behavior of Mercurial before version 1.5
411 opts['file'] = True 421 opts[b'file'] = True
412 422
413 if ( 423 if (
414 not opts.get('user') 424 not opts.get(b'user')
415 and not opts.get('changeset') 425 and not opts.get(b'changeset')
416 and not opts.get('date') 426 and not opts.get(b'date')
417 and not opts.get('file') 427 and not opts.get(b'file')
418 ): 428 ):
419 opts['number'] = True 429 opts[b'number'] = True
420 430
421 linenumber = opts.get('line_number') is not None 431 linenumber = opts.get(b'line_number') is not None
422 if linenumber and (not opts.get('changeset')) and (not opts.get('number')): 432 if (
423 raise error.Abort(_('at least one of -n/-c is required for -l')) 433 linenumber
424 434 and (not opts.get(b'changeset'))
425 rev = opts.get('rev') 435 and (not opts.get(b'number'))
436 ):
437 raise error.Abort(_(b'at least one of -n/-c is required for -l'))
438
439 rev = opts.get(b'rev')
426 if rev: 440 if rev:
427 repo = scmutil.unhidehashlikerevs(repo, [rev], 'nowarn') 441 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
428 ctx = scmutil.revsingle(repo, rev) 442 ctx = scmutil.revsingle(repo, rev)
429 443
430 ui.pager('annotate') 444 ui.pager(b'annotate')
431 rootfm = ui.formatter('annotate', opts) 445 rootfm = ui.formatter(b'annotate', opts)
432 if ui.debugflag: 446 if ui.debugflag:
433 shorthex = pycompat.identity 447 shorthex = pycompat.identity
434 else: 448 else:
435 449
436 def shorthex(h): 450 def shorthex(h):
439 if ui.quiet: 453 if ui.quiet:
440 datefunc = dateutil.shortdate 454 datefunc = dateutil.shortdate
441 else: 455 else:
442 datefunc = dateutil.datestr 456 datefunc = dateutil.datestr
443 if ctx.rev() is None: 457 if ctx.rev() is None:
444 if opts.get('changeset'): 458 if opts.get(b'changeset'):
445 # omit "+" suffix which is appended to node hex 459 # omit "+" suffix which is appended to node hex
446 def formatrev(rev): 460 def formatrev(rev):
447 if rev == wdirrev: 461 if rev == wdirrev:
448 return '%d' % ctx.p1().rev() 462 return b'%d' % ctx.p1().rev()
449 else: 463 else:
450 return '%d' % rev 464 return b'%d' % rev
451 465
452 else: 466 else:
453 467
454 def formatrev(rev): 468 def formatrev(rev):
455 if rev == wdirrev: 469 if rev == wdirrev:
456 return '%d+' % ctx.p1().rev() 470 return b'%d+' % ctx.p1().rev()
457 else: 471 else:
458 return '%d ' % rev 472 return b'%d ' % rev
459 473
460 def formathex(h): 474 def formathex(h):
461 if h == wdirhex: 475 if h == wdirhex:
462 return '%s+' % shorthex(hex(ctx.p1().node())) 476 return b'%s+' % shorthex(hex(ctx.p1().node()))
463 else: 477 else:
464 return '%s ' % shorthex(h) 478 return b'%s ' % shorthex(h)
465 479
466 else: 480 else:
467 formatrev = b'%d'.__mod__ 481 formatrev = b'%d'.__mod__
468 formathex = shorthex 482 formathex = shorthex
469 483
470 opmap = [ 484 opmap = [
471 ('user', ' ', lambda x: x.fctx.user(), ui.shortuser), 485 (b'user', b' ', lambda x: x.fctx.user(), ui.shortuser),
472 ('rev', ' ', lambda x: scmutil.intrev(x.fctx), formatrev), 486 (b'rev', b' ', lambda x: scmutil.intrev(x.fctx), formatrev),
473 ('node', ' ', lambda x: hex(scmutil.binnode(x.fctx)), formathex), 487 (b'node', b' ', lambda x: hex(scmutil.binnode(x.fctx)), formathex),
474 ('date', ' ', lambda x: x.fctx.date(), util.cachefunc(datefunc)), 488 (b'date', b' ', lambda x: x.fctx.date(), util.cachefunc(datefunc)),
475 ('path', ' ', lambda x: x.fctx.path(), pycompat.bytestr), 489 (b'path', b' ', lambda x: x.fctx.path(), pycompat.bytestr),
476 ('lineno', ':', lambda x: x.lineno, pycompat.bytestr), 490 (b'lineno', b':', lambda x: x.lineno, pycompat.bytestr),
477 ] 491 ]
478 opnamemap = { 492 opnamemap = {
479 'rev': 'number', 493 b'rev': b'number',
480 'node': 'changeset', 494 b'node': b'changeset',
481 'path': 'file', 495 b'path': b'file',
482 'lineno': 'line_number', 496 b'lineno': b'line_number',
483 } 497 }
484 498
485 if rootfm.isplain(): 499 if rootfm.isplain():
486 500
487 def makefunc(get, fmt): 501 def makefunc(get, fmt):
496 funcmap = [ 510 funcmap = [
497 (makefunc(get, fmt), sep) 511 (makefunc(get, fmt), sep)
498 for fn, sep, get, fmt in opmap 512 for fn, sep, get, fmt in opmap
499 if opts.get(opnamemap.get(fn, fn)) or fn in datahint 513 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
500 ] 514 ]
501 funcmap[0] = (funcmap[0][0], '') # no separator in front of first column 515 funcmap[0] = (funcmap[0][0], b'') # no separator in front of first column
502 fields = ' '.join( 516 fields = b' '.join(
503 fn 517 fn
504 for fn, sep, get, fmt in opmap 518 for fn, sep, get, fmt in opmap
505 if opts.get(opnamemap.get(fn, fn)) or fn in datahint 519 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
506 ) 520 )
507 521
508 def bad(x, y): 522 def bad(x, y):
509 raise error.Abort("%s: %s" % (x, y)) 523 raise error.Abort(b"%s: %s" % (x, y))
510 524
511 m = scmutil.match(ctx, pats, opts, badfn=bad) 525 m = scmutil.match(ctx, pats, opts, badfn=bad)
512 526
513 follow = not opts.get('no_follow') 527 follow = not opts.get(b'no_follow')
514 diffopts = patch.difffeatureopts( 528 diffopts = patch.difffeatureopts(
515 ui, opts, section='annotate', whitespace=True 529 ui, opts, section=b'annotate', whitespace=True
516 ) 530 )
517 skiprevs = opts.get('skip') 531 skiprevs = opts.get(b'skip')
518 if skiprevs: 532 if skiprevs:
519 skiprevs = scmutil.revrange(repo, skiprevs) 533 skiprevs = scmutil.revrange(repo, skiprevs)
520 534
521 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True) 535 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
522 for abs in ctx.walk(m): 536 for abs in ctx.walk(m):
523 fctx = ctx[abs] 537 fctx = ctx[abs]
524 rootfm.startitem() 538 rootfm.startitem()
525 rootfm.data(path=abs) 539 rootfm.data(path=abs)
526 if not opts.get('text') and fctx.isbinary(): 540 if not opts.get(b'text') and fctx.isbinary():
527 rootfm.plain(_("%s: binary file\n") % uipathfn(abs)) 541 rootfm.plain(_(b"%s: binary file\n") % uipathfn(abs))
528 continue 542 continue
529 543
530 fm = rootfm.nested('lines', tmpl='{rev}: {line}') 544 fm = rootfm.nested(b'lines', tmpl=b'{rev}: {line}')
531 lines = fctx.annotate( 545 lines = fctx.annotate(
532 follow=follow, skiprevs=skiprevs, diffopts=diffopts 546 follow=follow, skiprevs=skiprevs, diffopts=diffopts
533 ) 547 )
534 if not lines: 548 if not lines:
535 fm.end() 549 fm.end()
540 for f, sep in funcmap: 554 for f, sep in funcmap:
541 l = [f(n) for n in lines] 555 l = [f(n) for n in lines]
542 if fm.isplain(): 556 if fm.isplain():
543 sizes = [encoding.colwidth(x) for x in l] 557 sizes = [encoding.colwidth(x) for x in l]
544 ml = max(sizes) 558 ml = max(sizes)
545 formats.append([sep + ' ' * (ml - w) + '%s' for w in sizes]) 559 formats.append([sep + b' ' * (ml - w) + b'%s' for w in sizes])
546 else: 560 else:
547 formats.append(['%s' for x in l]) 561 formats.append([b'%s' for x in l])
548 pieces.append(l) 562 pieces.append(l)
549 563
550 for f, p, n in zip(zip(*formats), zip(*pieces), lines): 564 for f, p, n in zip(zip(*formats), zip(*pieces), lines):
551 fm.startitem() 565 fm.startitem()
552 fm.context(fctx=n.fctx) 566 fm.context(fctx=n.fctx)
553 fm.write(fields, "".join(f), *p) 567 fm.write(fields, b"".join(f), *p)
554 if n.skip: 568 if n.skip:
555 fmt = "* %s" 569 fmt = b"* %s"
556 else: 570 else:
557 fmt = ": %s" 571 fmt = b": %s"
558 fm.write('line', fmt, n.text) 572 fm.write(b'line', fmt, n.text)
559 573
560 if not lines[-1].text.endswith('\n'): 574 if not lines[-1].text.endswith(b'\n'):
561 fm.plain('\n') 575 fm.plain(b'\n')
562 fm.end() 576 fm.end()
563 577
564 rootfm.end() 578 rootfm.end()
565 579
566 580
567 @command( 581 @command(
568 'archive', 582 b'archive',
569 [ 583 [
570 ('', 'no-decode', None, _('do not pass files through decoders')), 584 (b'', b'no-decode', None, _(b'do not pass files through decoders')),
571 ( 585 (
572 'p', 586 b'p',
573 'prefix', 587 b'prefix',
574 '', 588 b'',
575 _('directory prefix for files in archive'), 589 _(b'directory prefix for files in archive'),
576 _('PREFIX'), 590 _(b'PREFIX'),
577 ), 591 ),
578 ('r', 'rev', '', _('revision to distribute'), _('REV')), 592 (b'r', b'rev', b'', _(b'revision to distribute'), _(b'REV')),
579 ('t', 'type', '', _('type of distribution to create'), _('TYPE')), 593 (b't', b'type', b'', _(b'type of distribution to create'), _(b'TYPE')),
580 ] 594 ]
581 + subrepoopts 595 + subrepoopts
582 + walkopts, 596 + walkopts,
583 _('[OPTION]... DEST'), 597 _(b'[OPTION]... DEST'),
584 helpcategory=command.CATEGORY_IMPORT_EXPORT, 598 helpcategory=command.CATEGORY_IMPORT_EXPORT,
585 ) 599 )
586 def archive(ui, repo, dest, **opts): 600 def archive(ui, repo, dest, **opts):
587 '''create an unversioned archive of a repository revision 601 '''create an unversioned archive of a repository revision
588 602
624 638
625 Returns 0 on success. 639 Returns 0 on success.
626 ''' 640 '''
627 641
628 opts = pycompat.byteskwargs(opts) 642 opts = pycompat.byteskwargs(opts)
629 rev = opts.get('rev') 643 rev = opts.get(b'rev')
630 if rev: 644 if rev:
631 repo = scmutil.unhidehashlikerevs(repo, [rev], 'nowarn') 645 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
632 ctx = scmutil.revsingle(repo, rev) 646 ctx = scmutil.revsingle(repo, rev)
633 if not ctx: 647 if not ctx:
634 raise error.Abort(_('no working directory: please specify a revision')) 648 raise error.Abort(_(b'no working directory: please specify a revision'))
635 node = ctx.node() 649 node = ctx.node()
636 dest = cmdutil.makefilename(ctx, dest) 650 dest = cmdutil.makefilename(ctx, dest)
637 if os.path.realpath(dest) == repo.root: 651 if os.path.realpath(dest) == repo.root:
638 raise error.Abort(_('repository root cannot be destination')) 652 raise error.Abort(_(b'repository root cannot be destination'))
639 653
640 kind = opts.get('type') or archival.guesskind(dest) or 'files' 654 kind = opts.get(b'type') or archival.guesskind(dest) or b'files'
641 prefix = opts.get('prefix') 655 prefix = opts.get(b'prefix')
642 656
643 if dest == '-': 657 if dest == b'-':
644 if kind == 'files': 658 if kind == b'files':
645 raise error.Abort(_('cannot archive plain files to stdout')) 659 raise error.Abort(_(b'cannot archive plain files to stdout'))
646 dest = cmdutil.makefileobj(ctx, dest) 660 dest = cmdutil.makefileobj(ctx, dest)
647 if not prefix: 661 if not prefix:
648 prefix = os.path.basename(repo.root) + '-%h' 662 prefix = os.path.basename(repo.root) + b'-%h'
649 663
650 prefix = cmdutil.makefilename(ctx, prefix) 664 prefix = cmdutil.makefilename(ctx, prefix)
651 match = scmutil.match(ctx, [], opts) 665 match = scmutil.match(ctx, [], opts)
652 archival.archive( 666 archival.archive(
653 repo, 667 repo,
654 dest, 668 dest,
655 node, 669 node,
656 kind, 670 kind,
657 not opts.get('no_decode'), 671 not opts.get(b'no_decode'),
658 match, 672 match,
659 prefix, 673 prefix,
660 subrepos=opts.get('subrepos'), 674 subrepos=opts.get(b'subrepos'),
661 ) 675 )
662 676
663 677
664 @command( 678 @command(
665 'backout', 679 b'backout',
666 [ 680 [
667 ('', 'merge', None, _('merge with old dirstate parent after backout')), 681 (
668 ( 682 b'',
669 '', 683 b'merge',
670 'commit',
671 None, 684 None,
672 _('commit if no conflicts were encountered (DEPRECATED)'), 685 _(b'merge with old dirstate parent after backout'),
673 ), 686 ),
674 ('', 'no-commit', None, _('do not commit')), 687 (
675 ( 688 b'',
676 '', 689 b'commit',
677 'parent', 690 None,
678 '', 691 _(b'commit if no conflicts were encountered (DEPRECATED)'),
679 _('parent to choose when backing out merge (DEPRECATED)'), 692 ),
680 _('REV'), 693 (b'', b'no-commit', None, _(b'do not commit')),
681 ), 694 (
682 ('r', 'rev', '', _('revision to backout'), _('REV')), 695 b'',
683 ('e', 'edit', False, _('invoke editor on commit messages')), 696 b'parent',
697 b'',
698 _(b'parent to choose when backing out merge (DEPRECATED)'),
699 _(b'REV'),
700 ),
701 (b'r', b'rev', b'', _(b'revision to backout'), _(b'REV')),
702 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
684 ] 703 ]
685 + mergetoolopts 704 + mergetoolopts
686 + walkopts 705 + walkopts
687 + commitopts 706 + commitopts
688 + commitopts2, 707 + commitopts2,
689 _('[OPTION]... [-r] REV'), 708 _(b'[OPTION]... [-r] REV'),
690 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT, 709 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
691 ) 710 )
692 def backout(ui, repo, node=None, rev=None, **opts): 711 def backout(ui, repo, node=None, rev=None, **opts):
693 '''reverse effect of earlier changeset 712 '''reverse effect of earlier changeset
694 713
745 return _dobackout(ui, repo, node, rev, **opts) 764 return _dobackout(ui, repo, node, rev, **opts)
746 765
747 766
748 def _dobackout(ui, repo, node=None, rev=None, **opts): 767 def _dobackout(ui, repo, node=None, rev=None, **opts):
749 opts = pycompat.byteskwargs(opts) 768 opts = pycompat.byteskwargs(opts)
750 if opts.get('commit') and opts.get('no_commit'): 769 if opts.get(b'commit') and opts.get(b'no_commit'):
751 raise error.Abort(_("cannot use --commit with --no-commit")) 770 raise error.Abort(_(b"cannot use --commit with --no-commit"))
752 if opts.get('merge') and opts.get('no_commit'): 771 if opts.get(b'merge') and opts.get(b'no_commit'):
753 raise error.Abort(_("cannot use --merge with --no-commit")) 772 raise error.Abort(_(b"cannot use --merge with --no-commit"))
754 773
755 if rev and node: 774 if rev and node:
756 raise error.Abort(_("please specify just one revision")) 775 raise error.Abort(_(b"please specify just one revision"))
757 776
758 if not rev: 777 if not rev:
759 rev = node 778 rev = node
760 779
761 if not rev: 780 if not rev:
762 raise error.Abort(_("please specify a revision to backout")) 781 raise error.Abort(_(b"please specify a revision to backout"))
763 782
764 date = opts.get('date') 783 date = opts.get(b'date')
765 if date: 784 if date:
766 opts['date'] = dateutil.parsedate(date) 785 opts[b'date'] = dateutil.parsedate(date)
767 786
768 cmdutil.checkunfinished(repo) 787 cmdutil.checkunfinished(repo)
769 cmdutil.bailifchanged(repo) 788 cmdutil.bailifchanged(repo)
770 node = scmutil.revsingle(repo, rev).node() 789 node = scmutil.revsingle(repo, rev).node()
771 790
772 op1, op2 = repo.dirstate.parents() 791 op1, op2 = repo.dirstate.parents()
773 if not repo.changelog.isancestor(node, op1): 792 if not repo.changelog.isancestor(node, op1):
774 raise error.Abort(_('cannot backout change that is not an ancestor')) 793 raise error.Abort(_(b'cannot backout change that is not an ancestor'))
775 794
776 p1, p2 = repo.changelog.parents(node) 795 p1, p2 = repo.changelog.parents(node)
777 if p1 == nullid: 796 if p1 == nullid:
778 raise error.Abort(_('cannot backout a change with no parents')) 797 raise error.Abort(_(b'cannot backout a change with no parents'))
779 if p2 != nullid: 798 if p2 != nullid:
780 if not opts.get('parent'): 799 if not opts.get(b'parent'):
781 raise error.Abort(_('cannot backout a merge changeset')) 800 raise error.Abort(_(b'cannot backout a merge changeset'))
782 p = repo.lookup(opts['parent']) 801 p = repo.lookup(opts[b'parent'])
783 if p not in (p1, p2): 802 if p not in (p1, p2):
784 raise error.Abort( 803 raise error.Abort(
785 _('%s is not a parent of %s') % (short(p), short(node)) 804 _(b'%s is not a parent of %s') % (short(p), short(node))
786 ) 805 )
787 parent = p 806 parent = p
788 else: 807 else:
789 if opts.get('parent'): 808 if opts.get(b'parent'):
790 raise error.Abort(_('cannot use --parent on non-merge changeset')) 809 raise error.Abort(_(b'cannot use --parent on non-merge changeset'))
791 parent = p1 810 parent = p1
792 811
793 # the backout should appear on the same branch 812 # the backout should appear on the same branch
794 branch = repo.dirstate.branch() 813 branch = repo.dirstate.branch()
795 bheads = repo.branchheads(branch) 814 bheads = repo.branchheads(branch)
796 rctx = scmutil.revsingle(repo, hex(parent)) 815 rctx = scmutil.revsingle(repo, hex(parent))
797 if not opts.get('merge') and op1 != node: 816 if not opts.get(b'merge') and op1 != node:
798 with dirstateguard.dirstateguard(repo, 'backout'): 817 with dirstateguard.dirstateguard(repo, b'backout'):
799 overrides = {('ui', 'forcemerge'): opts.get('tool', '')} 818 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
800 with ui.configoverride(overrides, 'backout'): 819 with ui.configoverride(overrides, b'backout'):
801 stats = mergemod.update( 820 stats = mergemod.update(
802 repo, 821 repo,
803 parent, 822 parent,
804 branchmerge=True, 823 branchmerge=True,
805 force=True, 824 force=True,
808 ) 827 )
809 repo.setparents(op1, op2) 828 repo.setparents(op1, op2)
810 hg._showstats(repo, stats) 829 hg._showstats(repo, stats)
811 if stats.unresolvedcount: 830 if stats.unresolvedcount:
812 repo.ui.status( 831 repo.ui.status(
813 _("use 'hg resolve' to retry unresolved " "file merges\n") 832 _(b"use 'hg resolve' to retry unresolved " b"file merges\n")
814 ) 833 )
815 return 1 834 return 1
816 else: 835 else:
817 hg.clean(repo, node, show_stats=False) 836 hg.clean(repo, node, show_stats=False)
818 repo.dirstate.setbranch(branch) 837 repo.dirstate.setbranch(branch)
819 cmdutil.revert(ui, repo, rctx, repo.dirstate.parents()) 838 cmdutil.revert(ui, repo, rctx, repo.dirstate.parents())
820 839
821 if opts.get('no_commit'): 840 if opts.get(b'no_commit'):
822 msg = _("changeset %s backed out, " "don't forget to commit.\n") 841 msg = _(b"changeset %s backed out, " b"don't forget to commit.\n")
823 ui.status(msg % short(node)) 842 ui.status(msg % short(node))
824 return 0 843 return 0
825 844
826 def commitfunc(ui, repo, message, match, opts): 845 def commitfunc(ui, repo, message, match, opts):
827 editform = 'backout' 846 editform = b'backout'
828 e = cmdutil.getcommiteditor( 847 e = cmdutil.getcommiteditor(
829 editform=editform, **pycompat.strkwargs(opts) 848 editform=editform, **pycompat.strkwargs(opts)
830 ) 849 )
831 if not message: 850 if not message:
832 # we don't translate commit messages 851 # we don't translate commit messages
833 message = "Backed out changeset %s" % short(node) 852 message = b"Backed out changeset %s" % short(node)
834 e = cmdutil.getcommiteditor(edit=True, editform=editform) 853 e = cmdutil.getcommiteditor(edit=True, editform=editform)
835 return repo.commit( 854 return repo.commit(
836 message, opts.get('user'), opts.get('date'), match, editor=e 855 message, opts.get(b'user'), opts.get(b'date'), match, editor=e
837 ) 856 )
838 857
839 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts) 858 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
840 if not newnode: 859 if not newnode:
841 ui.status(_("nothing changed\n")) 860 ui.status(_(b"nothing changed\n"))
842 return 1 861 return 1
843 cmdutil.commitstatus(repo, newnode, branch, bheads) 862 cmdutil.commitstatus(repo, newnode, branch, bheads)
844 863
845 def nice(node): 864 def nice(node):
846 return '%d:%s' % (repo.changelog.rev(node), short(node)) 865 return b'%d:%s' % (repo.changelog.rev(node), short(node))
847 866
848 ui.status( 867 ui.status(
849 _('changeset %s backs out changeset %s\n') 868 _(b'changeset %s backs out changeset %s\n')
850 % (nice(repo.changelog.tip()), nice(node)) 869 % (nice(repo.changelog.tip()), nice(node))
851 ) 870 )
852 if opts.get('merge') and op1 != node: 871 if opts.get(b'merge') and op1 != node:
853 hg.clean(repo, op1, show_stats=False) 872 hg.clean(repo, op1, show_stats=False)
854 ui.status(_('merging with changeset %s\n') % nice(repo.changelog.tip())) 873 ui.status(
855 overrides = {('ui', 'forcemerge'): opts.get('tool', '')} 874 _(b'merging with changeset %s\n') % nice(repo.changelog.tip())
856 with ui.configoverride(overrides, 'backout'): 875 )
876 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
877 with ui.configoverride(overrides, b'backout'):
857 return hg.merge(repo, hex(repo.changelog.tip())) 878 return hg.merge(repo, hex(repo.changelog.tip()))
858 return 0 879 return 0
859 880
860 881
861 @command( 882 @command(
862 'bisect', 883 b'bisect',
863 [ 884 [
864 ('r', 'reset', False, _('reset bisect state')), 885 (b'r', b'reset', False, _(b'reset bisect state')),
865 ('g', 'good', False, _('mark changeset good')), 886 (b'g', b'good', False, _(b'mark changeset good')),
866 ('b', 'bad', False, _('mark changeset bad')), 887 (b'b', b'bad', False, _(b'mark changeset bad')),
867 ('s', 'skip', False, _('skip testing changeset')), 888 (b's', b'skip', False, _(b'skip testing changeset')),
868 ('e', 'extend', False, _('extend the bisect range')), 889 (b'e', b'extend', False, _(b'extend the bisect range')),
869 ( 890 (
870 'c', 891 b'c',
871 'command', 892 b'command',
872 '', 893 b'',
873 _('use command to check changeset state'), 894 _(b'use command to check changeset state'),
874 _('CMD'), 895 _(b'CMD'),
875 ), 896 ),
876 ('U', 'noupdate', False, _('do not update to target')), 897 (b'U', b'noupdate', False, _(b'do not update to target')),
877 ], 898 ],
878 _("[-gbsr] [-U] [-c CMD] [REV]"), 899 _(b"[-gbsr] [-U] [-c CMD] [REV]"),
879 helpcategory=command.CATEGORY_CHANGE_NAVIGATION, 900 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
880 ) 901 )
881 def bisect( 902 def bisect(
882 ui, 903 ui,
883 repo, 904 repo,
971 See :hg:`help revisions.bisect` for more about the `bisect()` predicate. 992 See :hg:`help revisions.bisect` for more about the `bisect()` predicate.
972 993
973 Returns 0 on success. 994 Returns 0 on success.
974 """ 995 """
975 # backward compatibility 996 # backward compatibility
976 if rev in "good bad reset init".split(): 997 if rev in b"good bad reset init".split():
977 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n")) 998 ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n"))
978 cmd, rev, extra = rev, extra, None 999 cmd, rev, extra = rev, extra, None
979 if cmd == "good": 1000 if cmd == b"good":
980 good = True 1001 good = True
981 elif cmd == "bad": 1002 elif cmd == b"bad":
982 bad = True 1003 bad = True
983 else: 1004 else:
984 reset = True 1005 reset = True
985 elif extra: 1006 elif extra:
986 raise error.Abort(_('incompatible arguments')) 1007 raise error.Abort(_(b'incompatible arguments'))
987 1008
988 incompatibles = { 1009 incompatibles = {
989 '--bad': bad, 1010 b'--bad': bad,
990 '--command': bool(command), 1011 b'--command': bool(command),
991 '--extend': extend, 1012 b'--extend': extend,
992 '--good': good, 1013 b'--good': good,
993 '--reset': reset, 1014 b'--reset': reset,
994 '--skip': skip, 1015 b'--skip': skip,
995 } 1016 }
996 1017
997 enabled = [x for x in incompatibles if incompatibles[x]] 1018 enabled = [x for x in incompatibles if incompatibles[x]]
998 1019
999 if len(enabled) > 1: 1020 if len(enabled) > 1:
1000 raise error.Abort( 1021 raise error.Abort(
1001 _('%s and %s are incompatible') % tuple(sorted(enabled)[0:2]) 1022 _(b'%s and %s are incompatible') % tuple(sorted(enabled)[0:2])
1002 ) 1023 )
1003 1024
1004 if reset: 1025 if reset:
1005 hbisect.resetstate(repo) 1026 hbisect.resetstate(repo)
1006 return 1027 return
1010 # update state 1031 # update state
1011 if good or bad or skip: 1032 if good or bad or skip:
1012 if rev: 1033 if rev:
1013 nodes = [repo[i].node() for i in scmutil.revrange(repo, [rev])] 1034 nodes = [repo[i].node() for i in scmutil.revrange(repo, [rev])]
1014 else: 1035 else:
1015 nodes = [repo.lookup('.')] 1036 nodes = [repo.lookup(b'.')]
1016 if good: 1037 if good:
1017 state['good'] += nodes 1038 state[b'good'] += nodes
1018 elif bad: 1039 elif bad:
1019 state['bad'] += nodes 1040 state[b'bad'] += nodes
1020 elif skip: 1041 elif skip:
1021 state['skip'] += nodes 1042 state[b'skip'] += nodes
1022 hbisect.save_state(repo, state) 1043 hbisect.save_state(repo, state)
1023 if not (state['good'] and state['bad']): 1044 if not (state[b'good'] and state[b'bad']):
1024 return 1045 return
1025 1046
1026 def mayupdate(repo, node, show_stats=True): 1047 def mayupdate(repo, node, show_stats=True):
1027 """common used update sequence""" 1048 """common used update sequence"""
1028 if noupdate: 1049 if noupdate:
1035 1056
1036 if command: 1057 if command:
1037 changesets = 1 1058 changesets = 1
1038 if noupdate: 1059 if noupdate:
1039 try: 1060 try:
1040 node = state['current'][0] 1061 node = state[b'current'][0]
1041 except LookupError: 1062 except LookupError:
1042 raise error.Abort( 1063 raise error.Abort(
1043 _( 1064 _(
1044 'current bisect revision is unknown - ' 1065 b'current bisect revision is unknown - '
1045 'start a new bisect to fix' 1066 b'start a new bisect to fix'
1046 ) 1067 )
1047 ) 1068 )
1048 else: 1069 else:
1049 node, p2 = repo.dirstate.parents() 1070 node, p2 = repo.dirstate.parents()
1050 if p2 != nullid: 1071 if p2 != nullid:
1051 raise error.Abort(_('current bisect revision is a merge')) 1072 raise error.Abort(_(b'current bisect revision is a merge'))
1052 if rev: 1073 if rev:
1053 node = repo[scmutil.revsingle(repo, rev, node)].node() 1074 node = repo[scmutil.revsingle(repo, rev, node)].node()
1054 try: 1075 try:
1055 while changesets: 1076 while changesets:
1056 # update state 1077 # update state
1057 state['current'] = [node] 1078 state[b'current'] = [node]
1058 hbisect.save_state(repo, state) 1079 hbisect.save_state(repo, state)
1059 status = ui.system( 1080 status = ui.system(
1060 command, 1081 command,
1061 environ={'HG_NODE': hex(node)}, 1082 environ={b'HG_NODE': hex(node)},
1062 blockedtag='bisect_check', 1083 blockedtag=b'bisect_check',
1063 ) 1084 )
1064 if status == 125: 1085 if status == 125:
1065 transition = "skip" 1086 transition = b"skip"
1066 elif status == 0: 1087 elif status == 0:
1067 transition = "good" 1088 transition = b"good"
1068 # status < 0 means process was killed 1089 # status < 0 means process was killed
1069 elif status == 127: 1090 elif status == 127:
1070 raise error.Abort(_("failed to execute %s") % command) 1091 raise error.Abort(_(b"failed to execute %s") % command)
1071 elif status < 0: 1092 elif status < 0:
1072 raise error.Abort(_("%s killed") % command) 1093 raise error.Abort(_(b"%s killed") % command)
1073 else: 1094 else:
1074 transition = "bad" 1095 transition = b"bad"
1075 state[transition].append(node) 1096 state[transition].append(node)
1076 ctx = repo[node] 1097 ctx = repo[node]
1077 ui.status( 1098 ui.status(
1078 _('changeset %d:%s: %s\n') % (ctx.rev(), ctx, transition) 1099 _(b'changeset %d:%s: %s\n') % (ctx.rev(), ctx, transition)
1079 ) 1100 )
1080 hbisect.checkstate(state) 1101 hbisect.checkstate(state)
1081 # bisect 1102 # bisect
1082 nodes, changesets, bgood = hbisect.bisect(repo, state) 1103 nodes, changesets, bgood = hbisect.bisect(repo, state)
1083 # update to next check 1104 # update to next check
1084 node = nodes[0] 1105 node = nodes[0]
1085 mayupdate(repo, node, show_stats=False) 1106 mayupdate(repo, node, show_stats=False)
1086 finally: 1107 finally:
1087 state['current'] = [node] 1108 state[b'current'] = [node]
1088 hbisect.save_state(repo, state) 1109 hbisect.save_state(repo, state)
1089 hbisect.printresult(ui, repo, state, displayer, nodes, bgood) 1110 hbisect.printresult(ui, repo, state, displayer, nodes, bgood)
1090 return 1111 return
1091 1112
1092 hbisect.checkstate(state) 1113 hbisect.checkstate(state)
1096 if extend: 1117 if extend:
1097 if not changesets: 1118 if not changesets:
1098 extendnode = hbisect.extendrange(repo, state, nodes, good) 1119 extendnode = hbisect.extendrange(repo, state, nodes, good)
1099 if extendnode is not None: 1120 if extendnode is not None:
1100 ui.write( 1121 ui.write(
1101 _("Extending search to changeset %d:%s\n") 1122 _(b"Extending search to changeset %d:%s\n")
1102 % (extendnode.rev(), extendnode) 1123 % (extendnode.rev(), extendnode)
1103 ) 1124 )
1104 state['current'] = [extendnode.node()] 1125 state[b'current'] = [extendnode.node()]
1105 hbisect.save_state(repo, state) 1126 hbisect.save_state(repo, state)
1106 return mayupdate(repo, extendnode.node()) 1127 return mayupdate(repo, extendnode.node())
1107 raise error.Abort(_("nothing to extend")) 1128 raise error.Abort(_(b"nothing to extend"))
1108 1129
1109 if changesets == 0: 1130 if changesets == 0:
1110 hbisect.printresult(ui, repo, state, displayer, nodes, good) 1131 hbisect.printresult(ui, repo, state, displayer, nodes, good)
1111 else: 1132 else:
1112 assert len(nodes) == 1 # only a single node can be tested next 1133 assert len(nodes) == 1 # only a single node can be tested next
1116 while size <= changesets: 1137 while size <= changesets:
1117 tests, size = tests + 1, size * 2 1138 tests, size = tests + 1, size * 2
1118 rev = repo.changelog.rev(node) 1139 rev = repo.changelog.rev(node)
1119 ui.write( 1140 ui.write(
1120 _( 1141 _(
1121 "Testing changeset %d:%s " 1142 b"Testing changeset %d:%s "
1122 "(%d changesets remaining, ~%d tests)\n" 1143 b"(%d changesets remaining, ~%d tests)\n"
1123 ) 1144 )
1124 % (rev, short(node), changesets, tests) 1145 % (rev, short(node), changesets, tests)
1125 ) 1146 )
1126 state['current'] = [node] 1147 state[b'current'] = [node]
1127 hbisect.save_state(repo, state) 1148 hbisect.save_state(repo, state)
1128 return mayupdate(repo, node) 1149 return mayupdate(repo, node)
1129 1150
1130 1151
1131 @command( 1152 @command(
1132 'bookmarks|bookmark', 1153 b'bookmarks|bookmark',
1133 [ 1154 [
1134 ('f', 'force', False, _('force')), 1155 (b'f', b'force', False, _(b'force')),
1135 ('r', 'rev', '', _('revision for bookmark action'), _('REV')), 1156 (b'r', b'rev', b'', _(b'revision for bookmark action'), _(b'REV')),
1136 ('d', 'delete', False, _('delete a given bookmark')), 1157 (b'd', b'delete', False, _(b'delete a given bookmark')),
1137 ('m', 'rename', '', _('rename a given bookmark'), _('OLD')), 1158 (b'm', b'rename', b'', _(b'rename a given bookmark'), _(b'OLD')),
1138 ('i', 'inactive', False, _('mark a bookmark inactive')), 1159 (b'i', b'inactive', False, _(b'mark a bookmark inactive')),
1139 ('l', 'list', False, _('list existing bookmarks')), 1160 (b'l', b'list', False, _(b'list existing bookmarks')),
1140 ] 1161 ]
1141 + formatteropts, 1162 + formatteropts,
1142 _('hg bookmarks [OPTIONS]... [NAME]...'), 1163 _(b'hg bookmarks [OPTIONS]... [NAME]...'),
1143 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION, 1164 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1144 ) 1165 )
1145 def bookmark(ui, repo, *names, **opts): 1166 def bookmark(ui, repo, *names, **opts):
1146 '''create a new bookmark or list existing bookmarks 1167 '''create a new bookmark or list existing bookmarks
1147 1168
1201 - print only the active bookmark name:: 1222 - print only the active bookmark name::
1202 1223
1203 hg book -ql . 1224 hg book -ql .
1204 ''' 1225 '''
1205 opts = pycompat.byteskwargs(opts) 1226 opts = pycompat.byteskwargs(opts)
1206 force = opts.get('force') 1227 force = opts.get(b'force')
1207 rev = opts.get('rev') 1228 rev = opts.get(b'rev')
1208 inactive = opts.get('inactive') # meaning add/rename to inactive bookmark 1229 inactive = opts.get(b'inactive') # meaning add/rename to inactive bookmark
1209 1230
1210 selactions = [k for k in ['delete', 'rename', 'list'] if opts.get(k)] 1231 selactions = [k for k in [b'delete', b'rename', b'list'] if opts.get(k)]
1211 if len(selactions) > 1: 1232 if len(selactions) > 1:
1212 raise error.Abort( 1233 raise error.Abort(
1213 _('--%s and --%s are incompatible') % tuple(selactions[:2]) 1234 _(b'--%s and --%s are incompatible') % tuple(selactions[:2])
1214 ) 1235 )
1215 if selactions: 1236 if selactions:
1216 action = selactions[0] 1237 action = selactions[0]
1217 elif names or rev: 1238 elif names or rev:
1218 action = 'add' 1239 action = b'add'
1219 elif inactive: 1240 elif inactive:
1220 action = 'inactive' # meaning deactivate 1241 action = b'inactive' # meaning deactivate
1221 else: 1242 else:
1222 action = 'list' 1243 action = b'list'
1223 1244
1224 if rev and action in {'delete', 'rename', 'list'}: 1245 if rev and action in {b'delete', b'rename', b'list'}:
1225 raise error.Abort(_("--rev is incompatible with --%s") % action) 1246 raise error.Abort(_(b"--rev is incompatible with --%s") % action)
1226 if inactive and action in {'delete', 'list'}: 1247 if inactive and action in {b'delete', b'list'}:
1227 raise error.Abort(_("--inactive is incompatible with --%s") % action) 1248 raise error.Abort(_(b"--inactive is incompatible with --%s") % action)
1228 if not names and action in {'add', 'delete'}: 1249 if not names and action in {b'add', b'delete'}:
1229 raise error.Abort(_("bookmark name required")) 1250 raise error.Abort(_(b"bookmark name required"))
1230 1251
1231 if action in {'add', 'delete', 'rename', 'inactive'}: 1252 if action in {b'add', b'delete', b'rename', b'inactive'}:
1232 with repo.wlock(), repo.lock(), repo.transaction('bookmark') as tr: 1253 with repo.wlock(), repo.lock(), repo.transaction(b'bookmark') as tr:
1233 if action == 'delete': 1254 if action == b'delete':
1234 names = pycompat.maplist(repo._bookmarks.expandname, names) 1255 names = pycompat.maplist(repo._bookmarks.expandname, names)
1235 bookmarks.delete(repo, tr, names) 1256 bookmarks.delete(repo, tr, names)
1236 elif action == 'rename': 1257 elif action == b'rename':
1237 if not names: 1258 if not names:
1238 raise error.Abort(_("new bookmark name required")) 1259 raise error.Abort(_(b"new bookmark name required"))
1239 elif len(names) > 1: 1260 elif len(names) > 1:
1240 raise error.Abort(_("only one new bookmark name allowed")) 1261 raise error.Abort(_(b"only one new bookmark name allowed"))
1241 oldname = repo._bookmarks.expandname(opts['rename']) 1262 oldname = repo._bookmarks.expandname(opts[b'rename'])
1242 bookmarks.rename(repo, tr, oldname, names[0], force, inactive) 1263 bookmarks.rename(repo, tr, oldname, names[0], force, inactive)
1243 elif action == 'add': 1264 elif action == b'add':
1244 bookmarks.addbookmarks(repo, tr, names, rev, force, inactive) 1265 bookmarks.addbookmarks(repo, tr, names, rev, force, inactive)
1245 elif action == 'inactive': 1266 elif action == b'inactive':
1246 if len(repo._bookmarks) == 0: 1267 if len(repo._bookmarks) == 0:
1247 ui.status(_("no bookmarks set\n")) 1268 ui.status(_(b"no bookmarks set\n"))
1248 elif not repo._activebookmark: 1269 elif not repo._activebookmark:
1249 ui.status(_("no active bookmark\n")) 1270 ui.status(_(b"no active bookmark\n"))
1250 else: 1271 else:
1251 bookmarks.deactivate(repo) 1272 bookmarks.deactivate(repo)
1252 elif action == 'list': 1273 elif action == b'list':
1253 names = pycompat.maplist(repo._bookmarks.expandname, names) 1274 names = pycompat.maplist(repo._bookmarks.expandname, names)
1254 with ui.formatter('bookmarks', opts) as fm: 1275 with ui.formatter(b'bookmarks', opts) as fm:
1255 bookmarks.printbookmarks(ui, repo, fm, names) 1276 bookmarks.printbookmarks(ui, repo, fm, names)
1256 else: 1277 else:
1257 raise error.ProgrammingError('invalid action: %s' % action) 1278 raise error.ProgrammingError(b'invalid action: %s' % action)
1258 1279
1259 1280
1260 @command( 1281 @command(
1261 'branch', 1282 b'branch',
1262 [ 1283 [
1263 ( 1284 (
1264 'f', 1285 b'f',
1265 'force', 1286 b'force',
1266 None, 1287 None,
1267 _('set branch name even if it shadows an existing branch'), 1288 _(b'set branch name even if it shadows an existing branch'),
1268 ), 1289 ),
1269 ('C', 'clean', None, _('reset branch name to parent branch name')), 1290 (b'C', b'clean', None, _(b'reset branch name to parent branch name')),
1270 ('r', 'rev', [], _('change branches of the given revs (EXPERIMENTAL)')), 1291 (
1292 b'r',
1293 b'rev',
1294 [],
1295 _(b'change branches of the given revs (EXPERIMENTAL)'),
1296 ),
1271 ], 1297 ],
1272 _('[-fC] [NAME]'), 1298 _(b'[-fC] [NAME]'),
1273 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION, 1299 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1274 ) 1300 )
1275 def branch(ui, repo, label=None, **opts): 1301 def branch(ui, repo, label=None, **opts):
1276 """set or show the current branch name 1302 """set or show the current branch name
1277 1303
1300 considered closed. 1326 considered closed.
1301 1327
1302 Returns 0 on success. 1328 Returns 0 on success.
1303 """ 1329 """
1304 opts = pycompat.byteskwargs(opts) 1330 opts = pycompat.byteskwargs(opts)
1305 revs = opts.get('rev') 1331 revs = opts.get(b'rev')
1306 if label: 1332 if label:
1307 label = label.strip() 1333 label = label.strip()
1308 1334
1309 if not opts.get('clean') and not label: 1335 if not opts.get(b'clean') and not label:
1310 if revs: 1336 if revs:
1311 raise error.Abort(_("no branch name specified for the revisions")) 1337 raise error.Abort(_(b"no branch name specified for the revisions"))
1312 ui.write("%s\n" % repo.dirstate.branch()) 1338 ui.write(b"%s\n" % repo.dirstate.branch())
1313 return 1339 return
1314 1340
1315 with repo.wlock(): 1341 with repo.wlock():
1316 if opts.get('clean'): 1342 if opts.get(b'clean'):
1317 label = repo['.'].branch() 1343 label = repo[b'.'].branch()
1318 repo.dirstate.setbranch(label) 1344 repo.dirstate.setbranch(label)
1319 ui.status(_('reset working directory to branch %s\n') % label) 1345 ui.status(_(b'reset working directory to branch %s\n') % label)
1320 elif label: 1346 elif label:
1321 1347
1322 scmutil.checknewlabel(repo, label, 'branch') 1348 scmutil.checknewlabel(repo, label, b'branch')
1323 if revs: 1349 if revs:
1324 return cmdutil.changebranch(ui, repo, revs, label) 1350 return cmdutil.changebranch(ui, repo, revs, label)
1325 1351
1326 if not opts.get('force') and label in repo.branchmap(): 1352 if not opts.get(b'force') and label in repo.branchmap():
1327 if label not in [p.branch() for p in repo[None].parents()]: 1353 if label not in [p.branch() for p in repo[None].parents()]:
1328 raise error.Abort( 1354 raise error.Abort(
1329 _('a branch of the same name already' ' exists'), 1355 _(b'a branch of the same name already' b' exists'),
1330 # i18n: "it" refers to an existing branch 1356 # i18n: "it" refers to an existing branch
1331 hint=_("use 'hg update' to switch to it"), 1357 hint=_(b"use 'hg update' to switch to it"),
1332 ) 1358 )
1333 1359
1334 repo.dirstate.setbranch(label) 1360 repo.dirstate.setbranch(label)
1335 ui.status(_('marked working directory as branch %s\n') % label) 1361 ui.status(_(b'marked working directory as branch %s\n') % label)
1336 1362
1337 # find any open named branches aside from default 1363 # find any open named branches aside from default
1338 for n, h, t, c in repo.branchmap().iterbranches(): 1364 for n, h, t, c in repo.branchmap().iterbranches():
1339 if n != "default" and not c: 1365 if n != b"default" and not c:
1340 return 0 1366 return 0
1341 ui.status( 1367 ui.status(
1342 _( 1368 _(
1343 '(branches are permanent and global, ' 1369 b'(branches are permanent and global, '
1344 'did you want a bookmark?)\n' 1370 b'did you want a bookmark?)\n'
1345 ) 1371 )
1346 ) 1372 )
1347 1373
1348 1374
1349 @command( 1375 @command(
1350 'branches', 1376 b'branches',
1351 [ 1377 [
1352 ( 1378 (
1353 'a', 1379 b'a',
1354 'active', 1380 b'active',
1355 False, 1381 False,
1356 _('show only branches that have unmerged heads (DEPRECATED)'), 1382 _(b'show only branches that have unmerged heads (DEPRECATED)'),
1357 ), 1383 ),
1358 ('c', 'closed', False, _('show normal and closed branches')), 1384 (b'c', b'closed', False, _(b'show normal and closed branches')),
1359 ('r', 'rev', [], _('show branch name(s) of the given rev')), 1385 (b'r', b'rev', [], _(b'show branch name(s) of the given rev')),
1360 ] 1386 ]
1361 + formatteropts, 1387 + formatteropts,
1362 _('[-c]'), 1388 _(b'[-c]'),
1363 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION, 1389 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1364 intents={INTENT_READONLY}, 1390 intents={INTENT_READONLY},
1365 ) 1391 )
1366 def branches(ui, repo, active=False, closed=False, **opts): 1392 def branches(ui, repo, active=False, closed=False, **opts):
1367 """list repository named branches 1393 """list repository named branches
1386 1412
1387 Returns 0. 1413 Returns 0.
1388 """ 1414 """
1389 1415
1390 opts = pycompat.byteskwargs(opts) 1416 opts = pycompat.byteskwargs(opts)
1391 revs = opts.get('rev') 1417 revs = opts.get(b'rev')
1392 selectedbranches = None 1418 selectedbranches = None
1393 if revs: 1419 if revs:
1394 revs = scmutil.revrange(repo, revs) 1420 revs = scmutil.revrange(repo, revs)
1395 getbi = repo.revbranchcache().branchinfo 1421 getbi = repo.revbranchcache().branchinfo
1396 selectedbranches = {getbi(r)[0] for r in revs} 1422 selectedbranches = {getbi(r)[0] for r in revs}
1397 1423
1398 ui.pager('branches') 1424 ui.pager(b'branches')
1399 fm = ui.formatter('branches', opts) 1425 fm = ui.formatter(b'branches', opts)
1400 hexfunc = fm.hexfunc 1426 hexfunc = fm.hexfunc
1401 1427
1402 allheads = set(repo.heads()) 1428 allheads = set(repo.heads())
1403 branches = [] 1429 branches = []
1404 for tag, heads, tip, isclosed in repo.branchmap().iterbranches(): 1430 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1413 1439
1414 for tag, ctx, isactive, isopen in branches: 1440 for tag, ctx, isactive, isopen in branches:
1415 if active and not isactive: 1441 if active and not isactive:
1416 continue 1442 continue
1417 if isactive: 1443 if isactive:
1418 label = 'branches.active' 1444 label = b'branches.active'
1419 notice = '' 1445 notice = b''
1420 elif not isopen: 1446 elif not isopen:
1421 if not closed: 1447 if not closed:
1422 continue 1448 continue
1423 label = 'branches.closed' 1449 label = b'branches.closed'
1424 notice = _(' (closed)') 1450 notice = _(b' (closed)')
1425 else: 1451 else:
1426 label = 'branches.inactive' 1452 label = b'branches.inactive'
1427 notice = _(' (inactive)') 1453 notice = _(b' (inactive)')
1428 current = tag == repo.dirstate.branch() 1454 current = tag == repo.dirstate.branch()
1429 if current: 1455 if current:
1430 label = 'branches.current' 1456 label = b'branches.current'
1431 1457
1432 fm.startitem() 1458 fm.startitem()
1433 fm.write('branch', '%s', tag, label=label) 1459 fm.write(b'branch', b'%s', tag, label=label)
1434 rev = ctx.rev() 1460 rev = ctx.rev()
1435 padsize = max(31 - len("%d" % rev) - encoding.colwidth(tag), 0) 1461 padsize = max(31 - len(b"%d" % rev) - encoding.colwidth(tag), 0)
1436 fmt = ' ' * padsize + ' %d:%s' 1462 fmt = b' ' * padsize + b' %d:%s'
1437 fm.condwrite( 1463 fm.condwrite(
1438 not ui.quiet, 1464 not ui.quiet,
1439 'rev node', 1465 b'rev node',
1440 fmt, 1466 fmt,
1441 rev, 1467 rev,
1442 hexfunc(ctx.node()), 1468 hexfunc(ctx.node()),
1443 label='log.changeset changeset.%s' % ctx.phasestr(), 1469 label=b'log.changeset changeset.%s' % ctx.phasestr(),
1444 ) 1470 )
1445 fm.context(ctx=ctx) 1471 fm.context(ctx=ctx)
1446 fm.data(active=isactive, closed=not isopen, current=current) 1472 fm.data(active=isactive, closed=not isopen, current=current)
1447 if not ui.quiet: 1473 if not ui.quiet:
1448 fm.plain(notice) 1474 fm.plain(notice)
1449 fm.plain('\n') 1475 fm.plain(b'\n')
1450 fm.end() 1476 fm.end()
1451 1477
1452 1478
1453 @command( 1479 @command(
1454 'bundle', 1480 b'bundle',
1455 [ 1481 [
1456 ('f', 'force', None, _('run even when the destination is unrelated')), 1482 (
1457 ( 1483 b'f',
1458 'r', 1484 b'force',
1459 'rev', 1485 None,
1486 _(b'run even when the destination is unrelated'),
1487 ),
1488 (
1489 b'r',
1490 b'rev',
1460 [], 1491 [],
1461 _('a changeset intended to be added to the destination'), 1492 _(b'a changeset intended to be added to the destination'),
1462 _('REV'), 1493 _(b'REV'),
1463 ), 1494 ),
1464 ( 1495 (
1465 'b', 1496 b'b',
1466 'branch', 1497 b'branch',
1467 [], 1498 [],
1468 _('a specific branch you would like to bundle'), 1499 _(b'a specific branch you would like to bundle'),
1469 _('BRANCH'), 1500 _(b'BRANCH'),
1470 ), 1501 ),
1471 ( 1502 (
1472 '', 1503 b'',
1473 'base', 1504 b'base',
1474 [], 1505 [],
1475 _('a base changeset assumed to be available at the destination'), 1506 _(b'a base changeset assumed to be available at the destination'),
1476 _('REV'), 1507 _(b'REV'),
1477 ), 1508 ),
1478 ('a', 'all', None, _('bundle all changesets in the repository')), 1509 (b'a', b'all', None, _(b'bundle all changesets in the repository')),
1479 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE')), 1510 (
1511 b't',
1512 b'type',
1513 b'bzip2',
1514 _(b'bundle compression type to use'),
1515 _(b'TYPE'),
1516 ),
1480 ] 1517 ]
1481 + remoteopts, 1518 + remoteopts,
1482 _('[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]'), 1519 _(b'[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]'),
1483 helpcategory=command.CATEGORY_IMPORT_EXPORT, 1520 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1484 ) 1521 )
1485 def bundle(ui, repo, fname, dest=None, **opts): 1522 def bundle(ui, repo, fname, dest=None, **opts):
1486 """create a bundle file 1523 """create a bundle file
1487 1524
1510 1547
1511 Returns 0 on success, 1 if no changes found. 1548 Returns 0 on success, 1 if no changes found.
1512 """ 1549 """
1513 opts = pycompat.byteskwargs(opts) 1550 opts = pycompat.byteskwargs(opts)
1514 revs = None 1551 revs = None
1515 if 'rev' in opts: 1552 if b'rev' in opts:
1516 revstrings = opts['rev'] 1553 revstrings = opts[b'rev']
1517 revs = scmutil.revrange(repo, revstrings) 1554 revs = scmutil.revrange(repo, revstrings)
1518 if revstrings and not revs: 1555 if revstrings and not revs:
1519 raise error.Abort(_('no commits to bundle')) 1556 raise error.Abort(_(b'no commits to bundle'))
1520 1557
1521 bundletype = opts.get('type', 'bzip2').lower() 1558 bundletype = opts.get(b'type', b'bzip2').lower()
1522 try: 1559 try:
1523 bundlespec = exchange.parsebundlespec(repo, bundletype, strict=False) 1560 bundlespec = exchange.parsebundlespec(repo, bundletype, strict=False)
1524 except error.UnsupportedBundleSpecification as e: 1561 except error.UnsupportedBundleSpecification as e:
1525 raise error.Abort( 1562 raise error.Abort(
1526 pycompat.bytestr(e), 1563 pycompat.bytestr(e),
1527 hint=_( 1564 hint=_(
1528 "see 'hg help bundlespec' for supported " "values for --type" 1565 b"see 'hg help bundlespec' for supported " b"values for --type"
1529 ), 1566 ),
1530 ) 1567 )
1531 cgversion = bundlespec.contentopts["cg.version"] 1568 cgversion = bundlespec.contentopts[b"cg.version"]
1532 1569
1533 # Packed bundles are a pseudo bundle format for now. 1570 # Packed bundles are a pseudo bundle format for now.
1534 if cgversion == 's1': 1571 if cgversion == b's1':
1535 raise error.Abort( 1572 raise error.Abort(
1536 _('packed bundles cannot be produced by "hg bundle"'), 1573 _(b'packed bundles cannot be produced by "hg bundle"'),
1537 hint=_("use 'hg debugcreatestreamclonebundle'"), 1574 hint=_(b"use 'hg debugcreatestreamclonebundle'"),
1538 ) 1575 )
1539 1576
1540 if opts.get('all'): 1577 if opts.get(b'all'):
1541 if dest: 1578 if dest:
1542 raise error.Abort( 1579 raise error.Abort(
1543 _("--all is incompatible with specifying " "a destination") 1580 _(b"--all is incompatible with specifying " b"a destination")
1544 ) 1581 )
1545 if opts.get('base'): 1582 if opts.get(b'base'):
1546 ui.warn(_("ignoring --base because --all was specified\n")) 1583 ui.warn(_(b"ignoring --base because --all was specified\n"))
1547 base = [nullrev] 1584 base = [nullrev]
1548 else: 1585 else:
1549 base = scmutil.revrange(repo, opts.get('base')) 1586 base = scmutil.revrange(repo, opts.get(b'base'))
1550 if cgversion not in changegroup.supportedoutgoingversions(repo): 1587 if cgversion not in changegroup.supportedoutgoingversions(repo):
1551 raise error.Abort( 1588 raise error.Abort(
1552 _("repository does not support bundle version %s") % cgversion 1589 _(b"repository does not support bundle version %s") % cgversion
1553 ) 1590 )
1554 1591
1555 if base: 1592 if base:
1556 if dest: 1593 if dest:
1557 raise error.Abort( 1594 raise error.Abort(
1558 _("--base is incompatible with specifying " "a destination") 1595 _(b"--base is incompatible with specifying " b"a destination")
1559 ) 1596 )
1560 common = [repo[rev].node() for rev in base] 1597 common = [repo[rev].node() for rev in base]
1561 heads = [repo[r].node() for r in revs] if revs else None 1598 heads = [repo[r].node() for r in revs] if revs else None
1562 outgoing = discovery.outgoing(repo, common, heads) 1599 outgoing = discovery.outgoing(repo, common, heads)
1563 else: 1600 else:
1564 dest = ui.expandpath(dest or 'default-push', dest or 'default') 1601 dest = ui.expandpath(dest or b'default-push', dest or b'default')
1565 dest, branches = hg.parseurl(dest, opts.get('branch')) 1602 dest, branches = hg.parseurl(dest, opts.get(b'branch'))
1566 other = hg.peer(repo, opts, dest) 1603 other = hg.peer(repo, opts, dest)
1567 revs = [repo[r].hex() for r in revs] 1604 revs = [repo[r].hex() for r in revs]
1568 revs, checkout = hg.addbranchrevs(repo, repo, branches, revs) 1605 revs, checkout = hg.addbranchrevs(repo, repo, branches, revs)
1569 heads = revs and pycompat.maplist(repo.lookup, revs) or revs 1606 heads = revs and pycompat.maplist(repo.lookup, revs) or revs
1570 outgoing = discovery.findcommonoutgoing( 1607 outgoing = discovery.findcommonoutgoing(
1571 repo, other, onlyheads=heads, force=opts.get('force'), portable=True 1608 repo,
1609 other,
1610 onlyheads=heads,
1611 force=opts.get(b'force'),
1612 portable=True,
1572 ) 1613 )
1573 1614
1574 if not outgoing.missing: 1615 if not outgoing.missing:
1575 scmutil.nochangesfound(ui, repo, not base and outgoing.excluded) 1616 scmutil.nochangesfound(ui, repo, not base and outgoing.excluded)
1576 return 1 1617 return 1
1577 1618
1578 if cgversion == '01': # bundle1 1619 if cgversion == b'01': # bundle1
1579 bversion = 'HG10' + bundlespec.wirecompression 1620 bversion = b'HG10' + bundlespec.wirecompression
1580 bcompression = None 1621 bcompression = None
1581 elif cgversion in ('02', '03'): 1622 elif cgversion in (b'02', b'03'):
1582 bversion = 'HG20' 1623 bversion = b'HG20'
1583 bcompression = bundlespec.wirecompression 1624 bcompression = bundlespec.wirecompression
1584 else: 1625 else:
1585 raise error.ProgrammingError( 1626 raise error.ProgrammingError(
1586 'bundle: unexpected changegroup version %s' % cgversion 1627 b'bundle: unexpected changegroup version %s' % cgversion
1587 ) 1628 )
1588 1629
1589 # TODO compression options should be derived from bundlespec parsing. 1630 # TODO compression options should be derived from bundlespec parsing.
1590 # This is a temporary hack to allow adjusting bundle compression 1631 # This is a temporary hack to allow adjusting bundle compression
1591 # level without a) formalizing the bundlespec changes to declare it 1632 # level without a) formalizing the bundlespec changes to declare it
1592 # b) introducing a command flag. 1633 # b) introducing a command flag.
1593 compopts = {} 1634 compopts = {}
1594 complevel = ui.configint( 1635 complevel = ui.configint(
1595 'experimental', 'bundlecomplevel.' + bundlespec.compression 1636 b'experimental', b'bundlecomplevel.' + bundlespec.compression
1596 ) 1637 )
1597 if complevel is None: 1638 if complevel is None:
1598 complevel = ui.configint('experimental', 'bundlecomplevel') 1639 complevel = ui.configint(b'experimental', b'bundlecomplevel')
1599 if complevel is not None: 1640 if complevel is not None:
1600 compopts['level'] = complevel 1641 compopts[b'level'] = complevel
1601 1642
1602 # Allow overriding the bundling of obsmarker in phases through 1643 # Allow overriding the bundling of obsmarker in phases through
1603 # configuration while we don't have a bundle version that include them 1644 # configuration while we don't have a bundle version that include them
1604 if repo.ui.configbool('experimental', 'evolution.bundle-obsmarker'): 1645 if repo.ui.configbool(b'experimental', b'evolution.bundle-obsmarker'):
1605 bundlespec.contentopts['obsolescence'] = True 1646 bundlespec.contentopts[b'obsolescence'] = True
1606 if repo.ui.configbool('experimental', 'bundle-phases'): 1647 if repo.ui.configbool(b'experimental', b'bundle-phases'):
1607 bundlespec.contentopts['phases'] = True 1648 bundlespec.contentopts[b'phases'] = True
1608 1649
1609 bundle2.writenewbundle( 1650 bundle2.writenewbundle(
1610 ui, 1651 ui,
1611 repo, 1652 repo,
1612 'bundle', 1653 b'bundle',
1613 fname, 1654 fname,
1614 bversion, 1655 bversion,
1615 outgoing, 1656 outgoing,
1616 bundlespec.contentopts, 1657 bundlespec.contentopts,
1617 compression=bcompression, 1658 compression=bcompression,
1618 compopts=compopts, 1659 compopts=compopts,
1619 ) 1660 )
1620 1661
1621 1662
1622 @command( 1663 @command(
1623 'cat', 1664 b'cat',
1624 [ 1665 [
1625 ( 1666 (
1626 'o', 1667 b'o',
1627 'output', 1668 b'output',
1628 '', 1669 b'',
1629 _('print output to file with formatted name'), 1670 _(b'print output to file with formatted name'),
1630 _('FORMAT'), 1671 _(b'FORMAT'),
1631 ), 1672 ),
1632 ('r', 'rev', '', _('print the given revision'), _('REV')), 1673 (b'r', b'rev', b'', _(b'print the given revision'), _(b'REV')),
1633 ('', 'decode', None, _('apply any matching decode filter')), 1674 (b'', b'decode', None, _(b'apply any matching decode filter')),
1634 ] 1675 ]
1635 + walkopts 1676 + walkopts
1636 + formatteropts, 1677 + formatteropts,
1637 _('[OPTION]... FILE...'), 1678 _(b'[OPTION]... FILE...'),
1638 helpcategory=command.CATEGORY_FILE_CONTENTS, 1679 helpcategory=command.CATEGORY_FILE_CONTENTS,
1639 inferrepo=True, 1680 inferrepo=True,
1640 intents={INTENT_READONLY}, 1681 intents={INTENT_READONLY},
1641 ) 1682 )
1642 def cat(ui, repo, file1, *pats, **opts): 1683 def cat(ui, repo, file1, *pats, **opts):
1672 :path: String. Repository-absolute path of the file. 1713 :path: String. Repository-absolute path of the file.
1673 1714
1674 Returns 0 on success. 1715 Returns 0 on success.
1675 """ 1716 """
1676 opts = pycompat.byteskwargs(opts) 1717 opts = pycompat.byteskwargs(opts)
1677 rev = opts.get('rev') 1718 rev = opts.get(b'rev')
1678 if rev: 1719 if rev:
1679 repo = scmutil.unhidehashlikerevs(repo, [rev], 'nowarn') 1720 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
1680 ctx = scmutil.revsingle(repo, rev) 1721 ctx = scmutil.revsingle(repo, rev)
1681 m = scmutil.match(ctx, (file1,) + pats, opts) 1722 m = scmutil.match(ctx, (file1,) + pats, opts)
1682 fntemplate = opts.pop('output', '') 1723 fntemplate = opts.pop(b'output', b'')
1683 if cmdutil.isstdiofilename(fntemplate): 1724 if cmdutil.isstdiofilename(fntemplate):
1684 fntemplate = '' 1725 fntemplate = b''
1685 1726
1686 if fntemplate: 1727 if fntemplate:
1687 fm = formatter.nullformatter(ui, 'cat', opts) 1728 fm = formatter.nullformatter(ui, b'cat', opts)
1688 else: 1729 else:
1689 ui.pager('cat') 1730 ui.pager(b'cat')
1690 fm = ui.formatter('cat', opts) 1731 fm = ui.formatter(b'cat', opts)
1691 with fm: 1732 with fm:
1692 return cmdutil.cat( 1733 return cmdutil.cat(
1693 ui, repo, ctx, m, fm, fntemplate, '', **pycompat.strkwargs(opts) 1734 ui, repo, ctx, m, fm, fntemplate, b'', **pycompat.strkwargs(opts)
1694 ) 1735 )
1695 1736
1696 1737
1697 @command( 1738 @command(
1698 'clone', 1739 b'clone',
1699 [ 1740 [
1700 ( 1741 (
1701 'U', 1742 b'U',
1702 'noupdate', 1743 b'noupdate',
1703 None, 1744 None,
1704 _( 1745 _(
1705 'the clone will include an empty working ' 1746 b'the clone will include an empty working '
1706 'directory (only a repository)' 1747 b'directory (only a repository)'
1707 ), 1748 ),
1708 ), 1749 ),
1709 ( 1750 (
1710 'u', 1751 b'u',
1711 'updaterev', 1752 b'updaterev',
1712 '', 1753 b'',
1713 _('revision, tag, or branch to check out'), 1754 _(b'revision, tag, or branch to check out'),
1714 _('REV'), 1755 _(b'REV'),
1715 ), 1756 ),
1716 ( 1757 (
1717 'r', 1758 b'r',
1718 'rev', 1759 b'rev',
1719 [], 1760 [],
1720 _( 1761 _(
1721 'do not clone everything, but include this changeset' 1762 b'do not clone everything, but include this changeset'
1722 ' and its ancestors' 1763 b' and its ancestors'
1723 ), 1764 ),
1724 _('REV'), 1765 _(b'REV'),
1725 ), 1766 ),
1726 ( 1767 (
1727 'b', 1768 b'b',
1728 'branch', 1769 b'branch',
1729 [], 1770 [],
1730 _( 1771 _(
1731 'do not clone everything, but include this branch\'s' 1772 b'do not clone everything, but include this branch\'s'
1732 ' changesets and their ancestors' 1773 b' changesets and their ancestors'
1733 ), 1774 ),
1734 _('BRANCH'), 1775 _(b'BRANCH'),
1735 ), 1776 ),
1736 ('', 'pull', None, _('use pull protocol to copy metadata')), 1777 (b'', b'pull', None, _(b'use pull protocol to copy metadata')),
1737 ('', 'uncompressed', None, _('an alias to --stream (DEPRECATED)')), 1778 (b'', b'uncompressed', None, _(b'an alias to --stream (DEPRECATED)')),
1738 ('', 'stream', None, _('clone with minimal data processing')), 1779 (b'', b'stream', None, _(b'clone with minimal data processing')),
1739 ] 1780 ]
1740 + remoteopts, 1781 + remoteopts,
1741 _('[OPTION]... SOURCE [DEST]'), 1782 _(b'[OPTION]... SOURCE [DEST]'),
1742 helpcategory=command.CATEGORY_REPO_CREATION, 1783 helpcategory=command.CATEGORY_REPO_CREATION,
1743 helpbasic=True, 1784 helpbasic=True,
1744 norepo=True, 1785 norepo=True,
1745 ) 1786 )
1746 def clone(ui, source, dest=None, **opts): 1787 def clone(ui, source, dest=None, **opts):
1850 See :hg:`help urls` for details on specifying URLs. 1891 See :hg:`help urls` for details on specifying URLs.
1851 1892
1852 Returns 0 on success. 1893 Returns 0 on success.
1853 """ 1894 """
1854 opts = pycompat.byteskwargs(opts) 1895 opts = pycompat.byteskwargs(opts)
1855 if opts.get('noupdate') and opts.get('updaterev'): 1896 if opts.get(b'noupdate') and opts.get(b'updaterev'):
1856 raise error.Abort(_("cannot specify both --noupdate and --updaterev")) 1897 raise error.Abort(_(b"cannot specify both --noupdate and --updaterev"))
1857 1898
1858 # --include/--exclude can come from narrow or sparse. 1899 # --include/--exclude can come from narrow or sparse.
1859 includepats, excludepats = None, None 1900 includepats, excludepats = None, None
1860 1901
1861 # hg.clone() differentiates between None and an empty set. So make sure 1902 # hg.clone() differentiates between None and an empty set. So make sure
1862 # patterns are sets if narrow is requested without patterns. 1903 # patterns are sets if narrow is requested without patterns.
1863 if opts.get('narrow'): 1904 if opts.get(b'narrow'):
1864 includepats = set() 1905 includepats = set()
1865 excludepats = set() 1906 excludepats = set()
1866 1907
1867 if opts.get('include'): 1908 if opts.get(b'include'):
1868 includepats = narrowspec.parsepatterns(opts.get('include')) 1909 includepats = narrowspec.parsepatterns(opts.get(b'include'))
1869 if opts.get('exclude'): 1910 if opts.get(b'exclude'):
1870 excludepats = narrowspec.parsepatterns(opts.get('exclude')) 1911 excludepats = narrowspec.parsepatterns(opts.get(b'exclude'))
1871 1912
1872 r = hg.clone( 1913 r = hg.clone(
1873 ui, 1914 ui,
1874 opts, 1915 opts,
1875 source, 1916 source,
1876 dest, 1917 dest,
1877 pull=opts.get('pull'), 1918 pull=opts.get(b'pull'),
1878 stream=opts.get('stream') or opts.get('uncompressed'), 1919 stream=opts.get(b'stream') or opts.get(b'uncompressed'),
1879 revs=opts.get('rev'), 1920 revs=opts.get(b'rev'),
1880 update=opts.get('updaterev') or not opts.get('noupdate'), 1921 update=opts.get(b'updaterev') or not opts.get(b'noupdate'),
1881 branch=opts.get('branch'), 1922 branch=opts.get(b'branch'),
1882 shareopts=opts.get('shareopts'), 1923 shareopts=opts.get(b'shareopts'),
1883 storeincludepats=includepats, 1924 storeincludepats=includepats,
1884 storeexcludepats=excludepats, 1925 storeexcludepats=excludepats,
1885 depth=opts.get('depth') or None, 1926 depth=opts.get(b'depth') or None,
1886 ) 1927 )
1887 1928
1888 return r is None 1929 return r is None
1889 1930
1890 1931
1891 @command( 1932 @command(
1892 'commit|ci', 1933 b'commit|ci',
1893 [ 1934 [
1894 ( 1935 (
1895 'A', 1936 b'A',
1896 'addremove', 1937 b'addremove',
1897 None, 1938 None,
1898 _('mark new/missing files as added/removed before committing'), 1939 _(b'mark new/missing files as added/removed before committing'),
1899 ), 1940 ),
1900 ('', 'close-branch', None, _('mark a branch head as closed')), 1941 (b'', b'close-branch', None, _(b'mark a branch head as closed')),
1901 ('', 'amend', None, _('amend the parent of the working directory')), 1942 (b'', b'amend', None, _(b'amend the parent of the working directory')),
1902 ('s', 'secret', None, _('use the secret phase for committing')), 1943 (b's', b'secret', None, _(b'use the secret phase for committing')),
1903 ('e', 'edit', None, _('invoke editor on commit messages')), 1944 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
1904 ( 1945 (
1905 '', 1946 b'',
1906 'force-close-branch', 1947 b'force-close-branch',
1907 None, 1948 None,
1908 _('forcibly close branch from a non-head changeset (ADVANCED)'), 1949 _(b'forcibly close branch from a non-head changeset (ADVANCED)'),
1909 ), 1950 ),
1910 ('i', 'interactive', None, _('use interactive mode')), 1951 (b'i', b'interactive', None, _(b'use interactive mode')),
1911 ] 1952 ]
1912 + walkopts 1953 + walkopts
1913 + commitopts 1954 + commitopts
1914 + commitopts2 1955 + commitopts2
1915 + subrepoopts, 1956 + subrepoopts,
1916 _('[OPTION]... [FILE]...'), 1957 _(b'[OPTION]... [FILE]...'),
1917 helpcategory=command.CATEGORY_COMMITTING, 1958 helpcategory=command.CATEGORY_COMMITTING,
1918 helpbasic=True, 1959 helpbasic=True,
1919 inferrepo=True, 1960 inferrepo=True,
1920 ) 1961 )
1921 def commit(ui, repo, *pats, **opts): 1962 def commit(ui, repo, *pats, **opts):
1987 # ret can be 0 (no changes to record) or the value returned by 2028 # ret can be 0 (no changes to record) or the value returned by
1988 # commit(), 1 if nothing changed or None on success. 2029 # commit(), 1 if nothing changed or None on success.
1989 return 1 if ret == 0 else ret 2030 return 1 if ret == 0 else ret
1990 2031
1991 opts = pycompat.byteskwargs(opts) 2032 opts = pycompat.byteskwargs(opts)
1992 if opts.get('subrepos'): 2033 if opts.get(b'subrepos'):
1993 if opts.get('amend'): 2034 if opts.get(b'amend'):
1994 raise error.Abort(_('cannot amend with --subrepos')) 2035 raise error.Abort(_(b'cannot amend with --subrepos'))
1995 # Let --subrepos on the command line override config setting. 2036 # Let --subrepos on the command line override config setting.
1996 ui.setconfig('ui', 'commitsubrepos', True, 'commit') 2037 ui.setconfig(b'ui', b'commitsubrepos', True, b'commit')
1997 2038
1998 cmdutil.checkunfinished(repo, commit=True) 2039 cmdutil.checkunfinished(repo, commit=True)
1999 2040
2000 branch = repo[None].branch() 2041 branch = repo[None].branch()
2001 bheads = repo.branchheads(branch) 2042 bheads = repo.branchheads(branch)
2002 2043
2003 extra = {} 2044 extra = {}
2004 if opts.get('close_branch') or opts.get('force_close_branch'): 2045 if opts.get(b'close_branch') or opts.get(b'force_close_branch'):
2005 extra['close'] = '1' 2046 extra[b'close'] = b'1'
2006 2047
2007 if repo['.'].closesbranch(): 2048 if repo[b'.'].closesbranch():
2008 raise error.Abort( 2049 raise error.Abort(
2009 _('current revision is already a branch closing' ' head') 2050 _(b'current revision is already a branch closing' b' head')
2010 ) 2051 )
2011 elif not bheads: 2052 elif not bheads:
2012 raise error.Abort(_('branch "%s" has no heads to close') % branch) 2053 raise error.Abort(_(b'branch "%s" has no heads to close') % branch)
2013 elif ( 2054 elif (
2014 branch == repo['.'].branch() 2055 branch == repo[b'.'].branch()
2015 and repo['.'].node() not in bheads 2056 and repo[b'.'].node() not in bheads
2016 and not opts.get('force_close_branch') 2057 and not opts.get(b'force_close_branch')
2017 ): 2058 ):
2018 hint = _( 2059 hint = _(
2019 'use --force-close-branch to close branch from a non-head' 2060 b'use --force-close-branch to close branch from a non-head'
2020 ' changeset' 2061 b' changeset'
2021 ) 2062 )
2022 raise error.Abort(_('can only close branch heads'), hint=hint) 2063 raise error.Abort(_(b'can only close branch heads'), hint=hint)
2023 elif opts.get('amend'): 2064 elif opts.get(b'amend'):
2024 if ( 2065 if (
2025 repo['.'].p1().branch() != branch 2066 repo[b'.'].p1().branch() != branch
2026 and repo['.'].p2().branch() != branch 2067 and repo[b'.'].p2().branch() != branch
2027 ): 2068 ):
2028 raise error.Abort(_('can only close branch heads')) 2069 raise error.Abort(_(b'can only close branch heads'))
2029 2070
2030 if opts.get('amend'): 2071 if opts.get(b'amend'):
2031 if ui.configbool('ui', 'commitsubrepos'): 2072 if ui.configbool(b'ui', b'commitsubrepos'):
2032 raise error.Abort(_('cannot amend with ui.commitsubrepos enabled')) 2073 raise error.Abort(_(b'cannot amend with ui.commitsubrepos enabled'))
2033 2074
2034 old = repo['.'] 2075 old = repo[b'.']
2035 rewriteutil.precheck(repo, [old.rev()], 'amend') 2076 rewriteutil.precheck(repo, [old.rev()], b'amend')
2036 2077
2037 # Currently histedit gets confused if an amend happens while histedit 2078 # Currently histedit gets confused if an amend happens while histedit
2038 # is in progress. Since we have a checkunfinished command, we are 2079 # is in progress. Since we have a checkunfinished command, we are
2039 # temporarily honoring it. 2080 # temporarily honoring it.
2040 # 2081 #
2043 if not obsolete.isenabled(repo, obsolete.createmarkersopt): 2084 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2044 cmdutil.checkunfinished(repo) 2085 cmdutil.checkunfinished(repo)
2045 2086
2046 node = cmdutil.amend(ui, repo, old, extra, pats, opts) 2087 node = cmdutil.amend(ui, repo, old, extra, pats, opts)
2047 if node == old.node(): 2088 if node == old.node():
2048 ui.status(_("nothing changed\n")) 2089 ui.status(_(b"nothing changed\n"))
2049 return 1 2090 return 1
2050 else: 2091 else:
2051 2092
2052 def commitfunc(ui, repo, message, match, opts): 2093 def commitfunc(ui, repo, message, match, opts):
2053 overrides = {} 2094 overrides = {}
2054 if opts.get('secret'): 2095 if opts.get(b'secret'):
2055 overrides[('phases', 'new-commit')] = 'secret' 2096 overrides[(b'phases', b'new-commit')] = b'secret'
2056 2097
2057 baseui = repo.baseui 2098 baseui = repo.baseui
2058 with baseui.configoverride(overrides, 'commit'): 2099 with baseui.configoverride(overrides, b'commit'):
2059 with ui.configoverride(overrides, 'commit'): 2100 with ui.configoverride(overrides, b'commit'):
2060 editform = cmdutil.mergeeditform( 2101 editform = cmdutil.mergeeditform(
2061 repo[None], 'commit.normal' 2102 repo[None], b'commit.normal'
2062 ) 2103 )
2063 editor = cmdutil.getcommiteditor( 2104 editor = cmdutil.getcommiteditor(
2064 editform=editform, **pycompat.strkwargs(opts) 2105 editform=editform, **pycompat.strkwargs(opts)
2065 ) 2106 )
2066 return repo.commit( 2107 return repo.commit(
2067 message, 2108 message,
2068 opts.get('user'), 2109 opts.get(b'user'),
2069 opts.get('date'), 2110 opts.get(b'date'),
2070 match, 2111 match,
2071 editor=editor, 2112 editor=editor,
2072 extra=extra, 2113 extra=extra,
2073 ) 2114 )
2074 2115
2077 if not node: 2118 if not node:
2078 stat = cmdutil.postcommitstatus(repo, pats, opts) 2119 stat = cmdutil.postcommitstatus(repo, pats, opts)
2079 if stat[3]: 2120 if stat[3]:
2080 ui.status( 2121 ui.status(
2081 _( 2122 _(
2082 "nothing changed (%d missing files, see " 2123 b"nothing changed (%d missing files, see "
2083 "'hg status')\n" 2124 b"'hg status')\n"
2084 ) 2125 )
2085 % len(stat[3]) 2126 % len(stat[3])
2086 ) 2127 )
2087 else: 2128 else:
2088 ui.status(_("nothing changed\n")) 2129 ui.status(_(b"nothing changed\n"))
2089 return 1 2130 return 1
2090 2131
2091 cmdutil.commitstatus(repo, node, branch, bheads, opts) 2132 cmdutil.commitstatus(repo, node, branch, bheads, opts)
2092 2133
2093 if not ui.quiet and ui.configbool('commands', 'commit.post-status'): 2134 if not ui.quiet and ui.configbool(b'commands', b'commit.post-status'):
2094 status( 2135 status(
2095 ui, 2136 ui,
2096 repo, 2137 repo,
2097 modified=True, 2138 modified=True,
2098 added=True, 2139 added=True,
2099 removed=True, 2140 removed=True,
2100 deleted=True, 2141 deleted=True,
2101 unknown=True, 2142 unknown=True,
2102 subrepos=opts.get('subrepos'), 2143 subrepos=opts.get(b'subrepos'),
2103 ) 2144 )
2104 2145
2105 2146
2106 @command( 2147 @command(
2107 'config|showconfig|debugconfig', 2148 b'config|showconfig|debugconfig',
2108 [ 2149 [
2109 ('u', 'untrusted', None, _('show untrusted configuration options')), 2150 (b'u', b'untrusted', None, _(b'show untrusted configuration options')),
2110 ('e', 'edit', None, _('edit user config')), 2151 (b'e', b'edit', None, _(b'edit user config')),
2111 ('l', 'local', None, _('edit repository config')), 2152 (b'l', b'local', None, _(b'edit repository config')),
2112 ('g', 'global', None, _('edit global config')), 2153 (b'g', b'global', None, _(b'edit global config')),
2113 ] 2154 ]
2114 + formatteropts, 2155 + formatteropts,
2115 _('[-u] [NAME]...'), 2156 _(b'[-u] [NAME]...'),
2116 helpcategory=command.CATEGORY_HELP, 2157 helpcategory=command.CATEGORY_HELP,
2117 optionalrepo=True, 2158 optionalrepo=True,
2118 intents={INTENT_READONLY}, 2159 intents={INTENT_READONLY},
2119 ) 2160 )
2120 def config(ui, repo, *values, **opts): 2161 def config(ui, repo, *values, **opts):
2150 Returns 0 on success, 1 if NAME does not exist. 2191 Returns 0 on success, 1 if NAME does not exist.
2151 2192
2152 """ 2193 """
2153 2194
2154 opts = pycompat.byteskwargs(opts) 2195 opts = pycompat.byteskwargs(opts)
2155 if opts.get('edit') or opts.get('local') or opts.get('global'): 2196 if opts.get(b'edit') or opts.get(b'local') or opts.get(b'global'):
2156 if opts.get('local') and opts.get('global'): 2197 if opts.get(b'local') and opts.get(b'global'):
2157 raise error.Abort(_("can't use --local and --global together")) 2198 raise error.Abort(_(b"can't use --local and --global together"))
2158 2199
2159 if opts.get('local'): 2200 if opts.get(b'local'):
2160 if not repo: 2201 if not repo:
2161 raise error.Abort(_("can't use --local outside a repository")) 2202 raise error.Abort(_(b"can't use --local outside a repository"))
2162 paths = [repo.vfs.join('hgrc')] 2203 paths = [repo.vfs.join(b'hgrc')]
2163 elif opts.get('global'): 2204 elif opts.get(b'global'):
2164 paths = rcutil.systemrcpath() 2205 paths = rcutil.systemrcpath()
2165 else: 2206 else:
2166 paths = rcutil.userrcpath() 2207 paths = rcutil.userrcpath()
2167 2208
2168 for f in paths: 2209 for f in paths:
2169 if os.path.exists(f): 2210 if os.path.exists(f):
2170 break 2211 break
2171 else: 2212 else:
2172 if opts.get('global'): 2213 if opts.get(b'global'):
2173 samplehgrc = uimod.samplehgrcs['global'] 2214 samplehgrc = uimod.samplehgrcs[b'global']
2174 elif opts.get('local'): 2215 elif opts.get(b'local'):
2175 samplehgrc = uimod.samplehgrcs['local'] 2216 samplehgrc = uimod.samplehgrcs[b'local']
2176 else: 2217 else:
2177 samplehgrc = uimod.samplehgrcs['user'] 2218 samplehgrc = uimod.samplehgrcs[b'user']
2178 2219
2179 f = paths[0] 2220 f = paths[0]
2180 fp = open(f, "wb") 2221 fp = open(f, b"wb")
2181 fp.write(util.tonativeeol(samplehgrc)) 2222 fp.write(util.tonativeeol(samplehgrc))
2182 fp.close() 2223 fp.close()
2183 2224
2184 editor = ui.geteditor() 2225 editor = ui.geteditor()
2185 ui.system( 2226 ui.system(
2186 "%s \"%s\"" % (editor, f), 2227 b"%s \"%s\"" % (editor, f),
2187 onerr=error.Abort, 2228 onerr=error.Abort,
2188 errprefix=_("edit failed"), 2229 errprefix=_(b"edit failed"),
2189 blockedtag='config_edit', 2230 blockedtag=b'config_edit',
2190 ) 2231 )
2191 return 2232 return
2192 ui.pager('config') 2233 ui.pager(b'config')
2193 fm = ui.formatter('config', opts) 2234 fm = ui.formatter(b'config', opts)
2194 for t, f in rcutil.rccomponents(): 2235 for t, f in rcutil.rccomponents():
2195 if t == 'path': 2236 if t == b'path':
2196 ui.debug('read config from: %s\n' % f) 2237 ui.debug(b'read config from: %s\n' % f)
2197 elif t == 'items': 2238 elif t == b'items':
2198 for section, name, value, source in f: 2239 for section, name, value, source in f:
2199 ui.debug('set config by: %s\n' % source) 2240 ui.debug(b'set config by: %s\n' % source)
2200 else: 2241 else:
2201 raise error.ProgrammingError('unknown rctype: %s' % t) 2242 raise error.ProgrammingError(b'unknown rctype: %s' % t)
2202 untrusted = bool(opts.get('untrusted')) 2243 untrusted = bool(opts.get(b'untrusted'))
2203 2244
2204 selsections = selentries = [] 2245 selsections = selentries = []
2205 if values: 2246 if values:
2206 selsections = [v for v in values if '.' not in v] 2247 selsections = [v for v in values if b'.' not in v]
2207 selentries = [v for v in values if '.' in v] 2248 selentries = [v for v in values if b'.' in v]
2208 uniquesel = len(selentries) == 1 and not selsections 2249 uniquesel = len(selentries) == 1 and not selsections
2209 selsections = set(selsections) 2250 selsections = set(selsections)
2210 selentries = set(selentries) 2251 selentries = set(selentries)
2211 2252
2212 matched = False 2253 matched = False
2213 for section, name, value in ui.walkconfig(untrusted=untrusted): 2254 for section, name, value in ui.walkconfig(untrusted=untrusted):
2214 source = ui.configsource(section, name, untrusted) 2255 source = ui.configsource(section, name, untrusted)
2215 value = pycompat.bytestr(value) 2256 value = pycompat.bytestr(value)
2216 defaultvalue = ui.configdefault(section, name) 2257 defaultvalue = ui.configdefault(section, name)
2217 if fm.isplain(): 2258 if fm.isplain():
2218 source = source or 'none' 2259 source = source or b'none'
2219 value = value.replace('\n', '\\n') 2260 value = value.replace(b'\n', b'\\n')
2220 entryname = section + '.' + name 2261 entryname = section + b'.' + name
2221 if values and not (section in selsections or entryname in selentries): 2262 if values and not (section in selsections or entryname in selentries):
2222 continue 2263 continue
2223 fm.startitem() 2264 fm.startitem()
2224 fm.condwrite(ui.debugflag, 'source', '%s: ', source) 2265 fm.condwrite(ui.debugflag, b'source', b'%s: ', source)
2225 if uniquesel: 2266 if uniquesel:
2226 fm.data(name=entryname) 2267 fm.data(name=entryname)
2227 fm.write('value', '%s\n', value) 2268 fm.write(b'value', b'%s\n', value)
2228 else: 2269 else:
2229 fm.write('name value', '%s=%s\n', entryname, value) 2270 fm.write(b'name value', b'%s=%s\n', entryname, value)
2230 fm.data(defaultvalue=defaultvalue) 2271 fm.data(defaultvalue=defaultvalue)
2231 matched = True 2272 matched = True
2232 fm.end() 2273 fm.end()
2233 if matched: 2274 if matched:
2234 return 0 2275 return 0
2235 return 1 2276 return 1
2236 2277
2237 2278
2238 @command( 2279 @command(
2239 'continue', 2280 b'continue',
2240 dryrunopts, 2281 dryrunopts,
2241 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT, 2282 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2242 helpbasic=True, 2283 helpbasic=True,
2243 ) 2284 )
2244 def continuecmd(ui, repo, **opts): 2285 def continuecmd(ui, repo, **opts):
2250 use --dry-run/-n to dry run the command. 2291 use --dry-run/-n to dry run the command.
2251 """ 2292 """
2252 dryrun = opts.get(r'dry_run') 2293 dryrun = opts.get(r'dry_run')
2253 contstate = cmdutil.getunfinishedstate(repo) 2294 contstate = cmdutil.getunfinishedstate(repo)
2254 if not contstate: 2295 if not contstate:
2255 raise error.Abort(_('no operation in progress')) 2296 raise error.Abort(_(b'no operation in progress'))
2256 if not contstate.continuefunc: 2297 if not contstate.continuefunc:
2257 raise error.Abort( 2298 raise error.Abort(
2258 ( 2299 (
2259 _("%s in progress but does not support " "'hg continue'") 2300 _(b"%s in progress but does not support " b"'hg continue'")
2260 % (contstate._opname) 2301 % (contstate._opname)
2261 ), 2302 ),
2262 hint=contstate.continuemsg(), 2303 hint=contstate.continuemsg(),
2263 ) 2304 )
2264 if dryrun: 2305 if dryrun:
2265 ui.status(_('%s in progress, will be resumed\n') % (contstate._opname)) 2306 ui.status(_(b'%s in progress, will be resumed\n') % (contstate._opname))
2266 return 2307 return
2267 return contstate.continuefunc(ui, repo) 2308 return contstate.continuefunc(ui, repo)
2268 2309
2269 2310
2270 @command( 2311 @command(
2271 'copy|cp', 2312 b'copy|cp',
2272 [ 2313 [
2273 ('A', 'after', None, _('record a copy that has already occurred')), 2314 (b'A', b'after', None, _(b'record a copy that has already occurred')),
2274 ('f', 'force', None, _('forcibly copy over an existing managed file')), 2315 (
2316 b'f',
2317 b'force',
2318 None,
2319 _(b'forcibly copy over an existing managed file'),
2320 ),
2275 ] 2321 ]
2276 + walkopts 2322 + walkopts
2277 + dryrunopts, 2323 + dryrunopts,
2278 _('[OPTION]... SOURCE... DEST'), 2324 _(b'[OPTION]... SOURCE... DEST'),
2279 helpcategory=command.CATEGORY_FILE_CONTENTS, 2325 helpcategory=command.CATEGORY_FILE_CONTENTS,
2280 ) 2326 )
2281 def copy(ui, repo, *pats, **opts): 2327 def copy(ui, repo, *pats, **opts):
2282 """mark files as copied for the next commit 2328 """mark files as copied for the next commit
2283 2329
2298 with repo.wlock(False): 2344 with repo.wlock(False):
2299 return cmdutil.copy(ui, repo, pats, opts) 2345 return cmdutil.copy(ui, repo, pats, opts)
2300 2346
2301 2347
2302 @command( 2348 @command(
2303 'debugcommands', 2349 b'debugcommands',
2304 [], 2350 [],
2305 _('[COMMAND]'), 2351 _(b'[COMMAND]'),
2306 helpcategory=command.CATEGORY_HELP, 2352 helpcategory=command.CATEGORY_HELP,
2307 norepo=True, 2353 norepo=True,
2308 ) 2354 )
2309 def debugcommands(ui, cmd='', *args): 2355 def debugcommands(ui, cmd=b'', *args):
2310 """list all available commands and options""" 2356 """list all available commands and options"""
2311 for cmd, vals in sorted(table.iteritems()): 2357 for cmd, vals in sorted(table.iteritems()):
2312 cmd = cmd.split('|')[0] 2358 cmd = cmd.split(b'|')[0]
2313 opts = ', '.join([i[1] for i in vals[1]]) 2359 opts = b', '.join([i[1] for i in vals[1]])
2314 ui.write('%s: %s\n' % (cmd, opts)) 2360 ui.write(b'%s: %s\n' % (cmd, opts))
2315 2361
2316 2362
2317 @command( 2363 @command(
2318 'debugcomplete', 2364 b'debugcomplete',
2319 [('o', 'options', None, _('show the command options'))], 2365 [(b'o', b'options', None, _(b'show the command options'))],
2320 _('[-o] CMD'), 2366 _(b'[-o] CMD'),
2321 helpcategory=command.CATEGORY_HELP, 2367 helpcategory=command.CATEGORY_HELP,
2322 norepo=True, 2368 norepo=True,
2323 ) 2369 )
2324 def debugcomplete(ui, cmd='', **opts): 2370 def debugcomplete(ui, cmd=b'', **opts):
2325 """returns the completion list associated with the given command""" 2371 """returns the completion list associated with the given command"""
2326 2372
2327 if opts.get(r'options'): 2373 if opts.get(r'options'):
2328 options = [] 2374 options = []
2329 otables = [globalopts] 2375 otables = [globalopts]
2330 if cmd: 2376 if cmd:
2331 aliases, entry = cmdutil.findcmd(cmd, table, False) 2377 aliases, entry = cmdutil.findcmd(cmd, table, False)
2332 otables.append(entry[1]) 2378 otables.append(entry[1])
2333 for t in otables: 2379 for t in otables:
2334 for o in t: 2380 for o in t:
2335 if "(DEPRECATED)" in o[3]: 2381 if b"(DEPRECATED)" in o[3]:
2336 continue 2382 continue
2337 if o[0]: 2383 if o[0]:
2338 options.append('-%s' % o[0]) 2384 options.append(b'-%s' % o[0])
2339 options.append('--%s' % o[1]) 2385 options.append(b'--%s' % o[1])
2340 ui.write("%s\n" % "\n".join(options)) 2386 ui.write(b"%s\n" % b"\n".join(options))
2341 return 2387 return
2342 2388
2343 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table) 2389 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table)
2344 if ui.verbose: 2390 if ui.verbose:
2345 cmdlist = [' '.join(c[0]) for c in cmdlist.values()] 2391 cmdlist = [b' '.join(c[0]) for c in cmdlist.values()]
2346 ui.write("%s\n" % "\n".join(sorted(cmdlist))) 2392 ui.write(b"%s\n" % b"\n".join(sorted(cmdlist)))
2347 2393
2348 2394
2349 @command( 2395 @command(
2350 'diff', 2396 b'diff',
2351 [ 2397 [
2352 ('r', 'rev', [], _('revision'), _('REV')), 2398 (b'r', b'rev', [], _(b'revision'), _(b'REV')),
2353 ('c', 'change', '', _('change made by revision'), _('REV')), 2399 (b'c', b'change', b'', _(b'change made by revision'), _(b'REV')),
2354 ] 2400 ]
2355 + diffopts 2401 + diffopts
2356 + diffopts2 2402 + diffopts2
2357 + walkopts 2403 + walkopts
2358 + subrepoopts, 2404 + subrepoopts,
2359 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'), 2405 _(b'[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'),
2360 helpcategory=command.CATEGORY_FILE_CONTENTS, 2406 helpcategory=command.CATEGORY_FILE_CONTENTS,
2361 helpbasic=True, 2407 helpbasic=True,
2362 inferrepo=True, 2408 inferrepo=True,
2363 intents={INTENT_READONLY}, 2409 intents={INTENT_READONLY},
2364 ) 2410 )
2419 2465
2420 Returns 0 on success. 2466 Returns 0 on success.
2421 """ 2467 """
2422 2468
2423 opts = pycompat.byteskwargs(opts) 2469 opts = pycompat.byteskwargs(opts)
2424 revs = opts.get('rev') 2470 revs = opts.get(b'rev')
2425 change = opts.get('change') 2471 change = opts.get(b'change')
2426 stat = opts.get('stat') 2472 stat = opts.get(b'stat')
2427 reverse = opts.get('reverse') 2473 reverse = opts.get(b'reverse')
2428 2474
2429 if revs and change: 2475 if revs and change:
2430 msg = _('cannot specify --rev and --change at the same time') 2476 msg = _(b'cannot specify --rev and --change at the same time')
2431 raise error.Abort(msg) 2477 raise error.Abort(msg)
2432 elif change: 2478 elif change:
2433 repo = scmutil.unhidehashlikerevs(repo, [change], 'nowarn') 2479 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
2434 ctx2 = scmutil.revsingle(repo, change, None) 2480 ctx2 = scmutil.revsingle(repo, change, None)
2435 ctx1 = ctx2.p1() 2481 ctx1 = ctx2.p1()
2436 else: 2482 else:
2437 repo = scmutil.unhidehashlikerevs(repo, revs, 'nowarn') 2483 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
2438 ctx1, ctx2 = scmutil.revpair(repo, revs) 2484 ctx1, ctx2 = scmutil.revpair(repo, revs)
2439 node1, node2 = ctx1.node(), ctx2.node() 2485 node1, node2 = ctx1.node(), ctx2.node()
2440 2486
2441 if reverse: 2487 if reverse:
2442 node1, node2 = node2, node1 2488 node1, node2 = node2, node1
2443 2489
2444 diffopts = patch.diffallopts(ui, opts) 2490 diffopts = patch.diffallopts(ui, opts)
2445 m = scmutil.match(ctx2, pats, opts) 2491 m = scmutil.match(ctx2, pats, opts)
2446 m = repo.narrowmatch(m) 2492 m = repo.narrowmatch(m)
2447 ui.pager('diff') 2493 ui.pager(b'diff')
2448 logcmdutil.diffordiffstat( 2494 logcmdutil.diffordiffstat(
2449 ui, 2495 ui,
2450 repo, 2496 repo,
2451 diffopts, 2497 diffopts,
2452 node1, 2498 node1,
2453 node2, 2499 node2,
2454 m, 2500 m,
2455 stat=stat, 2501 stat=stat,
2456 listsubrepos=opts.get('subrepos'), 2502 listsubrepos=opts.get(b'subrepos'),
2457 root=opts.get('root'), 2503 root=opts.get(b'root'),
2458 ) 2504 )
2459 2505
2460 2506
2461 @command( 2507 @command(
2462 'export', 2508 b'export',
2463 [ 2509 [
2464 ( 2510 (
2465 'B', 2511 b'B',
2466 'bookmark', 2512 b'bookmark',
2467 '', 2513 b'',
2468 _('export changes only reachable by given bookmark'), 2514 _(b'export changes only reachable by given bookmark'),
2469 _('BOOKMARK'), 2515 _(b'BOOKMARK'),
2470 ), 2516 ),
2471 ( 2517 (
2472 'o', 2518 b'o',
2473 'output', 2519 b'output',
2474 '', 2520 b'',
2475 _('print output to file with formatted name'), 2521 _(b'print output to file with formatted name'),
2476 _('FORMAT'), 2522 _(b'FORMAT'),
2477 ), 2523 ),
2478 ('', 'switch-parent', None, _('diff against the second parent')), 2524 (b'', b'switch-parent', None, _(b'diff against the second parent')),
2479 ('r', 'rev', [], _('revisions to export'), _('REV')), 2525 (b'r', b'rev', [], _(b'revisions to export'), _(b'REV')),
2480 ] 2526 ]
2481 + diffopts 2527 + diffopts
2482 + formatteropts, 2528 + formatteropts,
2483 _('[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'), 2529 _(b'[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'),
2484 helpcategory=command.CATEGORY_IMPORT_EXPORT, 2530 helpcategory=command.CATEGORY_IMPORT_EXPORT,
2485 helpbasic=True, 2531 helpbasic=True,
2486 intents={INTENT_READONLY}, 2532 intents={INTENT_READONLY},
2487 ) 2533 )
2488 def export(ui, repo, *changesets, **opts): 2534 def export(ui, repo, *changesets, **opts):
2558 hg export -r "outgoing()" -o "%n-%m.patch" 2604 hg export -r "outgoing()" -o "%n-%m.patch"
2559 2605
2560 Returns 0 on success. 2606 Returns 0 on success.
2561 """ 2607 """
2562 opts = pycompat.byteskwargs(opts) 2608 opts = pycompat.byteskwargs(opts)
2563 bookmark = opts.get('bookmark') 2609 bookmark = opts.get(b'bookmark')
2564 changesets += tuple(opts.get('rev', [])) 2610 changesets += tuple(opts.get(b'rev', []))
2565 2611
2566 if bookmark and changesets: 2612 if bookmark and changesets:
2567 raise error.Abort(_("-r and -B are mutually exclusive")) 2613 raise error.Abort(_(b"-r and -B are mutually exclusive"))
2568 2614
2569 if bookmark: 2615 if bookmark:
2570 if bookmark not in repo._bookmarks: 2616 if bookmark not in repo._bookmarks:
2571 raise error.Abort(_("bookmark '%s' not found") % bookmark) 2617 raise error.Abort(_(b"bookmark '%s' not found") % bookmark)
2572 2618
2573 revs = scmutil.bookmarkrevs(repo, bookmark) 2619 revs = scmutil.bookmarkrevs(repo, bookmark)
2574 else: 2620 else:
2575 if not changesets: 2621 if not changesets:
2576 changesets = ['.'] 2622 changesets = [b'.']
2577 2623
2578 repo = scmutil.unhidehashlikerevs(repo, changesets, 'nowarn') 2624 repo = scmutil.unhidehashlikerevs(repo, changesets, b'nowarn')
2579 revs = scmutil.revrange(repo, changesets) 2625 revs = scmutil.revrange(repo, changesets)
2580 2626
2581 if not revs: 2627 if not revs:
2582 raise error.Abort(_("export requires at least one changeset")) 2628 raise error.Abort(_(b"export requires at least one changeset"))
2583 if len(revs) > 1: 2629 if len(revs) > 1:
2584 ui.note(_('exporting patches:\n')) 2630 ui.note(_(b'exporting patches:\n'))
2585 else: 2631 else:
2586 ui.note(_('exporting patch:\n')) 2632 ui.note(_(b'exporting patch:\n'))
2587 2633
2588 fntemplate = opts.get('output') 2634 fntemplate = opts.get(b'output')
2589 if cmdutil.isstdiofilename(fntemplate): 2635 if cmdutil.isstdiofilename(fntemplate):
2590 fntemplate = '' 2636 fntemplate = b''
2591 2637
2592 if fntemplate: 2638 if fntemplate:
2593 fm = formatter.nullformatter(ui, 'export', opts) 2639 fm = formatter.nullformatter(ui, b'export', opts)
2594 else: 2640 else:
2595 ui.pager('export') 2641 ui.pager(b'export')
2596 fm = ui.formatter('export', opts) 2642 fm = ui.formatter(b'export', opts)
2597 with fm: 2643 with fm:
2598 cmdutil.export( 2644 cmdutil.export(
2599 repo, 2645 repo,
2600 revs, 2646 revs,
2601 fm, 2647 fm,
2602 fntemplate=fntemplate, 2648 fntemplate=fntemplate,
2603 switch_parent=opts.get('switch_parent'), 2649 switch_parent=opts.get(b'switch_parent'),
2604 opts=patch.diffallopts(ui, opts), 2650 opts=patch.diffallopts(ui, opts),
2605 ) 2651 )
2606 2652
2607 2653
2608 @command( 2654 @command(
2609 'files', 2655 b'files',
2610 [ 2656 [
2611 ('r', 'rev', '', _('search the repository as it is in REV'), _('REV')), 2657 (
2612 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')), 2658 b'r',
2659 b'rev',
2660 b'',
2661 _(b'search the repository as it is in REV'),
2662 _(b'REV'),
2663 ),
2664 (
2665 b'0',
2666 b'print0',
2667 None,
2668 _(b'end filenames with NUL, for use with xargs'),
2669 ),
2613 ] 2670 ]
2614 + walkopts 2671 + walkopts
2615 + formatteropts 2672 + formatteropts
2616 + subrepoopts, 2673 + subrepoopts,
2617 _('[OPTION]... [FILE]...'), 2674 _(b'[OPTION]... [FILE]...'),
2618 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 2675 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2619 intents={INTENT_READONLY}, 2676 intents={INTENT_READONLY},
2620 ) 2677 )
2621 def files(ui, repo, *pats, **opts): 2678 def files(ui, repo, *pats, **opts):
2622 """list tracked files 2679 """list tracked files
2671 Returns 0 if a match is found, 1 otherwise. 2728 Returns 0 if a match is found, 1 otherwise.
2672 2729
2673 """ 2730 """
2674 2731
2675 opts = pycompat.byteskwargs(opts) 2732 opts = pycompat.byteskwargs(opts)
2676 rev = opts.get('rev') 2733 rev = opts.get(b'rev')
2677 if rev: 2734 if rev:
2678 repo = scmutil.unhidehashlikerevs(repo, [rev], 'nowarn') 2735 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
2679 ctx = scmutil.revsingle(repo, rev, None) 2736 ctx = scmutil.revsingle(repo, rev, None)
2680 2737
2681 end = '\n' 2738 end = b'\n'
2682 if opts.get('print0'): 2739 if opts.get(b'print0'):
2683 end = '\0' 2740 end = b'\0'
2684 fmt = '%s' + end 2741 fmt = b'%s' + end
2685 2742
2686 m = scmutil.match(ctx, pats, opts) 2743 m = scmutil.match(ctx, pats, opts)
2687 ui.pager('files') 2744 ui.pager(b'files')
2688 uipathfn = scmutil.getuipathfn(ctx.repo(), legacyrelativevalue=True) 2745 uipathfn = scmutil.getuipathfn(ctx.repo(), legacyrelativevalue=True)
2689 with ui.formatter('files', opts) as fm: 2746 with ui.formatter(b'files', opts) as fm:
2690 return cmdutil.files( 2747 return cmdutil.files(
2691 ui, ctx, m, uipathfn, fm, fmt, opts.get('subrepos') 2748 ui, ctx, m, uipathfn, fm, fmt, opts.get(b'subrepos')
2692 ) 2749 )
2693 2750
2694 2751
2695 @command( 2752 @command(
2696 'forget', 2753 b'forget',
2697 [('i', 'interactive', None, _('use interactive mode')),] 2754 [(b'i', b'interactive', None, _(b'use interactive mode')),]
2698 + walkopts 2755 + walkopts
2699 + dryrunopts, 2756 + dryrunopts,
2700 _('[OPTION]... FILE...'), 2757 _(b'[OPTION]... FILE...'),
2701 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 2758 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2702 helpbasic=True, 2759 helpbasic=True,
2703 inferrepo=True, 2760 inferrepo=True,
2704 ) 2761 )
2705 def forget(ui, repo, *pats, **opts): 2762 def forget(ui, repo, *pats, **opts):
2731 Returns 0 on success. 2788 Returns 0 on success.
2732 """ 2789 """
2733 2790
2734 opts = pycompat.byteskwargs(opts) 2791 opts = pycompat.byteskwargs(opts)
2735 if not pats: 2792 if not pats:
2736 raise error.Abort(_('no files specified')) 2793 raise error.Abort(_(b'no files specified'))
2737 2794
2738 m = scmutil.match(repo[None], pats, opts) 2795 m = scmutil.match(repo[None], pats, opts)
2739 dryrun, interactive = opts.get('dry_run'), opts.get('interactive') 2796 dryrun, interactive = opts.get(b'dry_run'), opts.get(b'interactive')
2740 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True) 2797 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
2741 rejected = cmdutil.forget( 2798 rejected = cmdutil.forget(
2742 ui, 2799 ui,
2743 repo, 2800 repo,
2744 m, 2801 m,
2745 prefix="", 2802 prefix=b"",
2746 uipathfn=uipathfn, 2803 uipathfn=uipathfn,
2747 explicitonly=False, 2804 explicitonly=False,
2748 dryrun=dryrun, 2805 dryrun=dryrun,
2749 interactive=interactive, 2806 interactive=interactive,
2750 )[0] 2807 )[0]
2751 return rejected and 1 or 0 2808 return rejected and 1 or 0
2752 2809
2753 2810
2754 @command( 2811 @command(
2755 'graft', 2812 b'graft',
2756 [ 2813 [
2757 ('r', 'rev', [], _('revisions to graft'), _('REV')), 2814 (b'r', b'rev', [], _(b'revisions to graft'), _(b'REV')),
2758 ( 2815 (
2759 '', 2816 b'',
2760 'base', 2817 b'base',
2761 '', 2818 b'',
2762 _('base revision when doing the graft merge (ADVANCED)'), 2819 _(b'base revision when doing the graft merge (ADVANCED)'),
2763 _('REV'), 2820 _(b'REV'),
2764 ), 2821 ),
2765 ('c', 'continue', False, _('resume interrupted graft')), 2822 (b'c', b'continue', False, _(b'resume interrupted graft')),
2766 ('', 'stop', False, _('stop interrupted graft')), 2823 (b'', b'stop', False, _(b'stop interrupted graft')),
2767 ('', 'abort', False, _('abort interrupted graft')), 2824 (b'', b'abort', False, _(b'abort interrupted graft')),
2768 ('e', 'edit', False, _('invoke editor on commit messages')), 2825 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
2769 ('', 'log', None, _('append graft info to log message')), 2826 (b'', b'log', None, _(b'append graft info to log message')),
2770 ( 2827 (
2771 '', 2828 b'',
2772 'no-commit', 2829 b'no-commit',
2773 None, 2830 None,
2774 _("don't commit, just apply the changes in working directory"), 2831 _(b"don't commit, just apply the changes in working directory"),
2775 ), 2832 ),
2776 ('f', 'force', False, _('force graft')), 2833 (b'f', b'force', False, _(b'force graft')),
2777 ( 2834 (
2778 'D', 2835 b'D',
2779 'currentdate', 2836 b'currentdate',
2780 False, 2837 False,
2781 _('record the current date as commit date'), 2838 _(b'record the current date as commit date'),
2782 ), 2839 ),
2783 ('U', 'currentuser', False, _('record the current user as committer')), 2840 (
2841 b'U',
2842 b'currentuser',
2843 False,
2844 _(b'record the current user as committer'),
2845 ),
2784 ] 2846 ]
2785 + commitopts2 2847 + commitopts2
2786 + mergetoolopts 2848 + mergetoolopts
2787 + dryrunopts, 2849 + dryrunopts,
2788 _('[OPTION]... [-r REV]... REV...'), 2850 _(b'[OPTION]... [-r REV]... REV...'),
2789 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT, 2851 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2790 ) 2852 )
2791 def graft(ui, repo, *revs, **opts): 2853 def graft(ui, repo, *revs, **opts):
2792 '''copy changes from other branches onto the current branch 2854 '''copy changes from other branches onto the current branch
2793 2855
2887 return _dograft(ui, repo, *revs, **opts) 2949 return _dograft(ui, repo, *revs, **opts)
2888 2950
2889 2951
2890 def _dograft(ui, repo, *revs, **opts): 2952 def _dograft(ui, repo, *revs, **opts):
2891 opts = pycompat.byteskwargs(opts) 2953 opts = pycompat.byteskwargs(opts)
2892 if revs and opts.get('rev'): 2954 if revs and opts.get(b'rev'):
2893 ui.warn( 2955 ui.warn(
2894 _( 2956 _(
2895 'warning: inconsistent use of --rev might give unexpected ' 2957 b'warning: inconsistent use of --rev might give unexpected '
2896 'revision ordering!\n' 2958 b'revision ordering!\n'
2897 ) 2959 )
2898 ) 2960 )
2899 2961
2900 revs = list(revs) 2962 revs = list(revs)
2901 revs.extend(opts.get('rev')) 2963 revs.extend(opts.get(b'rev'))
2902 basectx = None 2964 basectx = None
2903 if opts.get('base'): 2965 if opts.get(b'base'):
2904 basectx = scmutil.revsingle(repo, opts['base'], None) 2966 basectx = scmutil.revsingle(repo, opts[b'base'], None)
2905 # a dict of data to be stored in state file 2967 # a dict of data to be stored in state file
2906 statedata = {} 2968 statedata = {}
2907 # list of new nodes created by ongoing graft 2969 # list of new nodes created by ongoing graft
2908 statedata['newnodes'] = [] 2970 statedata[b'newnodes'] = []
2909 2971
2910 if opts.get('user') and opts.get('currentuser'): 2972 if opts.get(b'user') and opts.get(b'currentuser'):
2911 raise error.Abort(_('--user and --currentuser are mutually exclusive')) 2973 raise error.Abort(_(b'--user and --currentuser are mutually exclusive'))
2912 if opts.get('date') and opts.get('currentdate'): 2974 if opts.get(b'date') and opts.get(b'currentdate'):
2913 raise error.Abort(_('--date and --currentdate are mutually exclusive')) 2975 raise error.Abort(_(b'--date and --currentdate are mutually exclusive'))
2914 if not opts.get('user') and opts.get('currentuser'): 2976 if not opts.get(b'user') and opts.get(b'currentuser'):
2915 opts['user'] = ui.username() 2977 opts[b'user'] = ui.username()
2916 if not opts.get('date') and opts.get('currentdate'): 2978 if not opts.get(b'date') and opts.get(b'currentdate'):
2917 opts['date'] = "%d %d" % dateutil.makedate() 2979 opts[b'date'] = b"%d %d" % dateutil.makedate()
2918 2980
2919 editor = cmdutil.getcommiteditor( 2981 editor = cmdutil.getcommiteditor(
2920 editform='graft', **pycompat.strkwargs(opts) 2982 editform=b'graft', **pycompat.strkwargs(opts)
2921 ) 2983 )
2922 2984
2923 cont = False 2985 cont = False
2924 if opts.get('no_commit'): 2986 if opts.get(b'no_commit'):
2925 if opts.get('edit'): 2987 if opts.get(b'edit'):
2926 raise error.Abort( 2988 raise error.Abort(
2927 _("cannot specify --no-commit and " "--edit together") 2989 _(b"cannot specify --no-commit and " b"--edit together")
2928 ) 2990 )
2929 if opts.get('currentuser'): 2991 if opts.get(b'currentuser'):
2930 raise error.Abort( 2992 raise error.Abort(
2931 _("cannot specify --no-commit and " "--currentuser together") 2993 _(b"cannot specify --no-commit and " b"--currentuser together")
2932 ) 2994 )
2933 if opts.get('currentdate'): 2995 if opts.get(b'currentdate'):
2934 raise error.Abort( 2996 raise error.Abort(
2935 _("cannot specify --no-commit and " "--currentdate together") 2997 _(b"cannot specify --no-commit and " b"--currentdate together")
2936 ) 2998 )
2937 if opts.get('log'): 2999 if opts.get(b'log'):
2938 raise error.Abort( 3000 raise error.Abort(
2939 _("cannot specify --no-commit and " "--log together") 3001 _(b"cannot specify --no-commit and " b"--log together")
2940 ) 3002 )
2941 3003
2942 graftstate = statemod.cmdstate(repo, 'graftstate') 3004 graftstate = statemod.cmdstate(repo, b'graftstate')
2943 3005
2944 if opts.get('stop'): 3006 if opts.get(b'stop'):
2945 if opts.get('continue'): 3007 if opts.get(b'continue'):
2946 raise error.Abort( 3008 raise error.Abort(
2947 _("cannot use '--continue' and " "'--stop' together") 3009 _(b"cannot use '--continue' and " b"'--stop' together")
2948 ) 3010 )
2949 if opts.get('abort'): 3011 if opts.get(b'abort'):
2950 raise error.Abort(_("cannot use '--abort' and '--stop' together")) 3012 raise error.Abort(_(b"cannot use '--abort' and '--stop' together"))
2951 3013
2952 if any( 3014 if any(
2953 ( 3015 (
2954 opts.get('edit'), 3016 opts.get(b'edit'),
2955 opts.get('log'), 3017 opts.get(b'log'),
2956 opts.get('user'), 3018 opts.get(b'user'),
2957 opts.get('date'), 3019 opts.get(b'date'),
2958 opts.get('currentdate'), 3020 opts.get(b'currentdate'),
2959 opts.get('currentuser'), 3021 opts.get(b'currentuser'),
2960 opts.get('rev'), 3022 opts.get(b'rev'),
2961 ) 3023 )
2962 ): 3024 ):
2963 raise error.Abort(_("cannot specify any other flag with '--stop'")) 3025 raise error.Abort(_(b"cannot specify any other flag with '--stop'"))
2964 return _stopgraft(ui, repo, graftstate) 3026 return _stopgraft(ui, repo, graftstate)
2965 elif opts.get('abort'): 3027 elif opts.get(b'abort'):
2966 if opts.get('continue'): 3028 if opts.get(b'continue'):
2967 raise error.Abort( 3029 raise error.Abort(
2968 _("cannot use '--continue' and " "'--abort' together") 3030 _(b"cannot use '--continue' and " b"'--abort' together")
2969 ) 3031 )
2970 if any( 3032 if any(
2971 ( 3033 (
2972 opts.get('edit'), 3034 opts.get(b'edit'),
2973 opts.get('log'), 3035 opts.get(b'log'),
2974 opts.get('user'), 3036 opts.get(b'user'),
2975 opts.get('date'), 3037 opts.get(b'date'),
2976 opts.get('currentdate'), 3038 opts.get(b'currentdate'),
2977 opts.get('currentuser'), 3039 opts.get(b'currentuser'),
2978 opts.get('rev'), 3040 opts.get(b'rev'),
2979 ) 3041 )
2980 ): 3042 ):
2981 raise error.Abort(_("cannot specify any other flag with '--abort'")) 3043 raise error.Abort(
3044 _(b"cannot specify any other flag with '--abort'")
3045 )
2982 3046
2983 return cmdutil.abortgraft(ui, repo, graftstate) 3047 return cmdutil.abortgraft(ui, repo, graftstate)
2984 elif opts.get('continue'): 3048 elif opts.get(b'continue'):
2985 cont = True 3049 cont = True
2986 if revs: 3050 if revs:
2987 raise error.Abort(_("can't specify --continue and revisions")) 3051 raise error.Abort(_(b"can't specify --continue and revisions"))
2988 # read in unfinished revisions 3052 # read in unfinished revisions
2989 if graftstate.exists(): 3053 if graftstate.exists():
2990 statedata = cmdutil.readgraftstate(repo, graftstate) 3054 statedata = cmdutil.readgraftstate(repo, graftstate)
2991 if statedata.get('date'): 3055 if statedata.get(b'date'):
2992 opts['date'] = statedata['date'] 3056 opts[b'date'] = statedata[b'date']
2993 if statedata.get('user'): 3057 if statedata.get(b'user'):
2994 opts['user'] = statedata['user'] 3058 opts[b'user'] = statedata[b'user']
2995 if statedata.get('log'): 3059 if statedata.get(b'log'):
2996 opts['log'] = True 3060 opts[b'log'] = True
2997 if statedata.get('no_commit'): 3061 if statedata.get(b'no_commit'):
2998 opts['no_commit'] = statedata.get('no_commit') 3062 opts[b'no_commit'] = statedata.get(b'no_commit')
2999 nodes = statedata['nodes'] 3063 nodes = statedata[b'nodes']
3000 revs = [repo[node].rev() for node in nodes] 3064 revs = [repo[node].rev() for node in nodes]
3001 else: 3065 else:
3002 cmdutil.wrongtooltocontinue(repo, _('graft')) 3066 cmdutil.wrongtooltocontinue(repo, _(b'graft'))
3003 else: 3067 else:
3004 if not revs: 3068 if not revs:
3005 raise error.Abort(_('no revisions specified')) 3069 raise error.Abort(_(b'no revisions specified'))
3006 cmdutil.checkunfinished(repo) 3070 cmdutil.checkunfinished(repo)
3007 cmdutil.bailifchanged(repo) 3071 cmdutil.bailifchanged(repo)
3008 revs = scmutil.revrange(repo, revs) 3072 revs = scmutil.revrange(repo, revs)
3009 3073
3010 skipped = set() 3074 skipped = set()
3011 if basectx is None: 3075 if basectx is None:
3012 # check for merges 3076 # check for merges
3013 for rev in repo.revs('%ld and merge()', revs): 3077 for rev in repo.revs(b'%ld and merge()', revs):
3014 ui.warn(_('skipping ungraftable merge revision %d\n') % rev) 3078 ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
3015 skipped.add(rev) 3079 skipped.add(rev)
3016 revs = [r for r in revs if r not in skipped] 3080 revs = [r for r in revs if r not in skipped]
3017 if not revs: 3081 if not revs:
3018 return -1 3082 return -1
3019 if basectx is not None and len(revs) != 1: 3083 if basectx is not None and len(revs) != 1:
3020 raise error.Abort(_('only one revision allowed with --base ')) 3084 raise error.Abort(_(b'only one revision allowed with --base '))
3021 3085
3022 # Don't check in the --continue case, in effect retaining --force across 3086 # Don't check in the --continue case, in effect retaining --force across
3023 # --continues. That's because without --force, any revisions we decided to 3087 # --continues. That's because without --force, any revisions we decided to
3024 # skip would have been filtered out here, so they wouldn't have made their 3088 # skip would have been filtered out here, so they wouldn't have made their
3025 # way to the graftstate. With --force, any revisions we would have otherwise 3089 # way to the graftstate. With --force, any revisions we would have otherwise
3026 # skipped would not have been filtered out, and if they hadn't been applied 3090 # skipped would not have been filtered out, and if they hadn't been applied
3027 # already, they'd have been in the graftstate. 3091 # already, they'd have been in the graftstate.
3028 if not (cont or opts.get('force')) and basectx is None: 3092 if not (cont or opts.get(b'force')) and basectx is None:
3029 # check for ancestors of dest branch 3093 # check for ancestors of dest branch
3030 crev = repo['.'].rev() 3094 crev = repo[b'.'].rev()
3031 ancestors = repo.changelog.ancestors([crev], inclusive=True) 3095 ancestors = repo.changelog.ancestors([crev], inclusive=True)
3032 # XXX make this lazy in the future 3096 # XXX make this lazy in the future
3033 # don't mutate while iterating, create a copy 3097 # don't mutate while iterating, create a copy
3034 for rev in list(revs): 3098 for rev in list(revs):
3035 if rev in ancestors: 3099 if rev in ancestors:
3036 ui.warn( 3100 ui.warn(
3037 _('skipping ancestor revision %d:%s\n') % (rev, repo[rev]) 3101 _(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev])
3038 ) 3102 )
3039 # XXX remove on list is slow 3103 # XXX remove on list is slow
3040 revs.remove(rev) 3104 revs.remove(rev)
3041 if not revs: 3105 if not revs:
3042 return -1 3106 return -1
3043 3107
3044 # analyze revs for earlier grafts 3108 # analyze revs for earlier grafts
3045 ids = {} 3109 ids = {}
3046 for ctx in repo.set("%ld", revs): 3110 for ctx in repo.set(b"%ld", revs):
3047 ids[ctx.hex()] = ctx.rev() 3111 ids[ctx.hex()] = ctx.rev()
3048 n = ctx.extra().get('source') 3112 n = ctx.extra().get(b'source')
3049 if n: 3113 if n:
3050 ids[n] = ctx.rev() 3114 ids[n] = ctx.rev()
3051 3115
3052 # check ancestors for earlier grafts 3116 # check ancestors for earlier grafts
3053 ui.debug('scanning for duplicate grafts\n') 3117 ui.debug(b'scanning for duplicate grafts\n')
3054 3118
3055 # The only changesets we can be sure doesn't contain grafts of any 3119 # The only changesets we can be sure doesn't contain grafts of any
3056 # revs, are the ones that are common ancestors of *all* revs: 3120 # revs, are the ones that are common ancestors of *all* revs:
3057 for rev in repo.revs('only(%d,ancestor(%ld))', crev, revs): 3121 for rev in repo.revs(b'only(%d,ancestor(%ld))', crev, revs):
3058 ctx = repo[rev] 3122 ctx = repo[rev]
3059 n = ctx.extra().get('source') 3123 n = ctx.extra().get(b'source')
3060 if n in ids: 3124 if n in ids:
3061 try: 3125 try:
3062 r = repo[n].rev() 3126 r = repo[n].rev()
3063 except error.RepoLookupError: 3127 except error.RepoLookupError:
3064 r = None 3128 r = None
3065 if r in revs: 3129 if r in revs:
3066 ui.warn( 3130 ui.warn(
3067 _( 3131 _(
3068 'skipping revision %d:%s ' 3132 b'skipping revision %d:%s '
3069 '(already grafted to %d:%s)\n' 3133 b'(already grafted to %d:%s)\n'
3070 ) 3134 )
3071 % (r, repo[r], rev, ctx) 3135 % (r, repo[r], rev, ctx)
3072 ) 3136 )
3073 revs.remove(r) 3137 revs.remove(r)
3074 elif ids[n] in revs: 3138 elif ids[n] in revs:
3075 if r is None: 3139 if r is None:
3076 ui.warn( 3140 ui.warn(
3077 _( 3141 _(
3078 'skipping already grafted revision %d:%s ' 3142 b'skipping already grafted revision %d:%s '
3079 '(%d:%s also has unknown origin %s)\n' 3143 b'(%d:%s also has unknown origin %s)\n'
3080 ) 3144 )
3081 % (ids[n], repo[ids[n]], rev, ctx, n[:12]) 3145 % (ids[n], repo[ids[n]], rev, ctx, n[:12])
3082 ) 3146 )
3083 else: 3147 else:
3084 ui.warn( 3148 ui.warn(
3085 _( 3149 _(
3086 'skipping already grafted revision %d:%s ' 3150 b'skipping already grafted revision %d:%s '
3087 '(%d:%s also has origin %d:%s)\n' 3151 b'(%d:%s also has origin %d:%s)\n'
3088 ) 3152 )
3089 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12]) 3153 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12])
3090 ) 3154 )
3091 revs.remove(ids[n]) 3155 revs.remove(ids[n])
3092 elif ctx.hex() in ids: 3156 elif ctx.hex() in ids:
3093 r = ids[ctx.hex()] 3157 r = ids[ctx.hex()]
3094 if r in revs: 3158 if r in revs:
3095 ui.warn( 3159 ui.warn(
3096 _( 3160 _(
3097 'skipping already grafted revision %d:%s ' 3161 b'skipping already grafted revision %d:%s '
3098 '(was grafted from %d:%s)\n' 3162 b'(was grafted from %d:%s)\n'
3099 ) 3163 )
3100 % (r, repo[r], rev, ctx) 3164 % (r, repo[r], rev, ctx)
3101 ) 3165 )
3102 revs.remove(r) 3166 revs.remove(r)
3103 if not revs: 3167 if not revs:
3104 return -1 3168 return -1
3105 3169
3106 if opts.get('no_commit'): 3170 if opts.get(b'no_commit'):
3107 statedata['no_commit'] = True 3171 statedata[b'no_commit'] = True
3108 for pos, ctx in enumerate(repo.set("%ld", revs)): 3172 for pos, ctx in enumerate(repo.set(b"%ld", revs)):
3109 desc = '%d:%s "%s"' % ( 3173 desc = b'%d:%s "%s"' % (
3110 ctx.rev(), 3174 ctx.rev(),
3111 ctx, 3175 ctx,
3112 ctx.description().split('\n', 1)[0], 3176 ctx.description().split(b'\n', 1)[0],
3113 ) 3177 )
3114 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node()) 3178 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3115 if names: 3179 if names:
3116 desc += ' (%s)' % ' '.join(names) 3180 desc += b' (%s)' % b' '.join(names)
3117 ui.status(_('grafting %s\n') % desc) 3181 ui.status(_(b'grafting %s\n') % desc)
3118 if opts.get('dry_run'): 3182 if opts.get(b'dry_run'):
3119 continue 3183 continue
3120 3184
3121 source = ctx.extra().get('source') 3185 source = ctx.extra().get(b'source')
3122 extra = {} 3186 extra = {}
3123 if source: 3187 if source:
3124 extra['source'] = source 3188 extra[b'source'] = source
3125 extra['intermediate-source'] = ctx.hex() 3189 extra[b'intermediate-source'] = ctx.hex()
3126 else: 3190 else:
3127 extra['source'] = ctx.hex() 3191 extra[b'source'] = ctx.hex()
3128 user = ctx.user() 3192 user = ctx.user()
3129 if opts.get('user'): 3193 if opts.get(b'user'):
3130 user = opts['user'] 3194 user = opts[b'user']
3131 statedata['user'] = user 3195 statedata[b'user'] = user
3132 date = ctx.date() 3196 date = ctx.date()
3133 if opts.get('date'): 3197 if opts.get(b'date'):
3134 date = opts['date'] 3198 date = opts[b'date']
3135 statedata['date'] = date 3199 statedata[b'date'] = date
3136 message = ctx.description() 3200 message = ctx.description()
3137 if opts.get('log'): 3201 if opts.get(b'log'):
3138 message += '\n(grafted from %s)' % ctx.hex() 3202 message += b'\n(grafted from %s)' % ctx.hex()
3139 statedata['log'] = True 3203 statedata[b'log'] = True
3140 3204
3141 # we don't merge the first commit when continuing 3205 # we don't merge the first commit when continuing
3142 if not cont: 3206 if not cont:
3143 # perform the graft merge with p1(rev) as 'ancestor' 3207 # perform the graft merge with p1(rev) as 'ancestor'
3144 overrides = {('ui', 'forcemerge'): opts.get('tool', '')} 3208 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
3145 base = ctx.p1() if basectx is None else basectx 3209 base = ctx.p1() if basectx is None else basectx
3146 with ui.configoverride(overrides, 'graft'): 3210 with ui.configoverride(overrides, b'graft'):
3147 stats = mergemod.graft(repo, ctx, base, ['local', 'graft']) 3211 stats = mergemod.graft(repo, ctx, base, [b'local', b'graft'])
3148 # report any conflicts 3212 # report any conflicts
3149 if stats.unresolvedcount > 0: 3213 if stats.unresolvedcount > 0:
3150 # write out state for --continue 3214 # write out state for --continue
3151 nodes = [repo[rev].hex() for rev in revs[pos:]] 3215 nodes = [repo[rev].hex() for rev in revs[pos:]]
3152 statedata['nodes'] = nodes 3216 statedata[b'nodes'] = nodes
3153 stateversion = 1 3217 stateversion = 1
3154 graftstate.save(stateversion, statedata) 3218 graftstate.save(stateversion, statedata)
3155 hint = _("use 'hg resolve' and 'hg graft --continue'") 3219 hint = _(b"use 'hg resolve' and 'hg graft --continue'")
3156 raise error.Abort( 3220 raise error.Abort(
3157 _("unresolved conflicts, can't continue"), hint=hint 3221 _(b"unresolved conflicts, can't continue"), hint=hint
3158 ) 3222 )
3159 else: 3223 else:
3160 cont = False 3224 cont = False
3161 3225
3162 # commit if --no-commit is false 3226 # commit if --no-commit is false
3163 if not opts.get('no_commit'): 3227 if not opts.get(b'no_commit'):
3164 node = repo.commit( 3228 node = repo.commit(
3165 text=message, user=user, date=date, extra=extra, editor=editor 3229 text=message, user=user, date=date, extra=extra, editor=editor
3166 ) 3230 )
3167 if node is None: 3231 if node is None:
3168 ui.warn( 3232 ui.warn(
3169 _('note: graft of %d:%s created no changes to commit\n') 3233 _(b'note: graft of %d:%s created no changes to commit\n')
3170 % (ctx.rev(), ctx) 3234 % (ctx.rev(), ctx)
3171 ) 3235 )
3172 # checking that newnodes exist because old state files won't have it 3236 # checking that newnodes exist because old state files won't have it
3173 elif statedata.get('newnodes') is not None: 3237 elif statedata.get(b'newnodes') is not None:
3174 statedata['newnodes'].append(node) 3238 statedata[b'newnodes'].append(node)
3175 3239
3176 # remove state when we complete successfully 3240 # remove state when we complete successfully
3177 if not opts.get('dry_run'): 3241 if not opts.get(b'dry_run'):
3178 graftstate.delete() 3242 graftstate.delete()
3179 3243
3180 return 0 3244 return 0
3181 3245
3182 3246
3183 def _stopgraft(ui, repo, graftstate): 3247 def _stopgraft(ui, repo, graftstate):
3184 """stop the interrupted graft""" 3248 """stop the interrupted graft"""
3185 if not graftstate.exists(): 3249 if not graftstate.exists():
3186 raise error.Abort(_("no interrupted graft found")) 3250 raise error.Abort(_(b"no interrupted graft found"))
3187 pctx = repo['.'] 3251 pctx = repo[b'.']
3188 hg.updaterepo(repo, pctx.node(), overwrite=True) 3252 hg.updaterepo(repo, pctx.node(), overwrite=True)
3189 graftstate.delete() 3253 graftstate.delete()
3190 ui.status(_("stopped the interrupted graft\n")) 3254 ui.status(_(b"stopped the interrupted graft\n"))
3191 ui.status(_("working directory is now at %s\n") % pctx.hex()[:12]) 3255 ui.status(_(b"working directory is now at %s\n") % pctx.hex()[:12])
3192 return 0 3256 return 0
3193 3257
3194 3258
3195 statemod.addunfinished( 3259 statemod.addunfinished(
3196 'graft', 3260 b'graft',
3197 fname='graftstate', 3261 fname=b'graftstate',
3198 clearable=True, 3262 clearable=True,
3199 stopflag=True, 3263 stopflag=True,
3200 continueflag=True, 3264 continueflag=True,
3201 abortfunc=cmdutil.hgabortgraft, 3265 abortfunc=cmdutil.hgabortgraft,
3202 cmdhint=_("use 'hg graft --continue' or 'hg graft --stop' to stop"), 3266 cmdhint=_(b"use 'hg graft --continue' or 'hg graft --stop' to stop"),
3203 ) 3267 )
3204 3268
3205 3269
3206 @command( 3270 @command(
3207 'grep', 3271 b'grep',
3208 [ 3272 [
3209 ('0', 'print0', None, _('end fields with NUL')), 3273 (b'0', b'print0', None, _(b'end fields with NUL')),
3210 ('', 'all', None, _('print all revisions that match (DEPRECATED) ')), 3274 (b'', b'all', None, _(b'print all revisions that match (DEPRECATED) ')),
3211 ( 3275 (
3212 '', 3276 b'',
3213 'diff', 3277 b'diff',
3214 None,
3215 _('print all revisions when the term was introduced ' 'or removed'),
3216 ),
3217 ('a', 'text', None, _('treat all files as text')),
3218 (
3219 'f',
3220 'follow',
3221 None, 3278 None,
3222 _( 3279 _(
3223 'follow changeset history,' 3280 b'print all revisions when the term was introduced '
3224 ' or file history across copies and renames' 3281 b'or removed'
3225 ), 3282 ),
3226 ), 3283 ),
3227 ('i', 'ignore-case', None, _('ignore case when matching')), 3284 (b'a', b'text', None, _(b'treat all files as text')),
3228 ( 3285 (
3229 'l', 3286 b'f',
3230 'files-with-matches', 3287 b'follow',
3231 None,
3232 _('print only filenames and revisions that match'),
3233 ),
3234 ('n', 'line-number', None, _('print matching line numbers')),
3235 (
3236 'r',
3237 'rev',
3238 [],
3239 _('only search files changed within revision range'),
3240 _('REV'),
3241 ),
3242 (
3243 '',
3244 'all-files',
3245 None, 3288 None,
3246 _( 3289 _(
3247 'include all files in the changeset while grepping (EXPERIMENTAL)' 3290 b'follow changeset history,'
3291 b' or file history across copies and renames'
3248 ), 3292 ),
3249 ), 3293 ),
3250 ('u', 'user', None, _('list the author (long with -v)')), 3294 (b'i', b'ignore-case', None, _(b'ignore case when matching')),
3251 ('d', 'date', None, _('list the date (short with -q)')), 3295 (
3296 b'l',
3297 b'files-with-matches',
3298 None,
3299 _(b'print only filenames and revisions that match'),
3300 ),
3301 (b'n', b'line-number', None, _(b'print matching line numbers')),
3302 (
3303 b'r',
3304 b'rev',
3305 [],
3306 _(b'only search files changed within revision range'),
3307 _(b'REV'),
3308 ),
3309 (
3310 b'',
3311 b'all-files',
3312 None,
3313 _(
3314 b'include all files in the changeset while grepping (EXPERIMENTAL)'
3315 ),
3316 ),
3317 (b'u', b'user', None, _(b'list the author (long with -v)')),
3318 (b'd', b'date', None, _(b'list the date (short with -q)')),
3252 ] 3319 ]
3253 + formatteropts 3320 + formatteropts
3254 + walkopts, 3321 + walkopts,
3255 _('[OPTION]... PATTERN [FILE]...'), 3322 _(b'[OPTION]... PATTERN [FILE]...'),
3256 helpcategory=command.CATEGORY_FILE_CONTENTS, 3323 helpcategory=command.CATEGORY_FILE_CONTENTS,
3257 inferrepo=True, 3324 inferrepo=True,
3258 intents={INTENT_READONLY}, 3325 intents={INTENT_READONLY},
3259 ) 3326 )
3260 def grep(ui, repo, pattern, *pats, **opts): 3327 def grep(ui, repo, pattern, *pats, **opts):
3297 See :hg:`help templates.operators` for the list expansion syntax. 3364 See :hg:`help templates.operators` for the list expansion syntax.
3298 3365
3299 Returns 0 if a match is found, 1 otherwise. 3366 Returns 0 if a match is found, 1 otherwise.
3300 """ 3367 """
3301 opts = pycompat.byteskwargs(opts) 3368 opts = pycompat.byteskwargs(opts)
3302 diff = opts.get('all') or opts.get('diff') 3369 diff = opts.get(b'all') or opts.get(b'diff')
3303 all_files = opts.get('all_files') 3370 all_files = opts.get(b'all_files')
3304 if diff and opts.get('all_files'): 3371 if diff and opts.get(b'all_files'):
3305 raise error.Abort(_('--diff and --all-files are mutually exclusive')) 3372 raise error.Abort(_(b'--diff and --all-files are mutually exclusive'))
3306 # TODO: remove "not opts.get('rev')" if --all-files -rMULTIREV gets working 3373 # TODO: remove "not opts.get('rev')" if --all-files -rMULTIREV gets working
3307 if opts.get('all_files') is None and not opts.get('rev') and not diff: 3374 if opts.get(b'all_files') is None and not opts.get(b'rev') and not diff:
3308 # experimental config: commands.grep.all-files 3375 # experimental config: commands.grep.all-files
3309 opts['all_files'] = ui.configbool('commands', 'grep.all-files') 3376 opts[b'all_files'] = ui.configbool(b'commands', b'grep.all-files')
3310 plaingrep = opts.get('all_files') and not opts.get('rev') 3377 plaingrep = opts.get(b'all_files') and not opts.get(b'rev')
3311 if plaingrep: 3378 if plaingrep:
3312 opts['rev'] = ['wdir()'] 3379 opts[b'rev'] = [b'wdir()']
3313 3380
3314 reflags = re.M 3381 reflags = re.M
3315 if opts.get('ignore_case'): 3382 if opts.get(b'ignore_case'):
3316 reflags |= re.I 3383 reflags |= re.I
3317 try: 3384 try:
3318 regexp = util.re.compile(pattern, reflags) 3385 regexp = util.re.compile(pattern, reflags)
3319 except re.error as inst: 3386 except re.error as inst:
3320 ui.warn(_("grep: invalid match pattern: %s\n") % pycompat.bytestr(inst)) 3387 ui.warn(
3388 _(b"grep: invalid match pattern: %s\n") % pycompat.bytestr(inst)
3389 )
3321 return 1 3390 return 1
3322 sep, eol = ':', '\n' 3391 sep, eol = b':', b'\n'
3323 if opts.get('print0'): 3392 if opts.get(b'print0'):
3324 sep = eol = '\0' 3393 sep = eol = b'\0'
3325 3394
3326 getfile = util.lrucachefunc(repo.file) 3395 getfile = util.lrucachefunc(repo.file)
3327 3396
3328 def matchlines(body): 3397 def matchlines(body):
3329 begin = 0 3398 begin = 0
3331 while begin < len(body): 3400 while begin < len(body):
3332 match = regexp.search(body, begin) 3401 match = regexp.search(body, begin)
3333 if not match: 3402 if not match:
3334 break 3403 break
3335 mstart, mend = match.span() 3404 mstart, mend = match.span()
3336 linenum += body.count('\n', begin, mstart) + 1 3405 linenum += body.count(b'\n', begin, mstart) + 1
3337 lstart = body.rfind('\n', begin, mstart) + 1 or begin 3406 lstart = body.rfind(b'\n', begin, mstart) + 1 or begin
3338 begin = body.find('\n', mend) + 1 or len(body) + 1 3407 begin = body.find(b'\n', mend) + 1 or len(body) + 1
3339 lend = begin - 1 3408 lend = begin - 1
3340 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend] 3409 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
3341 3410
3342 class linestate(object): 3411 class linestate(object):
3343 def __init__(self, line, linenum, colstart, colend): 3412 def __init__(self, line, linenum, colstart, colend):
3376 def difflinestates(a, b): 3445 def difflinestates(a, b):
3377 sm = difflib.SequenceMatcher(None, a, b) 3446 sm = difflib.SequenceMatcher(None, a, b)
3378 for tag, alo, ahi, blo, bhi in sm.get_opcodes(): 3447 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
3379 if tag == r'insert': 3448 if tag == r'insert':
3380 for i in pycompat.xrange(blo, bhi): 3449 for i in pycompat.xrange(blo, bhi):
3381 yield ('+', b[i]) 3450 yield (b'+', b[i])
3382 elif tag == r'delete': 3451 elif tag == r'delete':
3383 for i in pycompat.xrange(alo, ahi): 3452 for i in pycompat.xrange(alo, ahi):
3384 yield ('-', a[i]) 3453 yield (b'-', a[i])
3385 elif tag == r'replace': 3454 elif tag == r'replace':
3386 for i in pycompat.xrange(alo, ahi): 3455 for i in pycompat.xrange(alo, ahi):
3387 yield ('-', a[i]) 3456 yield (b'-', a[i])
3388 for i in pycompat.xrange(blo, bhi): 3457 for i in pycompat.xrange(blo, bhi):
3389 yield ('+', b[i]) 3458 yield (b'+', b[i])
3390 3459
3391 uipathfn = scmutil.getuipathfn(repo) 3460 uipathfn = scmutil.getuipathfn(repo)
3392 3461
3393 def display(fm, fn, ctx, pstates, states): 3462 def display(fm, fn, ctx, pstates, states):
3394 rev = scmutil.intrev(ctx) 3463 rev = scmutil.intrev(ctx)
3395 if fm.isplain(): 3464 if fm.isplain():
3396 formatuser = ui.shortuser 3465 formatuser = ui.shortuser
3397 else: 3466 else:
3398 formatuser = pycompat.bytestr 3467 formatuser = pycompat.bytestr
3399 if ui.quiet: 3468 if ui.quiet:
3400 datefmt = '%Y-%m-%d' 3469 datefmt = b'%Y-%m-%d'
3401 else: 3470 else:
3402 datefmt = '%a %b %d %H:%M:%S %Y %1%2' 3471 datefmt = b'%a %b %d %H:%M:%S %Y %1%2'
3403 found = False 3472 found = False
3404 3473
3405 @util.cachefunc 3474 @util.cachefunc
3406 def binary(): 3475 def binary():
3407 flog = getfile(fn) 3476 flog = getfile(fn)
3408 try: 3477 try:
3409 return stringutil.binary(flog.read(ctx.filenode(fn))) 3478 return stringutil.binary(flog.read(ctx.filenode(fn)))
3410 except error.WdirUnsupported: 3479 except error.WdirUnsupported:
3411 return ctx[fn].isbinary() 3480 return ctx[fn].isbinary()
3412 3481
3413 fieldnamemap = {'linenumber': 'lineno'} 3482 fieldnamemap = {b'linenumber': b'lineno'}
3414 if diff: 3483 if diff:
3415 iter = difflinestates(pstates, states) 3484 iter = difflinestates(pstates, states)
3416 else: 3485 else:
3417 iter = [('', l) for l in states] 3486 iter = [(b'', l) for l in states]
3418 for change, l in iter: 3487 for change, l in iter:
3419 fm.startitem() 3488 fm.startitem()
3420 fm.context(ctx=ctx) 3489 fm.context(ctx=ctx)
3421 fm.data(node=fm.hexfunc(scmutil.binnode(ctx)), path=fn) 3490 fm.data(node=fm.hexfunc(scmutil.binnode(ctx)), path=fn)
3422 fm.plain(uipathfn(fn), label='grep.filename') 3491 fm.plain(uipathfn(fn), label=b'grep.filename')
3423 3492
3424 cols = [ 3493 cols = [
3425 ('rev', '%d', rev, not plaingrep, ''), 3494 (b'rev', b'%d', rev, not plaingrep, b''),
3426 ('linenumber', '%d', l.linenum, opts.get('line_number'), ''), 3495 (
3496 b'linenumber',
3497 b'%d',
3498 l.linenum,
3499 opts.get(b'line_number'),
3500 b'',
3501 ),
3427 ] 3502 ]
3428 if diff: 3503 if diff:
3429 cols.append( 3504 cols.append(
3430 ( 3505 (
3431 'change', 3506 b'change',
3432 '%s', 3507 b'%s',
3433 change, 3508 change,
3434 True, 3509 True,
3435 'grep.inserted ' if change == '+' else 'grep.deleted ', 3510 b'grep.inserted '
3511 if change == b'+'
3512 else b'grep.deleted ',
3436 ) 3513 )
3437 ) 3514 )
3438 cols.extend( 3515 cols.extend(
3439 [ 3516 [
3440 ( 3517 (
3441 'user', 3518 b'user',
3442 '%s', 3519 b'%s',
3443 formatuser(ctx.user()), 3520 formatuser(ctx.user()),
3444 opts.get('user'), 3521 opts.get(b'user'),
3445 '', 3522 b'',
3446 ), 3523 ),
3447 ( 3524 (
3448 'date', 3525 b'date',
3449 '%s', 3526 b'%s',
3450 fm.formatdate(ctx.date(), datefmt), 3527 fm.formatdate(ctx.date(), datefmt),
3451 opts.get('date'), 3528 opts.get(b'date'),
3452 '', 3529 b'',
3453 ), 3530 ),
3454 ] 3531 ]
3455 ) 3532 )
3456 for name, fmt, data, cond, extra_label in cols: 3533 for name, fmt, data, cond, extra_label in cols:
3457 if cond: 3534 if cond:
3458 fm.plain(sep, label='grep.sep') 3535 fm.plain(sep, label=b'grep.sep')
3459 field = fieldnamemap.get(name, name) 3536 field = fieldnamemap.get(name, name)
3460 label = extra_label + ('grep.%s' % name) 3537 label = extra_label + (b'grep.%s' % name)
3461 fm.condwrite(cond, field, fmt, data, label=label) 3538 fm.condwrite(cond, field, fmt, data, label=label)
3462 if not opts.get('files_with_matches'): 3539 if not opts.get(b'files_with_matches'):
3463 fm.plain(sep, label='grep.sep') 3540 fm.plain(sep, label=b'grep.sep')
3464 if not opts.get('text') and binary(): 3541 if not opts.get(b'text') and binary():
3465 fm.plain(_(" Binary file matches")) 3542 fm.plain(_(b" Binary file matches"))
3466 else: 3543 else:
3467 displaymatches(fm.nested('texts', tmpl='{text}'), l) 3544 displaymatches(fm.nested(b'texts', tmpl=b'{text}'), l)
3468 fm.plain(eol) 3545 fm.plain(eol)
3469 found = True 3546 found = True
3470 if opts.get('files_with_matches'): 3547 if opts.get(b'files_with_matches'):
3471 break 3548 break
3472 return found 3549 return found
3473 3550
3474 def displaymatches(fm, l): 3551 def displaymatches(fm, l):
3475 p = 0 3552 p = 0
3476 for s, e in l.findpos(): 3553 for s, e in l.findpos():
3477 if p < s: 3554 if p < s:
3478 fm.startitem() 3555 fm.startitem()
3479 fm.write('text', '%s', l.line[p:s]) 3556 fm.write(b'text', b'%s', l.line[p:s])
3480 fm.data(matched=False) 3557 fm.data(matched=False)
3481 fm.startitem() 3558 fm.startitem()
3482 fm.write('text', '%s', l.line[s:e], label='grep.match') 3559 fm.write(b'text', b'%s', l.line[s:e], label=b'grep.match')
3483 fm.data(matched=True) 3560 fm.data(matched=True)
3484 p = e 3561 p = e
3485 if p < len(l.line): 3562 if p < len(l.line):
3486 fm.startitem() 3563 fm.startitem()
3487 fm.write('text', '%s', l.line[p:]) 3564 fm.write(b'text', b'%s', l.line[p:])
3488 fm.data(matched=False) 3565 fm.data(matched=False)
3489 fm.end() 3566 fm.end()
3490 3567
3491 skip = set() 3568 skip = set()
3492 revfiles = {} 3569 revfiles = {}
3493 match = scmutil.match(repo[None], pats, opts) 3570 match = scmutil.match(repo[None], pats, opts)
3494 found = False 3571 found = False
3495 follow = opts.get('follow') 3572 follow = opts.get(b'follow')
3496 3573
3497 getrenamed = scmutil.getrenamedfn(repo) 3574 getrenamed = scmutil.getrenamedfn(repo)
3498 3575
3499 def prep(ctx, fns): 3576 def prep(ctx, fns):
3500 rev = ctx.rev() 3577 rev = ctx.rev()
3534 fnode = pctx.filenode(pfn) 3611 fnode = pctx.filenode(pfn)
3535 grepbody(pfn, parent, flog.read(fnode)) 3612 grepbody(pfn, parent, flog.read(fnode))
3536 except error.LookupError: 3613 except error.LookupError:
3537 pass 3614 pass
3538 3615
3539 ui.pager('grep') 3616 ui.pager(b'grep')
3540 fm = ui.formatter('grep', opts) 3617 fm = ui.formatter(b'grep', opts)
3541 for ctx in cmdutil.walkchangerevs(repo, match, opts, prep): 3618 for ctx in cmdutil.walkchangerevs(repo, match, opts, prep):
3542 rev = ctx.rev() 3619 rev = ctx.rev()
3543 parent = ctx.p1().rev() 3620 parent = ctx.p1().rev()
3544 for fn in sorted(revfiles.get(rev, [])): 3621 for fn in sorted(revfiles.get(rev, [])):
3545 states = matches[rev][fn] 3622 states = matches[rev][fn]
3565 3642
3566 return not found 3643 return not found
3567 3644
3568 3645
3569 @command( 3646 @command(
3570 'heads', 3647 b'heads',
3571 [ 3648 [
3572 ( 3649 (
3573 'r', 3650 b'r',
3574 'rev', 3651 b'rev',
3575 '', 3652 b'',
3576 _('show only heads which are descendants of STARTREV'), 3653 _(b'show only heads which are descendants of STARTREV'),
3577 _('STARTREV'), 3654 _(b'STARTREV'),
3578 ), 3655 ),
3579 ('t', 'topo', False, _('show topological heads only')), 3656 (b't', b'topo', False, _(b'show topological heads only')),
3580 ('a', 'active', False, _('show active branchheads only (DEPRECATED)')), 3657 (
3581 ('c', 'closed', False, _('show normal and closed branch heads')), 3658 b'a',
3659 b'active',
3660 False,
3661 _(b'show active branchheads only (DEPRECATED)'),
3662 ),
3663 (b'c', b'closed', False, _(b'show normal and closed branch heads')),
3582 ] 3664 ]
3583 + templateopts, 3665 + templateopts,
3584 _('[-ct] [-r STARTREV] [REV]...'), 3666 _(b'[-ct] [-r STARTREV] [REV]...'),
3585 helpcategory=command.CATEGORY_CHANGE_NAVIGATION, 3667 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3586 intents={INTENT_READONLY}, 3668 intents={INTENT_READONLY},
3587 ) 3669 )
3588 def heads(ui, repo, *branchrevs, **opts): 3670 def heads(ui, repo, *branchrevs, **opts):
3589 """show branch heads 3671 """show branch heads
3610 Returns 0 if matching heads are found, 1 if not. 3692 Returns 0 if matching heads are found, 1 if not.
3611 """ 3693 """
3612 3694
3613 opts = pycompat.byteskwargs(opts) 3695 opts = pycompat.byteskwargs(opts)
3614 start = None 3696 start = None
3615 rev = opts.get('rev') 3697 rev = opts.get(b'rev')
3616 if rev: 3698 if rev:
3617 repo = scmutil.unhidehashlikerevs(repo, [rev], 'nowarn') 3699 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3618 start = scmutil.revsingle(repo, rev, None).node() 3700 start = scmutil.revsingle(repo, rev, None).node()
3619 3701
3620 if opts.get('topo'): 3702 if opts.get(b'topo'):
3621 heads = [repo[h] for h in repo.heads(start)] 3703 heads = [repo[h] for h in repo.heads(start)]
3622 else: 3704 else:
3623 heads = [] 3705 heads = []
3624 for branch in repo.branchmap(): 3706 for branch in repo.branchmap():
3625 heads += repo.branchheads(branch, start, opts.get('closed')) 3707 heads += repo.branchheads(branch, start, opts.get(b'closed'))
3626 heads = [repo[h] for h in heads] 3708 heads = [repo[h] for h in heads]
3627 3709
3628 if branchrevs: 3710 if branchrevs:
3629 branches = set( 3711 branches = set(
3630 repo[r].branch() for r in scmutil.revrange(repo, branchrevs) 3712 repo[r].branch() for r in scmutil.revrange(repo, branchrevs)
3631 ) 3713 )
3632 heads = [h for h in heads if h.branch() in branches] 3714 heads = [h for h in heads if h.branch() in branches]
3633 3715
3634 if opts.get('active') and branchrevs: 3716 if opts.get(b'active') and branchrevs:
3635 dagheads = repo.heads(start) 3717 dagheads = repo.heads(start)
3636 heads = [h for h in heads if h.node() in dagheads] 3718 heads = [h for h in heads if h.node() in dagheads]
3637 3719
3638 if branchrevs: 3720 if branchrevs:
3639 haveheads = set(h.branch() for h in heads) 3721 haveheads = set(h.branch() for h in heads)
3640 if branches - haveheads: 3722 if branches - haveheads:
3641 headless = ', '.join(b for b in branches - haveheads) 3723 headless = b', '.join(b for b in branches - haveheads)
3642 msg = _('no open branch heads found on branches %s') 3724 msg = _(b'no open branch heads found on branches %s')
3643 if opts.get('rev'): 3725 if opts.get(b'rev'):
3644 msg += _(' (started at %s)') % opts['rev'] 3726 msg += _(b' (started at %s)') % opts[b'rev']
3645 ui.warn((msg + '\n') % headless) 3727 ui.warn((msg + b'\n') % headless)
3646 3728
3647 if not heads: 3729 if not heads:
3648 return 1 3730 return 1
3649 3731
3650 ui.pager('heads') 3732 ui.pager(b'heads')
3651 heads = sorted(heads, key=lambda x: -(x.rev())) 3733 heads = sorted(heads, key=lambda x: -(x.rev()))
3652 displayer = logcmdutil.changesetdisplayer(ui, repo, opts) 3734 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
3653 for ctx in heads: 3735 for ctx in heads:
3654 displayer.show(ctx) 3736 displayer.show(ctx)
3655 displayer.close() 3737 displayer.close()
3656 3738
3657 3739
3658 @command( 3740 @command(
3659 'help', 3741 b'help',
3660 [ 3742 [
3661 ('e', 'extension', None, _('show only help for extensions')), 3743 (b'e', b'extension', None, _(b'show only help for extensions')),
3662 ('c', 'command', None, _('show only help for commands')), 3744 (b'c', b'command', None, _(b'show only help for commands')),
3663 ('k', 'keyword', None, _('show topics matching keyword')), 3745 (b'k', b'keyword', None, _(b'show topics matching keyword')),
3664 ( 3746 (
3665 's', 3747 b's',
3666 'system', 3748 b'system',
3667 [], 3749 [],
3668 _('show help for specific platform(s)'), 3750 _(b'show help for specific platform(s)'),
3669 _('PLATFORM'), 3751 _(b'PLATFORM'),
3670 ), 3752 ),
3671 ], 3753 ],
3672 _('[-eck] [-s PLATFORM] [TOPIC]'), 3754 _(b'[-eck] [-s PLATFORM] [TOPIC]'),
3673 helpcategory=command.CATEGORY_HELP, 3755 helpcategory=command.CATEGORY_HELP,
3674 norepo=True, 3756 norepo=True,
3675 intents={INTENT_READONLY}, 3757 intents={INTENT_READONLY},
3676 ) 3758 )
3677 def help_(ui, name=None, **opts): 3759 def help_(ui, name=None, **opts):
3685 Returns 0 if successful. 3767 Returns 0 if successful.
3686 """ 3768 """
3687 3769
3688 keep = opts.get(r'system') or [] 3770 keep = opts.get(r'system') or []
3689 if len(keep) == 0: 3771 if len(keep) == 0:
3690 if pycompat.sysplatform.startswith('win'): 3772 if pycompat.sysplatform.startswith(b'win'):
3691 keep.append('windows') 3773 keep.append(b'windows')
3692 elif pycompat.sysplatform == 'OpenVMS': 3774 elif pycompat.sysplatform == b'OpenVMS':
3693 keep.append('vms') 3775 keep.append(b'vms')
3694 elif pycompat.sysplatform == 'plan9': 3776 elif pycompat.sysplatform == b'plan9':
3695 keep.append('plan9') 3777 keep.append(b'plan9')
3696 else: 3778 else:
3697 keep.append('unix') 3779 keep.append(b'unix')
3698 keep.append(pycompat.sysplatform.lower()) 3780 keep.append(pycompat.sysplatform.lower())
3699 if ui.verbose: 3781 if ui.verbose:
3700 keep.append('verbose') 3782 keep.append(b'verbose')
3701 3783
3702 commands = sys.modules[__name__] 3784 commands = sys.modules[__name__]
3703 formatted = help.formattedhelp(ui, commands, name, keep=keep, **opts) 3785 formatted = help.formattedhelp(ui, commands, name, keep=keep, **opts)
3704 ui.pager('help') 3786 ui.pager(b'help')
3705 ui.write(formatted) 3787 ui.write(formatted)
3706 3788
3707 3789
3708 @command( 3790 @command(
3709 'identify|id', 3791 b'identify|id',
3710 [ 3792 [
3711 ('r', 'rev', '', _('identify the specified revision'), _('REV')), 3793 (b'r', b'rev', b'', _(b'identify the specified revision'), _(b'REV')),
3712 ('n', 'num', None, _('show local revision number')), 3794 (b'n', b'num', None, _(b'show local revision number')),
3713 ('i', 'id', None, _('show global revision id')), 3795 (b'i', b'id', None, _(b'show global revision id')),
3714 ('b', 'branch', None, _('show branch')), 3796 (b'b', b'branch', None, _(b'show branch')),
3715 ('t', 'tags', None, _('show tags')), 3797 (b't', b'tags', None, _(b'show tags')),
3716 ('B', 'bookmarks', None, _('show bookmarks')), 3798 (b'B', b'bookmarks', None, _(b'show bookmarks')),
3717 ] 3799 ]
3718 + remoteopts 3800 + remoteopts
3719 + formatteropts, 3801 + formatteropts,
3720 _('[-nibtB] [-r REV] [SOURCE]'), 3802 _(b'[-nibtB] [-r REV] [SOURCE]'),
3721 helpcategory=command.CATEGORY_CHANGE_NAVIGATION, 3803 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3722 optionalrepo=True, 3804 optionalrepo=True,
3723 intents={INTENT_READONLY}, 3805 intents={INTENT_READONLY},
3724 ) 3806 )
3725 def identify( 3807 def identify(
3781 """ 3863 """
3782 3864
3783 opts = pycompat.byteskwargs(opts) 3865 opts = pycompat.byteskwargs(opts)
3784 if not repo and not source: 3866 if not repo and not source:
3785 raise error.Abort( 3867 raise error.Abort(
3786 _("there is no Mercurial repository here " "(.hg not found)") 3868 _(b"there is no Mercurial repository here " b"(.hg not found)")
3787 ) 3869 )
3788 3870
3789 default = not (num or id or branch or tags or bookmarks) 3871 default = not (num or id or branch or tags or bookmarks)
3790 output = [] 3872 output = []
3791 revs = [] 3873 revs = []
3794 source, branches = hg.parseurl(ui.expandpath(source)) 3876 source, branches = hg.parseurl(ui.expandpath(source))
3795 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo 3877 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
3796 repo = peer.local() 3878 repo = peer.local()
3797 revs, checkout = hg.addbranchrevs(repo, peer, branches, None) 3879 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3798 3880
3799 fm = ui.formatter('identify', opts) 3881 fm = ui.formatter(b'identify', opts)
3800 fm.startitem() 3882 fm.startitem()
3801 3883
3802 if not repo: 3884 if not repo:
3803 if num or branch or tags: 3885 if num or branch or tags:
3804 raise error.Abort( 3886 raise error.Abort(
3805 _("can't query remote revision number, branch, or tags") 3887 _(b"can't query remote revision number, branch, or tags")
3806 ) 3888 )
3807 if not rev and revs: 3889 if not rev and revs:
3808 rev = revs[0] 3890 rev = revs[0]
3809 if not rev: 3891 if not rev:
3810 rev = "tip" 3892 rev = b"tip"
3811 3893
3812 remoterev = peer.lookup(rev) 3894 remoterev = peer.lookup(rev)
3813 hexrev = fm.hexfunc(remoterev) 3895 hexrev = fm.hexfunc(remoterev)
3814 if default or id: 3896 if default or id:
3815 output = [hexrev] 3897 output = [hexrev]
3817 3899
3818 @util.cachefunc 3900 @util.cachefunc
3819 def getbms(): 3901 def getbms():
3820 bms = [] 3902 bms = []
3821 3903
3822 if 'bookmarks' in peer.listkeys('namespaces'): 3904 if b'bookmarks' in peer.listkeys(b'namespaces'):
3823 hexremoterev = hex(remoterev) 3905 hexremoterev = hex(remoterev)
3824 bms = [ 3906 bms = [
3825 bm 3907 bm
3826 for bm, bmr in peer.listkeys('bookmarks').iteritems() 3908 for bm, bmr in peer.listkeys(b'bookmarks').iteritems()
3827 if bmr == hexremoterev 3909 if bmr == hexremoterev
3828 ] 3910 ]
3829 3911
3830 return sorted(bms) 3912 return sorted(bms)
3831 3913
3832 if fm.isplain(): 3914 if fm.isplain():
3833 if bookmarks: 3915 if bookmarks:
3834 output.extend(getbms()) 3916 output.extend(getbms())
3835 elif default and not ui.quiet: 3917 elif default and not ui.quiet:
3836 # multiple bookmarks for a single parent separated by '/' 3918 # multiple bookmarks for a single parent separated by '/'
3837 bm = '/'.join(getbms()) 3919 bm = b'/'.join(getbms())
3838 if bm: 3920 if bm:
3839 output.append(bm) 3921 output.append(bm)
3840 else: 3922 else:
3841 fm.data(node=hex(remoterev)) 3923 fm.data(node=hex(remoterev))
3842 if bookmarks or 'bookmarks' in fm.datahint(): 3924 if bookmarks or b'bookmarks' in fm.datahint():
3843 fm.data(bookmarks=fm.formatlist(getbms(), name='bookmark')) 3925 fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
3844 else: 3926 else:
3845 if rev: 3927 if rev:
3846 repo = scmutil.unhidehashlikerevs(repo, [rev], 'nowarn') 3928 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3847 ctx = scmutil.revsingle(repo, rev, None) 3929 ctx = scmutil.revsingle(repo, rev, None)
3848 3930
3849 if ctx.rev() is None: 3931 if ctx.rev() is None:
3850 ctx = repo[None] 3932 ctx = repo[None]
3851 parents = ctx.parents() 3933 parents = ctx.parents()
3852 taglist = [] 3934 taglist = []
3853 for p in parents: 3935 for p in parents:
3854 taglist.extend(p.tags()) 3936 taglist.extend(p.tags())
3855 3937
3856 dirty = "" 3938 dirty = b""
3857 if ctx.dirty(missing=True, merge=False, branch=False): 3939 if ctx.dirty(missing=True, merge=False, branch=False):
3858 dirty = '+' 3940 dirty = b'+'
3859 fm.data(dirty=dirty) 3941 fm.data(dirty=dirty)
3860 3942
3861 hexoutput = [fm.hexfunc(p.node()) for p in parents] 3943 hexoutput = [fm.hexfunc(p.node()) for p in parents]
3862 if default or id: 3944 if default or id:
3863 output = ["%s%s" % ('+'.join(hexoutput), dirty)] 3945 output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
3864 fm.data(id="%s%s" % ('+'.join(hexoutput), dirty)) 3946 fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
3865 3947
3866 if num: 3948 if num:
3867 numoutput = ["%d" % p.rev() for p in parents] 3949 numoutput = [b"%d" % p.rev() for p in parents]
3868 output.append("%s%s" % ('+'.join(numoutput), dirty)) 3950 output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
3869 3951
3870 fm.data( 3952 fm.data(
3871 parents=fm.formatlist( 3953 parents=fm.formatlist(
3872 [fm.hexfunc(p.node()) for p in parents], name='node' 3954 [fm.hexfunc(p.node()) for p in parents], name=b'node'
3873 ) 3955 )
3874 ) 3956 )
3875 else: 3957 else:
3876 hexoutput = fm.hexfunc(ctx.node()) 3958 hexoutput = fm.hexfunc(ctx.node())
3877 if default or id: 3959 if default or id:
3882 output.append(pycompat.bytestr(ctx.rev())) 3964 output.append(pycompat.bytestr(ctx.rev()))
3883 taglist = ctx.tags() 3965 taglist = ctx.tags()
3884 3966
3885 if default and not ui.quiet: 3967 if default and not ui.quiet:
3886 b = ctx.branch() 3968 b = ctx.branch()
3887 if b != 'default': 3969 if b != b'default':
3888 output.append("(%s)" % b) 3970 output.append(b"(%s)" % b)
3889 3971
3890 # multiple tags for a single parent separated by '/' 3972 # multiple tags for a single parent separated by '/'
3891 t = '/'.join(taglist) 3973 t = b'/'.join(taglist)
3892 if t: 3974 if t:
3893 output.append(t) 3975 output.append(t)
3894 3976
3895 # multiple bookmarks for a single parent separated by '/' 3977 # multiple bookmarks for a single parent separated by '/'
3896 bm = '/'.join(ctx.bookmarks()) 3978 bm = b'/'.join(ctx.bookmarks())
3897 if bm: 3979 if bm:
3898 output.append(bm) 3980 output.append(bm)
3899 else: 3981 else:
3900 if branch: 3982 if branch:
3901 output.append(ctx.branch()) 3983 output.append(ctx.branch())
3906 if bookmarks: 3988 if bookmarks:
3907 output.extend(ctx.bookmarks()) 3989 output.extend(ctx.bookmarks())
3908 3990
3909 fm.data(node=ctx.hex()) 3991 fm.data(node=ctx.hex())
3910 fm.data(branch=ctx.branch()) 3992 fm.data(branch=ctx.branch())
3911 fm.data(tags=fm.formatlist(taglist, name='tag', sep=':')) 3993 fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
3912 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name='bookmark')) 3994 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
3913 fm.context(ctx=ctx) 3995 fm.context(ctx=ctx)
3914 3996
3915 fm.plain("%s\n" % ' '.join(output)) 3997 fm.plain(b"%s\n" % b' '.join(output))
3916 fm.end() 3998 fm.end()
3917 3999
3918 4000
3919 @command( 4001 @command(
3920 'import|patch', 4002 b'import|patch',
3921 [ 4003 [
3922 ( 4004 (
3923 'p', 4005 b'p',
3924 'strip', 4006 b'strip',
3925 1, 4007 1,
3926 _( 4008 _(
3927 'directory strip option for patch. This has the same ' 4009 b'directory strip option for patch. This has the same '
3928 'meaning as the corresponding patch option' 4010 b'meaning as the corresponding patch option'
3929 ), 4011 ),
3930 _('NUM'), 4012 _(b'NUM'),
3931 ), 4013 ),
3932 ('b', 'base', '', _('base path (DEPRECATED)'), _('PATH')), 4014 (b'b', b'base', b'', _(b'base path (DEPRECATED)'), _(b'PATH')),
3933 ('e', 'edit', False, _('invoke editor on commit messages')), 4015 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
3934 ( 4016 (
3935 'f', 4017 b'f',
3936 'force', 4018 b'force',
3937 None, 4019 None,
3938 _('skip check for outstanding uncommitted changes (DEPRECATED)'), 4020 _(b'skip check for outstanding uncommitted changes (DEPRECATED)'),
3939 ), 4021 ),
3940 ( 4022 (
3941 '', 4023 b'',
3942 'no-commit', 4024 b'no-commit',
3943 None, 4025 None,
3944 _("don't commit, just update the working directory"), 4026 _(b"don't commit, just update the working directory"),
3945 ), 4027 ),
3946 ( 4028 (
3947 '', 4029 b'',
3948 'bypass', 4030 b'bypass',
3949 None, 4031 None,
3950 _("apply patch without touching the working directory"), 4032 _(b"apply patch without touching the working directory"),
3951 ), 4033 ),
3952 ('', 'partial', None, _('commit even if some hunks fail')), 4034 (b'', b'partial', None, _(b'commit even if some hunks fail')),
3953 ('', 'exact', None, _('abort if patch would apply lossily')), 4035 (b'', b'exact', None, _(b'abort if patch would apply lossily')),
3954 ('', 'prefix', '', _('apply patch to subdirectory'), _('DIR')), 4036 (b'', b'prefix', b'', _(b'apply patch to subdirectory'), _(b'DIR')),
3955 ( 4037 (
3956 '', 4038 b'',
3957 'import-branch', 4039 b'import-branch',
3958 None, 4040 None,
3959 _('use any branch information in patch (implied by --exact)'), 4041 _(b'use any branch information in patch (implied by --exact)'),
3960 ), 4042 ),
3961 ] 4043 ]
3962 + commitopts 4044 + commitopts
3963 + commitopts2 4045 + commitopts2
3964 + similarityopts, 4046 + similarityopts,
3965 _('[OPTION]... PATCH...'), 4047 _(b'[OPTION]... PATCH...'),
3966 helpcategory=command.CATEGORY_IMPORT_EXPORT, 4048 helpcategory=command.CATEGORY_IMPORT_EXPORT,
3967 ) 4049 )
3968 def import_(ui, repo, patch1=None, *patches, **opts): 4050 def import_(ui, repo, patch1=None, *patches, **opts):
3969 """import an ordered set of patches 4051 """import an ordered set of patches
3970 4052
4064 Returns 0 on success, 1 on partial success (see --partial). 4146 Returns 0 on success, 1 on partial success (see --partial).
4065 """ 4147 """
4066 4148
4067 opts = pycompat.byteskwargs(opts) 4149 opts = pycompat.byteskwargs(opts)
4068 if not patch1: 4150 if not patch1:
4069 raise error.Abort(_('need at least one patch to import')) 4151 raise error.Abort(_(b'need at least one patch to import'))
4070 4152
4071 patches = (patch1,) + patches 4153 patches = (patch1,) + patches
4072 4154
4073 date = opts.get('date') 4155 date = opts.get(b'date')
4074 if date: 4156 if date:
4075 opts['date'] = dateutil.parsedate(date) 4157 opts[b'date'] = dateutil.parsedate(date)
4076 4158
4077 exact = opts.get('exact') 4159 exact = opts.get(b'exact')
4078 update = not opts.get('bypass') 4160 update = not opts.get(b'bypass')
4079 if not update and opts.get('no_commit'): 4161 if not update and opts.get(b'no_commit'):
4080 raise error.Abort(_('cannot use --no-commit with --bypass')) 4162 raise error.Abort(_(b'cannot use --no-commit with --bypass'))
4081 try: 4163 try:
4082 sim = float(opts.get('similarity') or 0) 4164 sim = float(opts.get(b'similarity') or 0)
4083 except ValueError: 4165 except ValueError:
4084 raise error.Abort(_('similarity must be a number')) 4166 raise error.Abort(_(b'similarity must be a number'))
4085 if sim < 0 or sim > 100: 4167 if sim < 0 or sim > 100:
4086 raise error.Abort(_('similarity must be between 0 and 100')) 4168 raise error.Abort(_(b'similarity must be between 0 and 100'))
4087 if sim and not update: 4169 if sim and not update:
4088 raise error.Abort(_('cannot use --similarity with --bypass')) 4170 raise error.Abort(_(b'cannot use --similarity with --bypass'))
4089 if exact: 4171 if exact:
4090 if opts.get('edit'): 4172 if opts.get(b'edit'):
4091 raise error.Abort(_('cannot use --exact with --edit')) 4173 raise error.Abort(_(b'cannot use --exact with --edit'))
4092 if opts.get('prefix'): 4174 if opts.get(b'prefix'):
4093 raise error.Abort(_('cannot use --exact with --prefix')) 4175 raise error.Abort(_(b'cannot use --exact with --prefix'))
4094 4176
4095 base = opts["base"] 4177 base = opts[b"base"]
4096 msgs = [] 4178 msgs = []
4097 ret = 0 4179 ret = 0
4098 4180
4099 with repo.wlock(): 4181 with repo.wlock():
4100 if update: 4182 if update:
4101 cmdutil.checkunfinished(repo) 4183 cmdutil.checkunfinished(repo)
4102 if exact or not opts.get('force'): 4184 if exact or not opts.get(b'force'):
4103 cmdutil.bailifchanged(repo) 4185 cmdutil.bailifchanged(repo)
4104 4186
4105 if not opts.get('no_commit'): 4187 if not opts.get(b'no_commit'):
4106 lock = repo.lock 4188 lock = repo.lock
4107 tr = lambda: repo.transaction('import') 4189 tr = lambda: repo.transaction(b'import')
4108 dsguard = util.nullcontextmanager 4190 dsguard = util.nullcontextmanager
4109 else: 4191 else:
4110 lock = util.nullcontextmanager 4192 lock = util.nullcontextmanager
4111 tr = util.nullcontextmanager 4193 tr = util.nullcontextmanager
4112 dsguard = lambda: dirstateguard.dirstateguard(repo, 'import') 4194 dsguard = lambda: dirstateguard.dirstateguard(repo, b'import')
4113 with lock(), tr(), dsguard(): 4195 with lock(), tr(), dsguard():
4114 parents = repo[None].parents() 4196 parents = repo[None].parents()
4115 for patchurl in patches: 4197 for patchurl in patches:
4116 if patchurl == '-': 4198 if patchurl == b'-':
4117 ui.status(_('applying patch from stdin\n')) 4199 ui.status(_(b'applying patch from stdin\n'))
4118 patchfile = ui.fin 4200 patchfile = ui.fin
4119 patchurl = 'stdin' # for error message 4201 patchurl = b'stdin' # for error message
4120 else: 4202 else:
4121 patchurl = os.path.join(base, patchurl) 4203 patchurl = os.path.join(base, patchurl)
4122 ui.status(_('applying %s\n') % patchurl) 4204 ui.status(_(b'applying %s\n') % patchurl)
4123 patchfile = hg.openpath(ui, patchurl, sendaccept=False) 4205 patchfile = hg.openpath(ui, patchurl, sendaccept=False)
4124 4206
4125 haspatch = False 4207 haspatch = False
4126 for hunk in patch.split(patchfile): 4208 for hunk in patch.split(patchfile):
4127 with patch.extract(ui, hunk) as patchdata: 4209 with patch.extract(ui, hunk) as patchdata:
4128 msg, node, rej = cmdutil.tryimportone( 4210 msg, node, rej = cmdutil.tryimportone(
4129 ui, repo, patchdata, parents, opts, msgs, hg.clean 4211 ui, repo, patchdata, parents, opts, msgs, hg.clean
4130 ) 4212 )
4131 if msg: 4213 if msg:
4132 haspatch = True 4214 haspatch = True
4133 ui.note(msg + '\n') 4215 ui.note(msg + b'\n')
4134 if update or exact: 4216 if update or exact:
4135 parents = repo[None].parents() 4217 parents = repo[None].parents()
4136 else: 4218 else:
4137 parents = [repo[node]] 4219 parents = [repo[node]]
4138 if rej: 4220 if rej:
4139 ui.write_err(_("patch applied partially\n")) 4221 ui.write_err(_(b"patch applied partially\n"))
4140 ui.write_err( 4222 ui.write_err(
4141 _( 4223 _(
4142 "(fix the .rej files and run " 4224 b"(fix the .rej files and run "
4143 "`hg commit --amend`)\n" 4225 b"`hg commit --amend`)\n"
4144 ) 4226 )
4145 ) 4227 )
4146 ret = 1 4228 ret = 1
4147 break 4229 break
4148 4230
4149 if not haspatch: 4231 if not haspatch:
4150 raise error.Abort(_('%s: no diffs found') % patchurl) 4232 raise error.Abort(_(b'%s: no diffs found') % patchurl)
4151 4233
4152 if msgs: 4234 if msgs:
4153 repo.savecommitmessage('\n* * *\n'.join(msgs)) 4235 repo.savecommitmessage(b'\n* * *\n'.join(msgs))
4154 return ret 4236 return ret
4155 4237
4156 4238
4157 @command( 4239 @command(
4158 'incoming|in', 4240 b'incoming|in',
4159 [ 4241 [
4160 ('f', 'force', None, _('run even if remote repository is unrelated')), 4242 (
4161 ('n', 'newest-first', None, _('show newest record first')), 4243 b'f',
4162 ('', 'bundle', '', _('file to store the bundles into'), _('FILE')), 4244 b'force',
4163 ( 4245 None,
4164 'r', 4246 _(b'run even if remote repository is unrelated'),
4165 'rev', 4247 ),
4248 (b'n', b'newest-first', None, _(b'show newest record first')),
4249 (b'', b'bundle', b'', _(b'file to store the bundles into'), _(b'FILE')),
4250 (
4251 b'r',
4252 b'rev',
4166 [], 4253 [],
4167 _('a remote changeset intended to be added'), 4254 _(b'a remote changeset intended to be added'),
4168 _('REV'), 4255 _(b'REV'),
4169 ), 4256 ),
4170 ('B', 'bookmarks', False, _("compare bookmarks")), 4257 (b'B', b'bookmarks', False, _(b"compare bookmarks")),
4171 ( 4258 (
4172 'b', 4259 b'b',
4173 'branch', 4260 b'branch',
4174 [], 4261 [],
4175 _('a specific branch you would like to pull'), 4262 _(b'a specific branch you would like to pull'),
4176 _('BRANCH'), 4263 _(b'BRANCH'),
4177 ), 4264 ),
4178 ] 4265 ]
4179 + logopts 4266 + logopts
4180 + remoteopts 4267 + remoteopts
4181 + subrepoopts, 4268 + subrepoopts,
4182 _('[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'), 4269 _(b'[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'),
4183 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, 4270 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4184 ) 4271 )
4185 def incoming(ui, repo, source="default", **opts): 4272 def incoming(ui, repo, source=b"default", **opts):
4186 """show new changesets found in source 4273 """show new changesets found in source
4187 4274
4188 Show new changesets found in the specified path/URL or the default 4275 Show new changesets found in the specified path/URL or the default
4189 pull location. These are the changesets that would have been pulled 4276 pull location. These are the changesets that would have been pulled
4190 by :hg:`pull` at the time you issued this command. 4277 by :hg:`pull` at the time you issued this command.
4235 hg in changes.hg -T "{desc|firstline}\\n" 4322 hg in changes.hg -T "{desc|firstline}\\n"
4236 4323
4237 Returns 0 if there are incoming changes, 1 otherwise. 4324 Returns 0 if there are incoming changes, 1 otherwise.
4238 """ 4325 """
4239 opts = pycompat.byteskwargs(opts) 4326 opts = pycompat.byteskwargs(opts)
4240 if opts.get('graph'): 4327 if opts.get(b'graph'):
4241 logcmdutil.checkunsupportedgraphflags([], opts) 4328 logcmdutil.checkunsupportedgraphflags([], opts)
4242 4329
4243 def display(other, chlist, displayer): 4330 def display(other, chlist, displayer):
4244 revdag = logcmdutil.graphrevs(other, chlist, opts) 4331 revdag = logcmdutil.graphrevs(other, chlist, opts)
4245 logcmdutil.displaygraph( 4332 logcmdutil.displaygraph(
4247 ) 4334 )
4248 4335
4249 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True) 4336 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4250 return 0 4337 return 0
4251 4338
4252 if opts.get('bundle') and opts.get('subrepos'): 4339 if opts.get(b'bundle') and opts.get(b'subrepos'):
4253 raise error.Abort(_('cannot combine --bundle and --subrepos')) 4340 raise error.Abort(_(b'cannot combine --bundle and --subrepos'))
4254 4341
4255 if opts.get('bookmarks'): 4342 if opts.get(b'bookmarks'):
4256 source, branches = hg.parseurl( 4343 source, branches = hg.parseurl(
4257 ui.expandpath(source), opts.get('branch') 4344 ui.expandpath(source), opts.get(b'branch')
4258 ) 4345 )
4259 other = hg.peer(repo, opts, source) 4346 other = hg.peer(repo, opts, source)
4260 if 'bookmarks' not in other.listkeys('namespaces'): 4347 if b'bookmarks' not in other.listkeys(b'namespaces'):
4261 ui.warn(_("remote doesn't support bookmarks\n")) 4348 ui.warn(_(b"remote doesn't support bookmarks\n"))
4262 return 0 4349 return 0
4263 ui.pager('incoming') 4350 ui.pager(b'incoming')
4264 ui.status(_('comparing with %s\n') % util.hidepassword(source)) 4351 ui.status(_(b'comparing with %s\n') % util.hidepassword(source))
4265 return bookmarks.incoming(ui, repo, other) 4352 return bookmarks.incoming(ui, repo, other)
4266 4353
4267 repo._subtoppath = ui.expandpath(source) 4354 repo._subtoppath = ui.expandpath(source)
4268 try: 4355 try:
4269 return hg.incoming(ui, repo, source, opts) 4356 return hg.incoming(ui, repo, source, opts)
4270 finally: 4357 finally:
4271 del repo._subtoppath 4358 del repo._subtoppath
4272 4359
4273 4360
4274 @command( 4361 @command(
4275 'init', 4362 b'init',
4276 remoteopts, 4363 remoteopts,
4277 _('[-e CMD] [--remotecmd CMD] [DEST]'), 4364 _(b'[-e CMD] [--remotecmd CMD] [DEST]'),
4278 helpcategory=command.CATEGORY_REPO_CREATION, 4365 helpcategory=command.CATEGORY_REPO_CREATION,
4279 helpbasic=True, 4366 helpbasic=True,
4280 norepo=True, 4367 norepo=True,
4281 ) 4368 )
4282 def init(ui, dest=".", **opts): 4369 def init(ui, dest=b".", **opts):
4283 """create a new repository in the given directory 4370 """create a new repository in the given directory
4284 4371
4285 Initialize a new repository in the given directory. If the given 4372 Initialize a new repository in the given directory. If the given
4286 directory does not exist, it will be created. 4373 directory does not exist, it will be created.
4287 4374
4295 opts = pycompat.byteskwargs(opts) 4382 opts = pycompat.byteskwargs(opts)
4296 hg.peer(ui, opts, ui.expandpath(dest), create=True) 4383 hg.peer(ui, opts, ui.expandpath(dest), create=True)
4297 4384
4298 4385
4299 @command( 4386 @command(
4300 'locate', 4387 b'locate',
4301 [ 4388 [
4302 ('r', 'rev', '', _('search the repository as it is in REV'), _('REV')), 4389 (
4303 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')), 4390 b'r',
4304 ( 4391 b'rev',
4305 'f', 4392 b'',
4306 'fullpath', 4393 _(b'search the repository as it is in REV'),
4394 _(b'REV'),
4395 ),
4396 (
4397 b'0',
4398 b'print0',
4307 None, 4399 None,
4308 _('print complete paths from the filesystem root'), 4400 _(b'end filenames with NUL, for use with xargs'),
4401 ),
4402 (
4403 b'f',
4404 b'fullpath',
4405 None,
4406 _(b'print complete paths from the filesystem root'),
4309 ), 4407 ),
4310 ] 4408 ]
4311 + walkopts, 4409 + walkopts,
4312 _('[OPTION]... [PATTERN]...'), 4410 _(b'[OPTION]... [PATTERN]...'),
4313 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 4411 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
4314 ) 4412 )
4315 def locate(ui, repo, *pats, **opts): 4413 def locate(ui, repo, *pats, **opts):
4316 """locate files matching specific patterns (DEPRECATED) 4414 """locate files matching specific patterns (DEPRECATED)
4317 4415
4333 See :hg:`help files` for a more versatile command. 4431 See :hg:`help files` for a more versatile command.
4334 4432
4335 Returns 0 if a match is found, 1 otherwise. 4433 Returns 0 if a match is found, 1 otherwise.
4336 """ 4434 """
4337 opts = pycompat.byteskwargs(opts) 4435 opts = pycompat.byteskwargs(opts)
4338 if opts.get('print0'): 4436 if opts.get(b'print0'):
4339 end = '\0' 4437 end = b'\0'
4340 else: 4438 else:
4341 end = '\n' 4439 end = b'\n'
4342 ctx = scmutil.revsingle(repo, opts.get('rev'), None) 4440 ctx = scmutil.revsingle(repo, opts.get(b'rev'), None)
4343 4441
4344 ret = 1 4442 ret = 1
4345 m = scmutil.match( 4443 m = scmutil.match(
4346 ctx, pats, opts, default='relglob', badfn=lambda x, y: False 4444 ctx, pats, opts, default=b'relglob', badfn=lambda x, y: False
4347 ) 4445 )
4348 4446
4349 ui.pager('locate') 4447 ui.pager(b'locate')
4350 if ctx.rev() is None: 4448 if ctx.rev() is None:
4351 # When run on the working copy, "locate" includes removed files, so 4449 # When run on the working copy, "locate" includes removed files, so
4352 # we get the list of files from the dirstate. 4450 # we get the list of files from the dirstate.
4353 filesgen = sorted(repo.dirstate.matches(m)) 4451 filesgen = sorted(repo.dirstate.matches(m))
4354 else: 4452 else:
4355 filesgen = ctx.matches(m) 4453 filesgen = ctx.matches(m)
4356 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=bool(pats)) 4454 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=bool(pats))
4357 for abs in filesgen: 4455 for abs in filesgen:
4358 if opts.get('fullpath'): 4456 if opts.get(b'fullpath'):
4359 ui.write(repo.wjoin(abs), end) 4457 ui.write(repo.wjoin(abs), end)
4360 else: 4458 else:
4361 ui.write(uipathfn(abs), end) 4459 ui.write(uipathfn(abs), end)
4362 ret = 0 4460 ret = 0
4363 4461
4364 return ret 4462 return ret
4365 4463
4366 4464
4367 @command( 4465 @command(
4368 'log|history', 4466 b'log|history',
4369 [ 4467 [
4370 ( 4468 (
4371 'f', 4469 b'f',
4372 'follow', 4470 b'follow',
4373 None, 4471 None,
4374 _( 4472 _(
4375 'follow changeset history, or file history across copies and renames' 4473 b'follow changeset history, or file history across copies and renames'
4376 ), 4474 ),
4377 ), 4475 ),
4378 ( 4476 (
4379 '', 4477 b'',
4380 'follow-first', 4478 b'follow-first',
4381 None, 4479 None,
4382 _('only follow the first parent of merge changesets (DEPRECATED)'), 4480 _(b'only follow the first parent of merge changesets (DEPRECATED)'),
4383 ), 4481 ),
4384 ('d', 'date', '', _('show revisions matching date spec'), _('DATE')), 4482 (
4385 ('C', 'copies', None, _('show copied files')), 4483 b'd',
4386 ( 4484 b'date',
4387 'k', 4485 b'',
4388 'keyword', 4486 _(b'show revisions matching date spec'),
4487 _(b'DATE'),
4488 ),
4489 (b'C', b'copies', None, _(b'show copied files')),
4490 (
4491 b'k',
4492 b'keyword',
4389 [], 4493 [],
4390 _('do case-insensitive search for a given text'), 4494 _(b'do case-insensitive search for a given text'),
4391 _('TEXT'), 4495 _(b'TEXT'),
4392 ), 4496 ),
4393 ('r', 'rev', [], _('show the specified revision or revset'), _('REV')), 4497 (
4394 ( 4498 b'r',
4395 'L', 4499 b'rev',
4396 'line-range',
4397 [], 4500 [],
4398 _('follow line range of specified file (EXPERIMENTAL)'), 4501 _(b'show the specified revision or revset'),
4399 _('FILE,RANGE'), 4502 _(b'REV'),
4400 ), 4503 ),
4401 ('', 'removed', None, _('include revisions where files were removed')), 4504 (
4402 ( 4505 b'L',
4403 'm', 4506 b'line-range',
4404 'only-merges', 4507 [],
4508 _(b'follow line range of specified file (EXPERIMENTAL)'),
4509 _(b'FILE,RANGE'),
4510 ),
4511 (
4512 b'',
4513 b'removed',
4405 None, 4514 None,
4406 _('show only merges (DEPRECATED) (use -r "merge()" instead)'), 4515 _(b'include revisions where files were removed'),
4407 ), 4516 ),
4408 ('u', 'user', [], _('revisions committed by user'), _('USER')), 4517 (
4409 ( 4518 b'm',
4410 '', 4519 b'only-merges',
4411 'only-branch', 4520 None,
4521 _(b'show only merges (DEPRECATED) (use -r "merge()" instead)'),
4522 ),
4523 (b'u', b'user', [], _(b'revisions committed by user'), _(b'USER')),
4524 (
4525 b'',
4526 b'only-branch',
4412 [], 4527 [],
4413 _( 4528 _(
4414 'show only changesets within the given named branch (DEPRECATED)' 4529 b'show only changesets within the given named branch (DEPRECATED)'
4415 ), 4530 ),
4416 _('BRANCH'), 4531 _(b'BRANCH'),
4417 ), 4532 ),
4418 ( 4533 (
4419 'b', 4534 b'b',
4420 'branch', 4535 b'branch',
4421 [], 4536 [],
4422 _('show changesets within the given named branch'), 4537 _(b'show changesets within the given named branch'),
4423 _('BRANCH'), 4538 _(b'BRANCH'),
4424 ), 4539 ),
4425 ( 4540 (
4426 'P', 4541 b'P',
4427 'prune', 4542 b'prune',
4428 [], 4543 [],
4429 _('do not display revision or any of its ancestors'), 4544 _(b'do not display revision or any of its ancestors'),
4430 _('REV'), 4545 _(b'REV'),
4431 ), 4546 ),
4432 ] 4547 ]
4433 + logopts 4548 + logopts
4434 + walkopts, 4549 + walkopts,
4435 _('[OPTION]... [FILE]'), 4550 _(b'[OPTION]... [FILE]'),
4436 helpcategory=command.CATEGORY_CHANGE_NAVIGATION, 4551 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4437 helpbasic=True, 4552 helpbasic=True,
4438 inferrepo=True, 4553 inferrepo=True,
4439 intents={INTENT_READONLY}, 4554 intents={INTENT_READONLY},
4440 ) 4555 )
4565 4680
4566 Returns 0 on success. 4681 Returns 0 on success.
4567 4682
4568 """ 4683 """
4569 opts = pycompat.byteskwargs(opts) 4684 opts = pycompat.byteskwargs(opts)
4570 linerange = opts.get('line_range') 4685 linerange = opts.get(b'line_range')
4571 4686
4572 if linerange and not opts.get('follow'): 4687 if linerange and not opts.get(b'follow'):
4573 raise error.Abort(_('--line-range requires --follow')) 4688 raise error.Abort(_(b'--line-range requires --follow'))
4574 4689
4575 if linerange and pats: 4690 if linerange and pats:
4576 # TODO: take pats as patterns with no line-range filter 4691 # TODO: take pats as patterns with no line-range filter
4577 raise error.Abort( 4692 raise error.Abort(
4578 _('FILE arguments are not compatible with --line-range option') 4693 _(b'FILE arguments are not compatible with --line-range option')
4579 ) 4694 )
4580 4695
4581 repo = scmutil.unhidehashlikerevs(repo, opts.get('rev'), 'nowarn') 4696 repo = scmutil.unhidehashlikerevs(repo, opts.get(b'rev'), b'nowarn')
4582 revs, differ = logcmdutil.getrevs(repo, pats, opts) 4697 revs, differ = logcmdutil.getrevs(repo, pats, opts)
4583 if linerange: 4698 if linerange:
4584 # TODO: should follow file history from logcmdutil._initialrevs(), 4699 # TODO: should follow file history from logcmdutil._initialrevs(),
4585 # then filter the result by logcmdutil._makerevset() and --limit 4700 # then filter the result by logcmdutil._makerevset() and --limit
4586 revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts) 4701 revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts)
4587 4702
4588 getcopies = None 4703 getcopies = None
4589 if opts.get('copies'): 4704 if opts.get(b'copies'):
4590 endrev = None 4705 endrev = None
4591 if revs: 4706 if revs:
4592 endrev = revs.max() + 1 4707 endrev = revs.max() + 1
4593 getcopies = scmutil.getcopiesfn(repo, endrev=endrev) 4708 getcopies = scmutil.getcopiesfn(repo, endrev=endrev)
4594 4709
4595 ui.pager('log') 4710 ui.pager(b'log')
4596 displayer = logcmdutil.changesetdisplayer( 4711 displayer = logcmdutil.changesetdisplayer(
4597 ui, repo, opts, differ, buffered=True 4712 ui, repo, opts, differ, buffered=True
4598 ) 4713 )
4599 if opts.get('graph'): 4714 if opts.get(b'graph'):
4600 displayfn = logcmdutil.displaygraphrevs 4715 displayfn = logcmdutil.displaygraphrevs
4601 else: 4716 else:
4602 displayfn = logcmdutil.displayrevs 4717 displayfn = logcmdutil.displayrevs
4603 displayfn(ui, repo, revs, displayer, getcopies) 4718 displayfn(ui, repo, revs, displayer, getcopies)
4604 4719
4605 4720
4606 @command( 4721 @command(
4607 'manifest', 4722 b'manifest',
4608 [ 4723 [
4609 ('r', 'rev', '', _('revision to display'), _('REV')), 4724 (b'r', b'rev', b'', _(b'revision to display'), _(b'REV')),
4610 ('', 'all', False, _("list files from all revisions")), 4725 (b'', b'all', False, _(b"list files from all revisions")),
4611 ] 4726 ]
4612 + formatteropts, 4727 + formatteropts,
4613 _('[-r REV]'), 4728 _(b'[-r REV]'),
4614 helpcategory=command.CATEGORY_MAINTENANCE, 4729 helpcategory=command.CATEGORY_MAINTENANCE,
4615 intents={INTENT_READONLY}, 4730 intents={INTENT_READONLY},
4616 ) 4731 )
4617 def manifest(ui, repo, node=None, rev=None, **opts): 4732 def manifest(ui, repo, node=None, rev=None, **opts):
4618 """output the current or given revision of the project manifest 4733 """output the current or given revision of the project manifest
4628 is printed. This includes deleted and renamed files. 4743 is printed. This includes deleted and renamed files.
4629 4744
4630 Returns 0 on success. 4745 Returns 0 on success.
4631 """ 4746 """
4632 opts = pycompat.byteskwargs(opts) 4747 opts = pycompat.byteskwargs(opts)
4633 fm = ui.formatter('manifest', opts) 4748 fm = ui.formatter(b'manifest', opts)
4634 4749
4635 if opts.get('all'): 4750 if opts.get(b'all'):
4636 if rev or node: 4751 if rev or node:
4637 raise error.Abort(_("can't specify a revision with --all")) 4752 raise error.Abort(_(b"can't specify a revision with --all"))
4638 4753
4639 res = set() 4754 res = set()
4640 for rev in repo: 4755 for rev in repo:
4641 ctx = repo[rev] 4756 ctx = repo[rev]
4642 res |= set(ctx.files()) 4757 res |= set(ctx.files())
4643 4758
4644 ui.pager('manifest') 4759 ui.pager(b'manifest')
4645 for f in sorted(res): 4760 for f in sorted(res):
4646 fm.startitem() 4761 fm.startitem()
4647 fm.write("path", '%s\n', f) 4762 fm.write(b"path", b'%s\n', f)
4648 fm.end() 4763 fm.end()
4649 return 4764 return
4650 4765
4651 if rev and node: 4766 if rev and node:
4652 raise error.Abort(_("please specify just one revision")) 4767 raise error.Abort(_(b"please specify just one revision"))
4653 4768
4654 if not node: 4769 if not node:
4655 node = rev 4770 node = rev
4656 4771
4657 char = {'l': '@', 'x': '*', '': '', 't': 'd'} 4772 char = {b'l': b'@', b'x': b'*', b'': b'', b't': b'd'}
4658 mode = {'l': '644', 'x': '755', '': '644', 't': '755'} 4773 mode = {b'l': b'644', b'x': b'755', b'': b'644', b't': b'755'}
4659 if node: 4774 if node:
4660 repo = scmutil.unhidehashlikerevs(repo, [node], 'nowarn') 4775 repo = scmutil.unhidehashlikerevs(repo, [node], b'nowarn')
4661 ctx = scmutil.revsingle(repo, node) 4776 ctx = scmutil.revsingle(repo, node)
4662 mf = ctx.manifest() 4777 mf = ctx.manifest()
4663 ui.pager('manifest') 4778 ui.pager(b'manifest')
4664 for f in ctx: 4779 for f in ctx:
4665 fm.startitem() 4780 fm.startitem()
4666 fm.context(ctx=ctx) 4781 fm.context(ctx=ctx)
4667 fl = ctx[f].flags() 4782 fl = ctx[f].flags()
4668 fm.condwrite(ui.debugflag, 'hash', '%s ', hex(mf[f])) 4783 fm.condwrite(ui.debugflag, b'hash', b'%s ', hex(mf[f]))
4669 fm.condwrite(ui.verbose, 'mode type', '%s %1s ', mode[fl], char[fl]) 4784 fm.condwrite(ui.verbose, b'mode type', b'%s %1s ', mode[fl], char[fl])
4670 fm.write('path', '%s\n', f) 4785 fm.write(b'path', b'%s\n', f)
4671 fm.end() 4786 fm.end()
4672 4787
4673 4788
4674 @command( 4789 @command(
4675 'merge', 4790 b'merge',
4676 [ 4791 [
4677 ( 4792 (
4678 'f', 4793 b'f',
4679 'force', 4794 b'force',
4680 None, 4795 None,
4681 _('force a merge including outstanding changes (DEPRECATED)'), 4796 _(b'force a merge including outstanding changes (DEPRECATED)'),
4682 ), 4797 ),
4683 ('r', 'rev', '', _('revision to merge'), _('REV')), 4798 (b'r', b'rev', b'', _(b'revision to merge'), _(b'REV')),
4684 ( 4799 (
4685 'P', 4800 b'P',
4686 'preview', 4801 b'preview',
4687 None, 4802 None,
4688 _('review revisions to merge (no merge is performed)'), 4803 _(b'review revisions to merge (no merge is performed)'),
4689 ), 4804 ),
4690 ('', 'abort', None, _('abort the ongoing merge')), 4805 (b'', b'abort', None, _(b'abort the ongoing merge')),
4691 ] 4806 ]
4692 + mergetoolopts, 4807 + mergetoolopts,
4693 _('[-P] [[-r] REV]'), 4808 _(b'[-P] [[-r] REV]'),
4694 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT, 4809 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
4695 helpbasic=True, 4810 helpbasic=True,
4696 ) 4811 )
4697 def merge(ui, repo, node=None, **opts): 4812 def merge(ui, repo, node=None, **opts):
4698 """merge another revision into working directory 4813 """merge another revision into working directory
4722 4837
4723 Returns 0 on success, 1 if there are unresolved files. 4838 Returns 0 on success, 1 if there are unresolved files.
4724 """ 4839 """
4725 4840
4726 opts = pycompat.byteskwargs(opts) 4841 opts = pycompat.byteskwargs(opts)
4727 abort = opts.get('abort') 4842 abort = opts.get(b'abort')
4728 if abort and repo.dirstate.p2() == nullid: 4843 if abort and repo.dirstate.p2() == nullid:
4729 cmdutil.wrongtooltocontinue(repo, _('merge')) 4844 cmdutil.wrongtooltocontinue(repo, _(b'merge'))
4730 if abort: 4845 if abort:
4731 state = cmdutil.getunfinishedstate(repo) 4846 state = cmdutil.getunfinishedstate(repo)
4732 if state and state._opname != 'merge': 4847 if state and state._opname != b'merge':
4733 raise error.Abort( 4848 raise error.Abort(
4734 _('cannot abort merge with %s in progress') % (state._opname), 4849 _(b'cannot abort merge with %s in progress') % (state._opname),
4735 hint=state.hint(), 4850 hint=state.hint(),
4736 ) 4851 )
4737 if node: 4852 if node:
4738 raise error.Abort(_("cannot specify a node with --abort")) 4853 raise error.Abort(_(b"cannot specify a node with --abort"))
4739 if opts.get('rev'): 4854 if opts.get(b'rev'):
4740 raise error.Abort(_("cannot specify both --rev and --abort")) 4855 raise error.Abort(_(b"cannot specify both --rev and --abort"))
4741 if opts.get('preview'): 4856 if opts.get(b'preview'):
4742 raise error.Abort(_("cannot specify --preview with --abort")) 4857 raise error.Abort(_(b"cannot specify --preview with --abort"))
4743 if opts.get('rev') and node: 4858 if opts.get(b'rev') and node:
4744 raise error.Abort(_("please specify just one revision")) 4859 raise error.Abort(_(b"please specify just one revision"))
4745 if not node: 4860 if not node:
4746 node = opts.get('rev') 4861 node = opts.get(b'rev')
4747 4862
4748 if node: 4863 if node:
4749 node = scmutil.revsingle(repo, node).node() 4864 node = scmutil.revsingle(repo, node).node()
4750 4865
4751 if not node and not abort: 4866 if not node and not abort:
4752 node = repo[destutil.destmerge(repo)].node() 4867 node = repo[destutil.destmerge(repo)].node()
4753 4868
4754 if opts.get('preview'): 4869 if opts.get(b'preview'):
4755 # find nodes that are ancestors of p2 but not of p1 4870 # find nodes that are ancestors of p2 but not of p1
4756 p1 = repo.lookup('.') 4871 p1 = repo.lookup(b'.')
4757 p2 = node 4872 p2 = node
4758 nodes = repo.changelog.findmissing(common=[p1], heads=[p2]) 4873 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4759 4874
4760 displayer = logcmdutil.changesetdisplayer(ui, repo, opts) 4875 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
4761 for node in nodes: 4876 for node in nodes:
4762 displayer.show(repo[node]) 4877 displayer.show(repo[node])
4763 displayer.close() 4878 displayer.close()
4764 return 0 4879 return 0
4765 4880
4766 # ui.forcemerge is an internal variable, do not document 4881 # ui.forcemerge is an internal variable, do not document
4767 overrides = {('ui', 'forcemerge'): opts.get('tool', '')} 4882 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
4768 with ui.configoverride(overrides, 'merge'): 4883 with ui.configoverride(overrides, b'merge'):
4769 force = opts.get('force') 4884 force = opts.get(b'force')
4770 labels = ['working copy', 'merge rev'] 4885 labels = [b'working copy', b'merge rev']
4771 return hg.merge( 4886 return hg.merge(
4772 repo, 4887 repo,
4773 node, 4888 node,
4774 force=force, 4889 force=force,
4775 mergeforce=force, 4890 mergeforce=force,
4777 abort=abort, 4892 abort=abort,
4778 ) 4893 )
4779 4894
4780 4895
4781 statemod.addunfinished( 4896 statemod.addunfinished(
4782 'merge', 4897 b'merge',
4783 fname=None, 4898 fname=None,
4784 clearable=True, 4899 clearable=True,
4785 allowcommit=True, 4900 allowcommit=True,
4786 cmdmsg=_('outstanding uncommitted merge'), 4901 cmdmsg=_(b'outstanding uncommitted merge'),
4787 abortfunc=hg.abortmerge, 4902 abortfunc=hg.abortmerge,
4788 statushint=_( 4903 statushint=_(
4789 'To continue: hg commit\n' 'To abort: hg merge --abort' 4904 b'To continue: hg commit\n' b'To abort: hg merge --abort'
4790 ), 4905 ),
4791 cmdhint=_("use 'hg commit' or 'hg merge --abort'"), 4906 cmdhint=_(b"use 'hg commit' or 'hg merge --abort'"),
4792 ) 4907 )
4793 4908
4794 4909
4795 @command( 4910 @command(
4796 'outgoing|out', 4911 b'outgoing|out',
4797 [ 4912 [
4798 ('f', 'force', None, _('run even when the destination is unrelated')), 4913 (
4799 ( 4914 b'f',
4800 'r', 4915 b'force',
4801 'rev', 4916 None,
4917 _(b'run even when the destination is unrelated'),
4918 ),
4919 (
4920 b'r',
4921 b'rev',
4802 [], 4922 [],
4803 _('a changeset intended to be included in the destination'), 4923 _(b'a changeset intended to be included in the destination'),
4804 _('REV'), 4924 _(b'REV'),
4805 ), 4925 ),
4806 ('n', 'newest-first', None, _('show newest record first')), 4926 (b'n', b'newest-first', None, _(b'show newest record first')),
4807 ('B', 'bookmarks', False, _('compare bookmarks')), 4927 (b'B', b'bookmarks', False, _(b'compare bookmarks')),
4808 ( 4928 (
4809 'b', 4929 b'b',
4810 'branch', 4930 b'branch',
4811 [], 4931 [],
4812 _('a specific branch you would like to push'), 4932 _(b'a specific branch you would like to push'),
4813 _('BRANCH'), 4933 _(b'BRANCH'),
4814 ), 4934 ),
4815 ] 4935 ]
4816 + logopts 4936 + logopts
4817 + remoteopts 4937 + remoteopts
4818 + subrepoopts, 4938 + subrepoopts,
4819 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]'), 4939 _(b'[-M] [-p] [-n] [-f] [-r REV]... [DEST]'),
4820 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, 4940 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4821 ) 4941 )
4822 def outgoing(ui, repo, dest=None, **opts): 4942 def outgoing(ui, repo, dest=None, **opts):
4823 """show changesets not found in the destination 4943 """show changesets not found in the destination
4824 4944
4855 4975
4856 Returns 0 if there are outgoing changes, 1 otherwise. 4976 Returns 0 if there are outgoing changes, 1 otherwise.
4857 """ 4977 """
4858 # hg._outgoing() needs to re-resolve the path in order to handle #branch 4978 # hg._outgoing() needs to re-resolve the path in order to handle #branch
4859 # style URLs, so don't overwrite dest. 4979 # style URLs, so don't overwrite dest.
4860 path = ui.paths.getpath(dest, default=('default-push', 'default')) 4980 path = ui.paths.getpath(dest, default=(b'default-push', b'default'))
4861 if not path: 4981 if not path:
4862 raise error.Abort( 4982 raise error.Abort(
4863 _('default repository not configured!'), 4983 _(b'default repository not configured!'),
4864 hint=_("see 'hg help config.paths'"), 4984 hint=_(b"see 'hg help config.paths'"),
4865 ) 4985 )
4866 4986
4867 opts = pycompat.byteskwargs(opts) 4987 opts = pycompat.byteskwargs(opts)
4868 if opts.get('graph'): 4988 if opts.get(b'graph'):
4869 logcmdutil.checkunsupportedgraphflags([], opts) 4989 logcmdutil.checkunsupportedgraphflags([], opts)
4870 o, other = hg._outgoing(ui, repo, dest, opts) 4990 o, other = hg._outgoing(ui, repo, dest, opts)
4871 if not o: 4991 if not o:
4872 cmdutil.outgoinghooks(ui, repo, other, opts, o) 4992 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4873 return 4993 return
4874 4994
4875 revdag = logcmdutil.graphrevs(repo, o, opts) 4995 revdag = logcmdutil.graphrevs(repo, o, opts)
4876 ui.pager('outgoing') 4996 ui.pager(b'outgoing')
4877 displayer = logcmdutil.changesetdisplayer(ui, repo, opts, buffered=True) 4997 displayer = logcmdutil.changesetdisplayer(ui, repo, opts, buffered=True)
4878 logcmdutil.displaygraph( 4998 logcmdutil.displaygraph(
4879 ui, repo, revdag, displayer, graphmod.asciiedges 4999 ui, repo, revdag, displayer, graphmod.asciiedges
4880 ) 5000 )
4881 cmdutil.outgoinghooks(ui, repo, other, opts, o) 5001 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4882 return 0 5002 return 0
4883 5003
4884 if opts.get('bookmarks'): 5004 if opts.get(b'bookmarks'):
4885 dest = path.pushloc or path.loc 5005 dest = path.pushloc or path.loc
4886 other = hg.peer(repo, opts, dest) 5006 other = hg.peer(repo, opts, dest)
4887 if 'bookmarks' not in other.listkeys('namespaces'): 5007 if b'bookmarks' not in other.listkeys(b'namespaces'):
4888 ui.warn(_("remote doesn't support bookmarks\n")) 5008 ui.warn(_(b"remote doesn't support bookmarks\n"))
4889 return 0 5009 return 0
4890 ui.status(_('comparing with %s\n') % util.hidepassword(dest)) 5010 ui.status(_(b'comparing with %s\n') % util.hidepassword(dest))
4891 ui.pager('outgoing') 5011 ui.pager(b'outgoing')
4892 return bookmarks.outgoing(ui, repo, other) 5012 return bookmarks.outgoing(ui, repo, other)
4893 5013
4894 repo._subtoppath = path.pushloc or path.loc 5014 repo._subtoppath = path.pushloc or path.loc
4895 try: 5015 try:
4896 return hg.outgoing(ui, repo, dest, opts) 5016 return hg.outgoing(ui, repo, dest, opts)
4897 finally: 5017 finally:
4898 del repo._subtoppath 5018 del repo._subtoppath
4899 5019
4900 5020
4901 @command( 5021 @command(
4902 'parents', 5022 b'parents',
4903 [('r', 'rev', '', _('show parents of the specified revision'), _('REV')),] 5023 [
5024 (
5025 b'r',
5026 b'rev',
5027 b'',
5028 _(b'show parents of the specified revision'),
5029 _(b'REV'),
5030 ),
5031 ]
4904 + templateopts, 5032 + templateopts,
4905 _('[-r REV] [FILE]'), 5033 _(b'[-r REV] [FILE]'),
4906 helpcategory=command.CATEGORY_CHANGE_NAVIGATION, 5034 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4907 inferrepo=True, 5035 inferrepo=True,
4908 ) 5036 )
4909 def parents(ui, repo, file_=None, **opts): 5037 def parents(ui, repo, file_=None, **opts):
4910 """show the parents of the working directory or revision (DEPRECATED) 5038 """show the parents of the working directory or revision (DEPRECATED)
4926 5054
4927 Returns 0 on success. 5055 Returns 0 on success.
4928 """ 5056 """
4929 5057
4930 opts = pycompat.byteskwargs(opts) 5058 opts = pycompat.byteskwargs(opts)
4931 rev = opts.get('rev') 5059 rev = opts.get(b'rev')
4932 if rev: 5060 if rev:
4933 repo = scmutil.unhidehashlikerevs(repo, [rev], 'nowarn') 5061 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
4934 ctx = scmutil.revsingle(repo, rev, None) 5062 ctx = scmutil.revsingle(repo, rev, None)
4935 5063
4936 if file_: 5064 if file_:
4937 m = scmutil.match(ctx, (file_,), opts) 5065 m = scmutil.match(ctx, (file_,), opts)
4938 if m.anypats() or len(m.files()) != 1: 5066 if m.anypats() or len(m.files()) != 1:
4939 raise error.Abort(_('can only specify an explicit filename')) 5067 raise error.Abort(_(b'can only specify an explicit filename'))
4940 file_ = m.files()[0] 5068 file_ = m.files()[0]
4941 filenodes = [] 5069 filenodes = []
4942 for cp in ctx.parents(): 5070 for cp in ctx.parents():
4943 if not cp: 5071 if not cp:
4944 continue 5072 continue
4945 try: 5073 try:
4946 filenodes.append(cp.filenode(file_)) 5074 filenodes.append(cp.filenode(file_))
4947 except error.LookupError: 5075 except error.LookupError:
4948 pass 5076 pass
4949 if not filenodes: 5077 if not filenodes:
4950 raise error.Abort(_("'%s' not found in manifest!") % file_) 5078 raise error.Abort(_(b"'%s' not found in manifest!") % file_)
4951 p = [] 5079 p = []
4952 for fn in filenodes: 5080 for fn in filenodes:
4953 fctx = repo.filectx(file_, fileid=fn) 5081 fctx = repo.filectx(file_, fileid=fn)
4954 p.append(fctx.node()) 5082 p.append(fctx.node())
4955 else: 5083 else:
4961 displayer.show(repo[n]) 5089 displayer.show(repo[n])
4962 displayer.close() 5090 displayer.close()
4963 5091
4964 5092
4965 @command( 5093 @command(
4966 'paths', 5094 b'paths',
4967 formatteropts, 5095 formatteropts,
4968 _('[NAME]'), 5096 _(b'[NAME]'),
4969 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, 5097 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4970 optionalrepo=True, 5098 optionalrepo=True,
4971 intents={INTENT_READONLY}, 5099 intents={INTENT_READONLY},
4972 ) 5100 )
4973 def paths(ui, repo, search=None, **opts): 5101 def paths(ui, repo, search=None, **opts):
5011 5139
5012 Returns 0 on success. 5140 Returns 0 on success.
5013 """ 5141 """
5014 5142
5015 opts = pycompat.byteskwargs(opts) 5143 opts = pycompat.byteskwargs(opts)
5016 ui.pager('paths') 5144 ui.pager(b'paths')
5017 if search: 5145 if search:
5018 pathitems = [ 5146 pathitems = [
5019 (name, path) 5147 (name, path)
5020 for name, path in ui.paths.iteritems() 5148 for name, path in ui.paths.iteritems()
5021 if name == search 5149 if name == search
5022 ] 5150 ]
5023 else: 5151 else:
5024 pathitems = sorted(ui.paths.iteritems()) 5152 pathitems = sorted(ui.paths.iteritems())
5025 5153
5026 fm = ui.formatter('paths', opts) 5154 fm = ui.formatter(b'paths', opts)
5027 if fm.isplain(): 5155 if fm.isplain():
5028 hidepassword = util.hidepassword 5156 hidepassword = util.hidepassword
5029 else: 5157 else:
5030 hidepassword = bytes 5158 hidepassword = bytes
5031 if ui.quiet: 5159 if ui.quiet:
5032 namefmt = '%s\n' 5160 namefmt = b'%s\n'
5033 else: 5161 else:
5034 namefmt = '%s = ' 5162 namefmt = b'%s = '
5035 showsubopts = not search and not ui.quiet 5163 showsubopts = not search and not ui.quiet
5036 5164
5037 for name, path in pathitems: 5165 for name, path in pathitems:
5038 fm.startitem() 5166 fm.startitem()
5039 fm.condwrite(not search, 'name', namefmt, name) 5167 fm.condwrite(not search, b'name', namefmt, name)
5040 fm.condwrite(not ui.quiet, 'url', '%s\n', hidepassword(path.rawloc)) 5168 fm.condwrite(not ui.quiet, b'url', b'%s\n', hidepassword(path.rawloc))
5041 for subopt, value in sorted(path.suboptions.items()): 5169 for subopt, value in sorted(path.suboptions.items()):
5042 assert subopt not in ('name', 'url') 5170 assert subopt not in (b'name', b'url')
5043 if showsubopts: 5171 if showsubopts:
5044 fm.plain('%s:%s = ' % (name, subopt)) 5172 fm.plain(b'%s:%s = ' % (name, subopt))
5045 fm.condwrite(showsubopts, subopt, '%s\n', value) 5173 fm.condwrite(showsubopts, subopt, b'%s\n', value)
5046 5174
5047 fm.end() 5175 fm.end()
5048 5176
5049 if search and not pathitems: 5177 if search and not pathitems:
5050 if not ui.quiet: 5178 if not ui.quiet:
5051 ui.warn(_("not found!\n")) 5179 ui.warn(_(b"not found!\n"))
5052 return 1 5180 return 1
5053 else: 5181 else:
5054 return 0 5182 return 0
5055 5183
5056 5184
5057 @command( 5185 @command(
5058 'phase', 5186 b'phase',
5059 [ 5187 [
5060 ('p', 'public', False, _('set changeset phase to public')), 5188 (b'p', b'public', False, _(b'set changeset phase to public')),
5061 ('d', 'draft', False, _('set changeset phase to draft')), 5189 (b'd', b'draft', False, _(b'set changeset phase to draft')),
5062 ('s', 'secret', False, _('set changeset phase to secret')), 5190 (b's', b'secret', False, _(b'set changeset phase to secret')),
5063 ('f', 'force', False, _('allow to move boundary backward')), 5191 (b'f', b'force', False, _(b'allow to move boundary backward')),
5064 ('r', 'rev', [], _('target revision'), _('REV')), 5192 (b'r', b'rev', [], _(b'target revision'), _(b'REV')),
5065 ], 5193 ],
5066 _('[-p|-d|-s] [-f] [-r] [REV...]'), 5194 _(b'[-p|-d|-s] [-f] [-r] [REV...]'),
5067 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION, 5195 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
5068 ) 5196 )
5069 def phase(ui, repo, *revs, **opts): 5197 def phase(ui, repo, *revs, **opts):
5070 """set or show the current phase name 5198 """set or show the current phase name
5071 5199
5087 # search for a unique phase argument 5215 # search for a unique phase argument
5088 targetphase = None 5216 targetphase = None
5089 for idx, name in enumerate(phases.cmdphasenames): 5217 for idx, name in enumerate(phases.cmdphasenames):
5090 if opts[name]: 5218 if opts[name]:
5091 if targetphase is not None: 5219 if targetphase is not None:
5092 raise error.Abort(_('only one phase can be specified')) 5220 raise error.Abort(_(b'only one phase can be specified'))
5093 targetphase = idx 5221 targetphase = idx
5094 5222
5095 # look for specified revision 5223 # look for specified revision
5096 revs = list(revs) 5224 revs = list(revs)
5097 revs.extend(opts['rev']) 5225 revs.extend(opts[b'rev'])
5098 if not revs: 5226 if not revs:
5099 # display both parents as the second parent phase can influence 5227 # display both parents as the second parent phase can influence
5100 # the phase of a merge commit 5228 # the phase of a merge commit
5101 revs = [c.rev() for c in repo[None].parents()] 5229 revs = [c.rev() for c in repo[None].parents()]
5102 5230
5105 ret = 0 5233 ret = 0
5106 if targetphase is None: 5234 if targetphase is None:
5107 # display 5235 # display
5108 for r in revs: 5236 for r in revs:
5109 ctx = repo[r] 5237 ctx = repo[r]
5110 ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr())) 5238 ui.write(b'%i: %s\n' % (ctx.rev(), ctx.phasestr()))
5111 else: 5239 else:
5112 with repo.lock(), repo.transaction("phase") as tr: 5240 with repo.lock(), repo.transaction(b"phase") as tr:
5113 # set phase 5241 # set phase
5114 if not revs: 5242 if not revs:
5115 raise error.Abort(_('empty revision set')) 5243 raise error.Abort(_(b'empty revision set'))
5116 nodes = [repo[r].node() for r in revs] 5244 nodes = [repo[r].node() for r in revs]
5117 # moving revision from public to draft may hide them 5245 # moving revision from public to draft may hide them
5118 # We have to check result on an unfiltered repository 5246 # We have to check result on an unfiltered repository
5119 unfi = repo.unfiltered() 5247 unfi = repo.unfiltered()
5120 getphase = unfi._phasecache.phase 5248 getphase = unfi._phasecache.phase
5121 olddata = [getphase(unfi, r) for r in unfi] 5249 olddata = [getphase(unfi, r) for r in unfi]
5122 phases.advanceboundary(repo, tr, targetphase, nodes) 5250 phases.advanceboundary(repo, tr, targetphase, nodes)
5123 if opts['force']: 5251 if opts[b'force']:
5124 phases.retractboundary(repo, tr, targetphase, nodes) 5252 phases.retractboundary(repo, tr, targetphase, nodes)
5125 getphase = unfi._phasecache.phase 5253 getphase = unfi._phasecache.phase
5126 newdata = [getphase(unfi, r) for r in unfi] 5254 newdata = [getphase(unfi, r) for r in unfi]
5127 changes = sum(newdata[r] != olddata[r] for r in unfi) 5255 changes = sum(newdata[r] != olddata[r] for r in unfi)
5128 cl = unfi.changelog 5256 cl = unfi.changelog
5129 rejected = [n for n in nodes if newdata[cl.rev(n)] < targetphase] 5257 rejected = [n for n in nodes if newdata[cl.rev(n)] < targetphase]
5130 if rejected: 5258 if rejected:
5131 ui.warn( 5259 ui.warn(
5132 _( 5260 _(
5133 'cannot move %i changesets to a higher ' 5261 b'cannot move %i changesets to a higher '
5134 'phase, use --force\n' 5262 b'phase, use --force\n'
5135 ) 5263 )
5136 % len(rejected) 5264 % len(rejected)
5137 ) 5265 )
5138 ret = 1 5266 ret = 1
5139 if changes: 5267 if changes:
5140 msg = _('phase changed for %i changesets\n') % changes 5268 msg = _(b'phase changed for %i changesets\n') % changes
5141 if ret: 5269 if ret:
5142 ui.status(msg) 5270 ui.status(msg)
5143 else: 5271 else:
5144 ui.note(msg) 5272 ui.note(msg)
5145 else: 5273 else:
5146 ui.warn(_('no phases changed\n')) 5274 ui.warn(_(b'no phases changed\n'))
5147 return ret 5275 return ret
5148 5276
5149 5277
5150 def postincoming(ui, repo, modheads, optupdate, checkout, brev): 5278 def postincoming(ui, repo, modheads, optupdate, checkout, brev):
5151 """Run after a changegroup has been added via pull/unbundle 5279 """Run after a changegroup has been added via pull/unbundle
5161 return 5289 return
5162 if optupdate: 5290 if optupdate:
5163 try: 5291 try:
5164 return hg.updatetotally(ui, repo, checkout, brev) 5292 return hg.updatetotally(ui, repo, checkout, brev)
5165 except error.UpdateAbort as inst: 5293 except error.UpdateAbort as inst:
5166 msg = _("not updating: %s") % stringutil.forcebytestr(inst) 5294 msg = _(b"not updating: %s") % stringutil.forcebytestr(inst)
5167 hint = inst.hint 5295 hint = inst.hint
5168 raise error.UpdateAbort(msg, hint=hint) 5296 raise error.UpdateAbort(msg, hint=hint)
5169 if modheads is not None and modheads > 1: 5297 if modheads is not None and modheads > 1:
5170 currentbranchheads = len(repo.branchheads()) 5298 currentbranchheads = len(repo.branchheads())
5171 if currentbranchheads == modheads: 5299 if currentbranchheads == modheads:
5172 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n")) 5300 ui.status(
5301 _(b"(run 'hg heads' to see heads, 'hg merge' to merge)\n")
5302 )
5173 elif currentbranchheads > 1: 5303 elif currentbranchheads > 1:
5174 ui.status( 5304 ui.status(
5175 _("(run 'hg heads .' to see heads, 'hg merge' to " "merge)\n") 5305 _(b"(run 'hg heads .' to see heads, 'hg merge' to " b"merge)\n")
5176 ) 5306 )
5177 else: 5307 else:
5178 ui.status(_("(run 'hg heads' to see heads)\n")) 5308 ui.status(_(b"(run 'hg heads' to see heads)\n"))
5179 elif not ui.configbool('commands', 'update.requiredest'): 5309 elif not ui.configbool(b'commands', b'update.requiredest'):
5180 ui.status(_("(run 'hg update' to get a working copy)\n")) 5310 ui.status(_(b"(run 'hg update' to get a working copy)\n"))
5181 5311
5182 5312
5183 @command( 5313 @command(
5184 'pull', 5314 b'pull',
5185 [ 5315 [
5186 ( 5316 (
5187 'u', 5317 b'u',
5188 'update', 5318 b'update',
5189 None, 5319 None,
5190 _('update to new branch head if new descendants were pulled'), 5320 _(b'update to new branch head if new descendants were pulled'),
5191 ), 5321 ),
5192 ('f', 'force', None, _('run even when remote repository is unrelated')), 5322 (
5193 ( 5323 b'f',
5194 'r', 5324 b'force',
5195 'rev', 5325 None,
5326 _(b'run even when remote repository is unrelated'),
5327 ),
5328 (
5329 b'r',
5330 b'rev',
5196 [], 5331 [],
5197 _('a remote changeset intended to be added'), 5332 _(b'a remote changeset intended to be added'),
5198 _('REV'), 5333 _(b'REV'),
5199 ), 5334 ),
5200 ('B', 'bookmark', [], _("bookmark to pull"), _('BOOKMARK')), 5335 (b'B', b'bookmark', [], _(b"bookmark to pull"), _(b'BOOKMARK')),
5201 ( 5336 (
5202 'b', 5337 b'b',
5203 'branch', 5338 b'branch',
5204 [], 5339 [],
5205 _('a specific branch you would like to pull'), 5340 _(b'a specific branch you would like to pull'),
5206 _('BRANCH'), 5341 _(b'BRANCH'),
5207 ), 5342 ),
5208 ] 5343 ]
5209 + remoteopts, 5344 + remoteopts,
5210 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'), 5345 _(b'[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'),
5211 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, 5346 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5212 helpbasic=True, 5347 helpbasic=True,
5213 ) 5348 )
5214 def pull(ui, repo, source="default", **opts): 5349 def pull(ui, repo, source=b"default", **opts):
5215 """pull changes from the specified source 5350 """pull changes from the specified source
5216 5351
5217 Pull changes from a remote repository to a local one. 5352 Pull changes from a remote repository to a local one.
5218 5353
5219 This finds all changes from the repository at the specified path 5354 This finds all changes from the repository at the specified path
5240 5375
5241 Returns 0 on success, 1 if an update had unresolved files. 5376 Returns 0 on success, 1 if an update had unresolved files.
5242 """ 5377 """
5243 5378
5244 opts = pycompat.byteskwargs(opts) 5379 opts = pycompat.byteskwargs(opts)
5245 if ui.configbool('commands', 'update.requiredest') and opts.get('update'): 5380 if ui.configbool(b'commands', b'update.requiredest') and opts.get(
5246 msg = _('update destination required by configuration') 5381 b'update'
5247 hint = _('use hg pull followed by hg update DEST') 5382 ):
5383 msg = _(b'update destination required by configuration')
5384 hint = _(b'use hg pull followed by hg update DEST')
5248 raise error.Abort(msg, hint=hint) 5385 raise error.Abort(msg, hint=hint)
5249 5386
5250 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch')) 5387 source, branches = hg.parseurl(ui.expandpath(source), opts.get(b'branch'))
5251 ui.status(_('pulling from %s\n') % util.hidepassword(source)) 5388 ui.status(_(b'pulling from %s\n') % util.hidepassword(source))
5252 other = hg.peer(repo, opts, source) 5389 other = hg.peer(repo, opts, source)
5253 try: 5390 try:
5254 revs, checkout = hg.addbranchrevs( 5391 revs, checkout = hg.addbranchrevs(
5255 repo, other, branches, opts.get('rev') 5392 repo, other, branches, opts.get(b'rev')
5256 ) 5393 )
5257 5394
5258 pullopargs = {} 5395 pullopargs = {}
5259 5396
5260 nodes = None 5397 nodes = None
5261 if opts.get('bookmark') or revs: 5398 if opts.get(b'bookmark') or revs:
5262 # The list of bookmark used here is the same used to actually update 5399 # The list of bookmark used here is the same used to actually update
5263 # the bookmark names, to avoid the race from issue 4689 and we do 5400 # the bookmark names, to avoid the race from issue 4689 and we do
5264 # all lookup and bookmark queries in one go so they see the same 5401 # all lookup and bookmark queries in one go so they see the same
5265 # version of the server state (issue 4700). 5402 # version of the server state (issue 4700).
5266 nodes = [] 5403 nodes = []
5267 fnodes = [] 5404 fnodes = []
5268 revs = revs or [] 5405 revs = revs or []
5269 if revs and not other.capable('lookup'): 5406 if revs and not other.capable(b'lookup'):
5270 err = _( 5407 err = _(
5271 "other repository doesn't support revision lookup, " 5408 b"other repository doesn't support revision lookup, "
5272 "so a rev cannot be specified." 5409 b"so a rev cannot be specified."
5273 ) 5410 )
5274 raise error.Abort(err) 5411 raise error.Abort(err)
5275 with other.commandexecutor() as e: 5412 with other.commandexecutor() as e:
5276 fremotebookmarks = e.callcommand( 5413 fremotebookmarks = e.callcommand(
5277 'listkeys', {'namespace': 'bookmarks'} 5414 b'listkeys', {b'namespace': b'bookmarks'}
5278 ) 5415 )
5279 for r in revs: 5416 for r in revs:
5280 fnodes.append(e.callcommand('lookup', {'key': r})) 5417 fnodes.append(e.callcommand(b'lookup', {b'key': r}))
5281 remotebookmarks = fremotebookmarks.result() 5418 remotebookmarks = fremotebookmarks.result()
5282 remotebookmarks = bookmarks.unhexlifybookmarks(remotebookmarks) 5419 remotebookmarks = bookmarks.unhexlifybookmarks(remotebookmarks)
5283 pullopargs['remotebookmarks'] = remotebookmarks 5420 pullopargs[b'remotebookmarks'] = remotebookmarks
5284 for b in opts.get('bookmark', []): 5421 for b in opts.get(b'bookmark', []):
5285 b = repo._bookmarks.expandname(b) 5422 b = repo._bookmarks.expandname(b)
5286 if b not in remotebookmarks: 5423 if b not in remotebookmarks:
5287 raise error.Abort(_('remote bookmark %s not found!') % b) 5424 raise error.Abort(_(b'remote bookmark %s not found!') % b)
5288 nodes.append(remotebookmarks[b]) 5425 nodes.append(remotebookmarks[b])
5289 for i, rev in enumerate(revs): 5426 for i, rev in enumerate(revs):
5290 node = fnodes[i].result() 5427 node = fnodes[i].result()
5291 nodes.append(node) 5428 nodes.append(node)
5292 if rev == checkout: 5429 if rev == checkout:
5293 checkout = node 5430 checkout = node
5294 5431
5295 wlock = util.nullcontextmanager() 5432 wlock = util.nullcontextmanager()
5296 if opts.get('update'): 5433 if opts.get(b'update'):
5297 wlock = repo.wlock() 5434 wlock = repo.wlock()
5298 with wlock: 5435 with wlock:
5299 pullopargs.update(opts.get('opargs', {})) 5436 pullopargs.update(opts.get(b'opargs', {}))
5300 modheads = exchange.pull( 5437 modheads = exchange.pull(
5301 repo, 5438 repo,
5302 other, 5439 other,
5303 heads=nodes, 5440 heads=nodes,
5304 force=opts.get('force'), 5441 force=opts.get(b'force'),
5305 bookmarks=opts.get('bookmark', ()), 5442 bookmarks=opts.get(b'bookmark', ()),
5306 opargs=pullopargs, 5443 opargs=pullopargs,
5307 ).cgresult 5444 ).cgresult
5308 5445
5309 # brev is a name, which might be a bookmark to be activated at 5446 # brev is a name, which might be a bookmark to be activated at
5310 # the end of the update. In other words, it is an explicit 5447 # the end of the update. In other words, it is an explicit
5315 checkout = repo.unfiltered().changelog.rev(checkout) 5452 checkout = repo.unfiltered().changelog.rev(checkout)
5316 5453
5317 # order below depends on implementation of 5454 # order below depends on implementation of
5318 # hg.addbranchrevs(). opts['bookmark'] is ignored, 5455 # hg.addbranchrevs(). opts['bookmark'] is ignored,
5319 # because 'checkout' is determined without it. 5456 # because 'checkout' is determined without it.
5320 if opts.get('rev'): 5457 if opts.get(b'rev'):
5321 brev = opts['rev'][0] 5458 brev = opts[b'rev'][0]
5322 elif opts.get('branch'): 5459 elif opts.get(b'branch'):
5323 brev = opts['branch'][0] 5460 brev = opts[b'branch'][0]
5324 else: 5461 else:
5325 brev = branches[0] 5462 brev = branches[0]
5326 repo._subtoppath = source 5463 repo._subtoppath = source
5327 try: 5464 try:
5328 ret = postincoming( 5465 ret = postincoming(
5329 ui, repo, modheads, opts.get('update'), checkout, brev 5466 ui, repo, modheads, opts.get(b'update'), checkout, brev
5330 ) 5467 )
5331 except error.FilteredRepoLookupError as exc: 5468 except error.FilteredRepoLookupError as exc:
5332 msg = _('cannot update to target: %s') % exc.args[0] 5469 msg = _(b'cannot update to target: %s') % exc.args[0]
5333 exc.args = (msg,) + exc.args[1:] 5470 exc.args = (msg,) + exc.args[1:]
5334 raise 5471 raise
5335 finally: 5472 finally:
5336 del repo._subtoppath 5473 del repo._subtoppath
5337 5474
5339 other.close() 5476 other.close()
5340 return ret 5477 return ret
5341 5478
5342 5479
5343 @command( 5480 @command(
5344 'push', 5481 b'push',
5345 [ 5482 [
5346 ('f', 'force', None, _('force push')), 5483 (b'f', b'force', None, _(b'force push')),
5347 ( 5484 (
5348 'r', 5485 b'r',
5349 'rev', 5486 b'rev',
5350 [], 5487 [],
5351 _('a changeset intended to be included in the destination'), 5488 _(b'a changeset intended to be included in the destination'),
5352 _('REV'), 5489 _(b'REV'),
5353 ), 5490 ),
5354 ('B', 'bookmark', [], _("bookmark to push"), _('BOOKMARK')), 5491 (b'B', b'bookmark', [], _(b"bookmark to push"), _(b'BOOKMARK')),
5355 ( 5492 (
5356 'b', 5493 b'b',
5357 'branch', 5494 b'branch',
5358 [], 5495 [],
5359 _('a specific branch you would like to push'), 5496 _(b'a specific branch you would like to push'),
5360 _('BRANCH'), 5497 _(b'BRANCH'),
5361 ), 5498 ),
5362 ('', 'new-branch', False, _('allow pushing a new branch')), 5499 (b'', b'new-branch', False, _(b'allow pushing a new branch')),
5363 ( 5500 (
5364 '', 5501 b'',
5365 'pushvars', 5502 b'pushvars',
5366 [], 5503 [],
5367 _('variables that can be sent to server (ADVANCED)'), 5504 _(b'variables that can be sent to server (ADVANCED)'),
5368 ), 5505 ),
5369 ( 5506 (
5370 '', 5507 b'',
5371 'publish', 5508 b'publish',
5372 False, 5509 False,
5373 _('push the changeset as public (EXPERIMENTAL)'), 5510 _(b'push the changeset as public (EXPERIMENTAL)'),
5374 ), 5511 ),
5375 ] 5512 ]
5376 + remoteopts, 5513 + remoteopts,
5377 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'), 5514 _(b'[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'),
5378 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, 5515 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5379 helpbasic=True, 5516 helpbasic=True,
5380 ) 5517 )
5381 def push(ui, repo, dest=None, **opts): 5518 def push(ui, repo, dest=None, **opts):
5382 """push changes to the specified destination 5519 """push changes to the specified destination
5434 5571
5435 Returns 0 if push was successful, 1 if nothing to push. 5572 Returns 0 if push was successful, 1 if nothing to push.
5436 """ 5573 """
5437 5574
5438 opts = pycompat.byteskwargs(opts) 5575 opts = pycompat.byteskwargs(opts)
5439 if opts.get('bookmark'): 5576 if opts.get(b'bookmark'):
5440 ui.setconfig('bookmarks', 'pushing', opts['bookmark'], 'push') 5577 ui.setconfig(b'bookmarks', b'pushing', opts[b'bookmark'], b'push')
5441 for b in opts['bookmark']: 5578 for b in opts[b'bookmark']:
5442 # translate -B options to -r so changesets get pushed 5579 # translate -B options to -r so changesets get pushed
5443 b = repo._bookmarks.expandname(b) 5580 b = repo._bookmarks.expandname(b)
5444 if b in repo._bookmarks: 5581 if b in repo._bookmarks:
5445 opts.setdefault('rev', []).append(b) 5582 opts.setdefault(b'rev', []).append(b)
5446 else: 5583 else:
5447 # if we try to push a deleted bookmark, translate it to null 5584 # if we try to push a deleted bookmark, translate it to null
5448 # this lets simultaneous -r, -b options continue working 5585 # this lets simultaneous -r, -b options continue working
5449 opts.setdefault('rev', []).append("null") 5586 opts.setdefault(b'rev', []).append(b"null")
5450 5587
5451 path = ui.paths.getpath(dest, default=('default-push', 'default')) 5588 path = ui.paths.getpath(dest, default=(b'default-push', b'default'))
5452 if not path: 5589 if not path:
5453 raise error.Abort( 5590 raise error.Abort(
5454 _('default repository not configured!'), 5591 _(b'default repository not configured!'),
5455 hint=_("see 'hg help config.paths'"), 5592 hint=_(b"see 'hg help config.paths'"),
5456 ) 5593 )
5457 dest = path.pushloc or path.loc 5594 dest = path.pushloc or path.loc
5458 branches = (path.branch, opts.get('branch') or []) 5595 branches = (path.branch, opts.get(b'branch') or [])
5459 ui.status(_('pushing to %s\n') % util.hidepassword(dest)) 5596 ui.status(_(b'pushing to %s\n') % util.hidepassword(dest))
5460 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev')) 5597 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get(b'rev'))
5461 other = hg.peer(repo, opts, dest) 5598 other = hg.peer(repo, opts, dest)
5462 5599
5463 if revs: 5600 if revs:
5464 revs = [repo[r].node() for r in scmutil.revrange(repo, revs)] 5601 revs = [repo[r].node() for r in scmutil.revrange(repo, revs)]
5465 if not revs: 5602 if not revs:
5466 raise error.Abort( 5603 raise error.Abort(
5467 _("specified revisions evaluate to an empty set"), 5604 _(b"specified revisions evaluate to an empty set"),
5468 hint=_("use different revision arguments"), 5605 hint=_(b"use different revision arguments"),
5469 ) 5606 )
5470 elif path.pushrev: 5607 elif path.pushrev:
5471 # It doesn't make any sense to specify ancestor revisions. So limit 5608 # It doesn't make any sense to specify ancestor revisions. So limit
5472 # to DAG heads to make discovery simpler. 5609 # to DAG heads to make discovery simpler.
5473 expr = revsetlang.formatspec('heads(%r)', path.pushrev) 5610 expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
5474 revs = scmutil.revrange(repo, [expr]) 5611 revs = scmutil.revrange(repo, [expr])
5475 revs = [repo[rev].node() for rev in revs] 5612 revs = [repo[rev].node() for rev in revs]
5476 if not revs: 5613 if not revs:
5477 raise error.Abort( 5614 raise error.Abort(
5478 _('default push revset for path evaluates to an ' 'empty set') 5615 _(b'default push revset for path evaluates to an ' b'empty set')
5479 ) 5616 )
5480 5617
5481 repo._subtoppath = dest 5618 repo._subtoppath = dest
5482 try: 5619 try:
5483 # push subrepos depth-first for coherent ordering 5620 # push subrepos depth-first for coherent ordering
5484 c = repo['.'] 5621 c = repo[b'.']
5485 subs = c.substate # only repos that are committed 5622 subs = c.substate # only repos that are committed
5486 for s in sorted(subs): 5623 for s in sorted(subs):
5487 result = c.sub(s).push(opts) 5624 result = c.sub(s).push(opts)
5488 if result == 0: 5625 if result == 0:
5489 return not result 5626 return not result
5490 finally: 5627 finally:
5491 del repo._subtoppath 5628 del repo._subtoppath
5492 5629
5493 opargs = dict(opts.get('opargs', {})) # copy opargs since we may mutate it 5630 opargs = dict(opts.get(b'opargs', {})) # copy opargs since we may mutate it
5494 opargs.setdefault('pushvars', []).extend(opts.get('pushvars', [])) 5631 opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
5495 5632
5496 pushop = exchange.push( 5633 pushop = exchange.push(
5497 repo, 5634 repo,
5498 other, 5635 other,
5499 opts.get('force'), 5636 opts.get(b'force'),
5500 revs=revs, 5637 revs=revs,
5501 newbranch=opts.get('new_branch'), 5638 newbranch=opts.get(b'new_branch'),
5502 bookmarks=opts.get('bookmark', ()), 5639 bookmarks=opts.get(b'bookmark', ()),
5503 publish=opts.get('publish'), 5640 publish=opts.get(b'publish'),
5504 opargs=opargs, 5641 opargs=opargs,
5505 ) 5642 )
5506 5643
5507 result = not pushop.cgresult 5644 result = not pushop.cgresult
5508 5645
5514 5651
5515 return result 5652 return result
5516 5653
5517 5654
5518 @command( 5655 @command(
5519 'recover', 5656 b'recover',
5520 [('', 'verify', True, "run `hg verify` after succesful recover"),], 5657 [(b'', b'verify', True, b"run `hg verify` after succesful recover"),],
5521 helpcategory=command.CATEGORY_MAINTENANCE, 5658 helpcategory=command.CATEGORY_MAINTENANCE,
5522 ) 5659 )
5523 def recover(ui, repo, **opts): 5660 def recover(ui, repo, **opts):
5524 """roll back an interrupted transaction 5661 """roll back an interrupted transaction
5525 5662
5535 if ret: 5672 if ret:
5536 if opts[r'verify']: 5673 if opts[r'verify']:
5537 return hg.verify(repo) 5674 return hg.verify(repo)
5538 else: 5675 else:
5539 msg = _( 5676 msg = _(
5540 "(verify step skipped, run `hg verify` to check your " 5677 b"(verify step skipped, run `hg verify` to check your "
5541 "repository content)\n" 5678 b"repository content)\n"
5542 ) 5679 )
5543 ui.warn(msg) 5680 ui.warn(msg)
5544 return 0 5681 return 0
5545 return 1 5682 return 1
5546 5683
5547 5684
5548 @command( 5685 @command(
5549 'remove|rm', 5686 b'remove|rm',
5550 [ 5687 [
5551 ('A', 'after', None, _('record delete for missing files')), 5688 (b'A', b'after', None, _(b'record delete for missing files')),
5552 ('f', 'force', None, _('forget added files, delete modified files')), 5689 (b'f', b'force', None, _(b'forget added files, delete modified files')),
5553 ] 5690 ]
5554 + subrepoopts 5691 + subrepoopts
5555 + walkopts 5692 + walkopts
5556 + dryrunopts, 5693 + dryrunopts,
5557 _('[OPTION]... FILE...'), 5694 _(b'[OPTION]... FILE...'),
5558 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 5695 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5559 helpbasic=True, 5696 helpbasic=True,
5560 inferrepo=True, 5697 inferrepo=True,
5561 ) 5698 )
5562 def remove(ui, repo, *pats, **opts): 5699 def remove(ui, repo, *pats, **opts):
5597 5734
5598 Returns 0 on success, 1 if any warnings encountered. 5735 Returns 0 on success, 1 if any warnings encountered.
5599 """ 5736 """
5600 5737
5601 opts = pycompat.byteskwargs(opts) 5738 opts = pycompat.byteskwargs(opts)
5602 after, force = opts.get('after'), opts.get('force') 5739 after, force = opts.get(b'after'), opts.get(b'force')
5603 dryrun = opts.get('dry_run') 5740 dryrun = opts.get(b'dry_run')
5604 if not pats and not after: 5741 if not pats and not after:
5605 raise error.Abort(_('no files specified')) 5742 raise error.Abort(_(b'no files specified'))
5606 5743
5607 m = scmutil.match(repo[None], pats, opts) 5744 m = scmutil.match(repo[None], pats, opts)
5608 subrepos = opts.get('subrepos') 5745 subrepos = opts.get(b'subrepos')
5609 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True) 5746 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
5610 return cmdutil.remove( 5747 return cmdutil.remove(
5611 ui, repo, m, "", uipathfn, after, force, subrepos, dryrun=dryrun 5748 ui, repo, m, b"", uipathfn, after, force, subrepos, dryrun=dryrun
5612 ) 5749 )
5613 5750
5614 5751
5615 @command( 5752 @command(
5616 'rename|move|mv', 5753 b'rename|move|mv',
5617 [ 5754 [
5618 ('A', 'after', None, _('record a rename that has already occurred')), 5755 (b'A', b'after', None, _(b'record a rename that has already occurred')),
5619 ('f', 'force', None, _('forcibly move over an existing managed file')), 5756 (
5757 b'f',
5758 b'force',
5759 None,
5760 _(b'forcibly move over an existing managed file'),
5761 ),
5620 ] 5762 ]
5621 + walkopts 5763 + walkopts
5622 + dryrunopts, 5764 + dryrunopts,
5623 _('[OPTION]... SOURCE... DEST'), 5765 _(b'[OPTION]... SOURCE... DEST'),
5624 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 5766 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5625 ) 5767 )
5626 def rename(ui, repo, *pats, **opts): 5768 def rename(ui, repo, *pats, **opts):
5627 """rename files; equivalent of copy + remove 5769 """rename files; equivalent of copy + remove
5628 5770
5643 with repo.wlock(False): 5785 with repo.wlock(False):
5644 return cmdutil.copy(ui, repo, pats, opts, rename=True) 5786 return cmdutil.copy(ui, repo, pats, opts, rename=True)
5645 5787
5646 5788
5647 @command( 5789 @command(
5648 'resolve', 5790 b'resolve',
5649 [ 5791 [
5650 ('a', 'all', None, _('select all unresolved files')), 5792 (b'a', b'all', None, _(b'select all unresolved files')),
5651 ('l', 'list', None, _('list state of files needing merge')), 5793 (b'l', b'list', None, _(b'list state of files needing merge')),
5652 ('m', 'mark', None, _('mark files as resolved')), 5794 (b'm', b'mark', None, _(b'mark files as resolved')),
5653 ('u', 'unmark', None, _('mark files as unresolved')), 5795 (b'u', b'unmark', None, _(b'mark files as unresolved')),
5654 ('n', 'no-status', None, _('hide status prefix')), 5796 (b'n', b'no-status', None, _(b'hide status prefix')),
5655 ('', 're-merge', None, _('re-merge files')), 5797 (b'', b're-merge', None, _(b're-merge files')),
5656 ] 5798 ]
5657 + mergetoolopts 5799 + mergetoolopts
5658 + walkopts 5800 + walkopts
5659 + formatteropts, 5801 + formatteropts,
5660 _('[OPTION]... [FILE]...'), 5802 _(b'[OPTION]... [FILE]...'),
5661 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 5803 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5662 inferrepo=True, 5804 inferrepo=True,
5663 ) 5805 )
5664 def resolve(ui, repo, *pats, **opts): 5806 def resolve(ui, repo, *pats, **opts):
5665 """redo merges or set/view the merge status of files 5807 """redo merges or set/view the merge status of files
5712 5854
5713 Returns 0 on success, 1 if any files fail a resolve attempt. 5855 Returns 0 on success, 1 if any files fail a resolve attempt.
5714 """ 5856 """
5715 5857
5716 opts = pycompat.byteskwargs(opts) 5858 opts = pycompat.byteskwargs(opts)
5717 confirm = ui.configbool('commands', 'resolve.confirm') 5859 confirm = ui.configbool(b'commands', b'resolve.confirm')
5718 flaglist = 'all mark unmark list no_status re_merge'.split() 5860 flaglist = b'all mark unmark list no_status re_merge'.split()
5719 all, mark, unmark, show, nostatus, remerge = [opts.get(o) for o in flaglist] 5861 all, mark, unmark, show, nostatus, remerge = [opts.get(o) for o in flaglist]
5720 5862
5721 actioncount = len(list(filter(None, [show, mark, unmark, remerge]))) 5863 actioncount = len(list(filter(None, [show, mark, unmark, remerge])))
5722 if actioncount > 1: 5864 if actioncount > 1:
5723 raise error.Abort(_("too many actions specified")) 5865 raise error.Abort(_(b"too many actions specified"))
5724 elif actioncount == 0 and ui.configbool( 5866 elif actioncount == 0 and ui.configbool(
5725 'commands', 'resolve.explicit-re-merge' 5867 b'commands', b'resolve.explicit-re-merge'
5726 ): 5868 ):
5727 hint = _('use --mark, --unmark, --list or --re-merge') 5869 hint = _(b'use --mark, --unmark, --list or --re-merge')
5728 raise error.Abort(_('no action specified'), hint=hint) 5870 raise error.Abort(_(b'no action specified'), hint=hint)
5729 if pats and all: 5871 if pats and all:
5730 raise error.Abort(_("can't specify --all and patterns")) 5872 raise error.Abort(_(b"can't specify --all and patterns"))
5731 if not (all or pats or show or mark or unmark): 5873 if not (all or pats or show or mark or unmark):
5732 raise error.Abort( 5874 raise error.Abort(
5733 _('no files or directories specified'), 5875 _(b'no files or directories specified'),
5734 hint='use --all to re-merge all unresolved files', 5876 hint=b'use --all to re-merge all unresolved files',
5735 ) 5877 )
5736 5878
5737 if confirm: 5879 if confirm:
5738 if all: 5880 if all:
5739 if ui.promptchoice( 5881 if ui.promptchoice(
5740 _(b're-merge all unresolved files (yn)?' b'$$ &Yes $$ &No') 5882 _(b're-merge all unresolved files (yn)?' b'$$ &Yes $$ &No')
5741 ): 5883 ):
5742 raise error.Abort(_('user quit')) 5884 raise error.Abort(_(b'user quit'))
5743 if mark and not pats: 5885 if mark and not pats:
5744 if ui.promptchoice( 5886 if ui.promptchoice(
5745 _( 5887 _(
5746 b'mark all unresolved files as resolved (yn)?' 5888 b'mark all unresolved files as resolved (yn)?'
5747 b'$$ &Yes $$ &No' 5889 b'$$ &Yes $$ &No'
5748 ) 5890 )
5749 ): 5891 ):
5750 raise error.Abort(_('user quit')) 5892 raise error.Abort(_(b'user quit'))
5751 if unmark and not pats: 5893 if unmark and not pats:
5752 if ui.promptchoice( 5894 if ui.promptchoice(
5753 _( 5895 _(
5754 b'mark all resolved files as unresolved (yn)?' 5896 b'mark all resolved files as unresolved (yn)?'
5755 b'$$ &Yes $$ &No' 5897 b'$$ &Yes $$ &No'
5756 ) 5898 )
5757 ): 5899 ):
5758 raise error.Abort(_('user quit')) 5900 raise error.Abort(_(b'user quit'))
5759 5901
5760 uipathfn = scmutil.getuipathfn(repo) 5902 uipathfn = scmutil.getuipathfn(repo)
5761 5903
5762 if show: 5904 if show:
5763 ui.pager('resolve') 5905 ui.pager(b'resolve')
5764 fm = ui.formatter('resolve', opts) 5906 fm = ui.formatter(b'resolve', opts)
5765 ms = mergemod.mergestate.read(repo) 5907 ms = mergemod.mergestate.read(repo)
5766 wctx = repo[None] 5908 wctx = repo[None]
5767 m = scmutil.match(wctx, pats, opts) 5909 m = scmutil.match(wctx, pats, opts)
5768 5910
5769 # Labels and keys based on merge state. Unresolved path conflicts show 5911 # Labels and keys based on merge state. Unresolved path conflicts show
5770 # as 'P'. Resolved path conflicts show as 'R', the same as normal 5912 # as 'P'. Resolved path conflicts show as 'R', the same as normal
5771 # resolved conflicts. 5913 # resolved conflicts.
5772 mergestateinfo = { 5914 mergestateinfo = {
5773 mergemod.MERGE_RECORD_UNRESOLVED: ('resolve.unresolved', 'U'), 5915 mergemod.MERGE_RECORD_UNRESOLVED: (b'resolve.unresolved', b'U'),
5774 mergemod.MERGE_RECORD_RESOLVED: ('resolve.resolved', 'R'), 5916 mergemod.MERGE_RECORD_RESOLVED: (b'resolve.resolved', b'R'),
5775 mergemod.MERGE_RECORD_UNRESOLVED_PATH: ('resolve.unresolved', 'P'), 5917 mergemod.MERGE_RECORD_UNRESOLVED_PATH: (
5776 mergemod.MERGE_RECORD_RESOLVED_PATH: ('resolve.resolved', 'R'), 5918 b'resolve.unresolved',
5919 b'P',
5920 ),
5921 mergemod.MERGE_RECORD_RESOLVED_PATH: (b'resolve.resolved', b'R'),
5777 mergemod.MERGE_RECORD_DRIVER_RESOLVED: ( 5922 mergemod.MERGE_RECORD_DRIVER_RESOLVED: (
5778 'resolve.driverresolved', 5923 b'resolve.driverresolved',
5779 'D', 5924 b'D',
5780 ), 5925 ),
5781 } 5926 }
5782 5927
5783 for f in ms: 5928 for f in ms:
5784 if not m(f): 5929 if not m(f):
5785 continue 5930 continue
5786 5931
5787 label, key = mergestateinfo[ms[f]] 5932 label, key = mergestateinfo[ms[f]]
5788 fm.startitem() 5933 fm.startitem()
5789 fm.context(ctx=wctx) 5934 fm.context(ctx=wctx)
5790 fm.condwrite(not nostatus, 'mergestatus', '%s ', key, label=label) 5935 fm.condwrite(not nostatus, b'mergestatus', b'%s ', key, label=label)
5791 fm.data(path=f) 5936 fm.data(path=f)
5792 fm.plain('%s\n' % uipathfn(f), label=label) 5937 fm.plain(b'%s\n' % uipathfn(f), label=label)
5793 fm.end() 5938 fm.end()
5794 return 0 5939 return 0
5795 5940
5796 with repo.wlock(): 5941 with repo.wlock():
5797 ms = mergemod.mergestate.read(repo) 5942 ms = mergemod.mergestate.read(repo)
5798 5943
5799 if not (ms.active() or repo.dirstate.p2() != nullid): 5944 if not (ms.active() or repo.dirstate.p2() != nullid):
5800 raise error.Abort( 5945 raise error.Abort(
5801 _('resolve command not applicable when not merging') 5946 _(b'resolve command not applicable when not merging')
5802 ) 5947 )
5803 5948
5804 wctx = repo[None] 5949 wctx = repo[None]
5805 5950
5806 if ( 5951 if (
5819 runconclude = False 5964 runconclude = False
5820 5965
5821 tocomplete = [] 5966 tocomplete = []
5822 hasconflictmarkers = [] 5967 hasconflictmarkers = []
5823 if mark: 5968 if mark:
5824 markcheck = ui.config('commands', 'resolve.mark-check') 5969 markcheck = ui.config(b'commands', b'resolve.mark-check')
5825 if markcheck not in ['warn', 'abort']: 5970 if markcheck not in [b'warn', b'abort']:
5826 # Treat all invalid / unrecognized values as 'none'. 5971 # Treat all invalid / unrecognized values as 'none'.
5827 markcheck = False 5972 markcheck = False
5828 for f in ms: 5973 for f in ms:
5829 if not m(f): 5974 if not m(f):
5830 continue 5975 continue
5836 if ms[f] == mergemod.MERGE_RECORD_DRIVER_RESOLVED: 5981 if ms[f] == mergemod.MERGE_RECORD_DRIVER_RESOLVED:
5837 exact = m.exact(f) 5982 exact = m.exact(f)
5838 if mark: 5983 if mark:
5839 if exact: 5984 if exact:
5840 ui.warn( 5985 ui.warn(
5841 _('not marking %s as it is driver-resolved\n') 5986 _(b'not marking %s as it is driver-resolved\n')
5842 % uipathfn(f) 5987 % uipathfn(f)
5843 ) 5988 )
5844 elif unmark: 5989 elif unmark:
5845 if exact: 5990 if exact:
5846 ui.warn( 5991 ui.warn(
5847 _('not unmarking %s as it is driver-resolved\n') 5992 _(b'not unmarking %s as it is driver-resolved\n')
5848 % uipathfn(f) 5993 % uipathfn(f)
5849 ) 5994 )
5850 else: 5995 else:
5851 runconclude = True 5996 runconclude = True
5852 continue 5997 continue
5860 ms.mark(f, mergemod.MERGE_RECORD_RESOLVED_PATH) 6005 ms.mark(f, mergemod.MERGE_RECORD_RESOLVED_PATH)
5861 elif unmark: 6006 elif unmark:
5862 ms.mark(f, mergemod.MERGE_RECORD_UNRESOLVED_PATH) 6007 ms.mark(f, mergemod.MERGE_RECORD_UNRESOLVED_PATH)
5863 elif ms[f] == mergemod.MERGE_RECORD_UNRESOLVED_PATH: 6008 elif ms[f] == mergemod.MERGE_RECORD_UNRESOLVED_PATH:
5864 ui.warn( 6009 ui.warn(
5865 _('%s: path conflict must be resolved manually\n') 6010 _(b'%s: path conflict must be resolved manually\n')
5866 % uipathfn(f) 6011 % uipathfn(f)
5867 ) 6012 )
5868 continue 6013 continue
5869 6014
5870 if mark: 6015 if mark:
5880 ms.mark(f, mergemod.MERGE_RECORD_UNRESOLVED) 6025 ms.mark(f, mergemod.MERGE_RECORD_UNRESOLVED)
5881 else: 6026 else:
5882 # backup pre-resolve (merge uses .orig for its own purposes) 6027 # backup pre-resolve (merge uses .orig for its own purposes)
5883 a = repo.wjoin(f) 6028 a = repo.wjoin(f)
5884 try: 6029 try:
5885 util.copyfile(a, a + ".resolve") 6030 util.copyfile(a, a + b".resolve")
5886 except (IOError, OSError) as inst: 6031 except (IOError, OSError) as inst:
5887 if inst.errno != errno.ENOENT: 6032 if inst.errno != errno.ENOENT:
5888 raise 6033 raise
5889 6034
5890 try: 6035 try:
5891 # preresolve file 6036 # preresolve file
5892 overrides = {('ui', 'forcemerge'): opts.get('tool', '')} 6037 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
5893 with ui.configoverride(overrides, 'resolve'): 6038 with ui.configoverride(overrides, b'resolve'):
5894 complete, r = ms.preresolve(f, wctx) 6039 complete, r = ms.preresolve(f, wctx)
5895 if not complete: 6040 if not complete:
5896 tocomplete.append(f) 6041 tocomplete.append(f)
5897 elif r: 6042 elif r:
5898 ret = 1 6043 ret = 1
5902 # replace filemerge's .orig file with our resolve file, but only 6047 # replace filemerge's .orig file with our resolve file, but only
5903 # for merges that are complete 6048 # for merges that are complete
5904 if complete: 6049 if complete:
5905 try: 6050 try:
5906 util.rename( 6051 util.rename(
5907 a + ".resolve", scmutil.backuppath(ui, repo, f) 6052 a + b".resolve", scmutil.backuppath(ui, repo, f)
5908 ) 6053 )
5909 except OSError as inst: 6054 except OSError as inst:
5910 if inst.errno != errno.ENOENT: 6055 if inst.errno != errno.ENOENT:
5911 raise 6056 raise
5912 6057
5913 if hasconflictmarkers: 6058 if hasconflictmarkers:
5914 ui.warn( 6059 ui.warn(
5915 _( 6060 _(
5916 'warning: the following files still have conflict ' 6061 b'warning: the following files still have conflict '
5917 'markers:\n' 6062 b'markers:\n'
5918 ) 6063 )
5919 + ''.join(' ' + uipathfn(f) + '\n' for f in hasconflictmarkers) 6064 + b''.join(
6065 b' ' + uipathfn(f) + b'\n' for f in hasconflictmarkers
6066 )
5920 ) 6067 )
5921 if markcheck == 'abort' and not all and not pats: 6068 if markcheck == b'abort' and not all and not pats:
5922 raise error.Abort( 6069 raise error.Abort(
5923 _('conflict markers detected'), 6070 _(b'conflict markers detected'),
5924 hint=_('use --all to mark anyway'), 6071 hint=_(b'use --all to mark anyway'),
5925 ) 6072 )
5926 6073
5927 for f in tocomplete: 6074 for f in tocomplete:
5928 try: 6075 try:
5929 # resolve file 6076 # resolve file
5930 overrides = {('ui', 'forcemerge'): opts.get('tool', '')} 6077 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
5931 with ui.configoverride(overrides, 'resolve'): 6078 with ui.configoverride(overrides, b'resolve'):
5932 r = ms.resolve(f, wctx) 6079 r = ms.resolve(f, wctx)
5933 if r: 6080 if r:
5934 ret = 1 6081 ret = 1
5935 finally: 6082 finally:
5936 ms.commit() 6083 ms.commit()
5937 6084
5938 # replace filemerge's .orig file with our resolve file 6085 # replace filemerge's .orig file with our resolve file
5939 a = repo.wjoin(f) 6086 a = repo.wjoin(f)
5940 try: 6087 try:
5941 util.rename(a + ".resolve", scmutil.backuppath(ui, repo, f)) 6088 util.rename(a + b".resolve", scmutil.backuppath(ui, repo, f))
5942 except OSError as inst: 6089 except OSError as inst:
5943 if inst.errno != errno.ENOENT: 6090 if inst.errno != errno.ENOENT:
5944 raise 6091 raise
5945 6092
5946 ms.commit() 6093 ms.commit()
5947 ms.recordactions() 6094 ms.recordactions()
5948 6095
5949 if not didwork and pats: 6096 if not didwork and pats:
5950 hint = None 6097 hint = None
5951 if not any([p for p in pats if p.find(':') >= 0]): 6098 if not any([p for p in pats if p.find(b':') >= 0]):
5952 pats = ['path:%s' % p for p in pats] 6099 pats = [b'path:%s' % p for p in pats]
5953 m = scmutil.match(wctx, pats, opts) 6100 m = scmutil.match(wctx, pats, opts)
5954 for f in ms: 6101 for f in ms:
5955 if not m(f): 6102 if not m(f):
5956 continue 6103 continue
5957 6104
5958 def flag(o): 6105 def flag(o):
5959 if o == 're_merge': 6106 if o == b're_merge':
5960 return '--re-merge ' 6107 return b'--re-merge '
5961 return '-%s ' % o[0:1] 6108 return b'-%s ' % o[0:1]
5962 6109
5963 flags = ''.join([flag(o) for o in flaglist if opts.get(o)]) 6110 flags = b''.join([flag(o) for o in flaglist if opts.get(o)])
5964 hint = _("(try: hg resolve %s%s)\n") % ( 6111 hint = _(b"(try: hg resolve %s%s)\n") % (
5965 flags, 6112 flags,
5966 ' '.join(pats), 6113 b' '.join(pats),
5967 ) 6114 )
5968 break 6115 break
5969 ui.warn(_("arguments do not match paths that need resolving\n")) 6116 ui.warn(_(b"arguments do not match paths that need resolving\n"))
5970 if hint: 6117 if hint:
5971 ui.warn(hint) 6118 ui.warn(hint)
5972 elif ms.mergedriver and ms.mdstate() != 's': 6119 elif ms.mergedriver and ms.mdstate() != b's':
5973 # run conclude step when either a driver-resolved file is requested 6120 # run conclude step when either a driver-resolved file is requested
5974 # or there are no driver-resolved files 6121 # or there are no driver-resolved files
5975 # we can't use 'ret' to determine whether any files are unresolved 6122 # we can't use 'ret' to determine whether any files are unresolved
5976 # because we might not have tried to resolve some 6123 # because we might not have tried to resolve some
5977 if (runconclude or not list(ms.driverresolved())) and not list( 6124 if (runconclude or not list(ms.driverresolved())) and not list(
5984 6131
5985 # Nudge users into finishing an unfinished operation 6132 # Nudge users into finishing an unfinished operation
5986 unresolvedf = list(ms.unresolved()) 6133 unresolvedf = list(ms.unresolved())
5987 driverresolvedf = list(ms.driverresolved()) 6134 driverresolvedf = list(ms.driverresolved())
5988 if not unresolvedf and not driverresolvedf: 6135 if not unresolvedf and not driverresolvedf:
5989 ui.status(_('(no more unresolved files)\n')) 6136 ui.status(_(b'(no more unresolved files)\n'))
5990 cmdutil.checkafterresolved(repo) 6137 cmdutil.checkafterresolved(repo)
5991 elif not unresolvedf: 6138 elif not unresolvedf:
5992 ui.status( 6139 ui.status(
5993 _( 6140 _(
5994 '(no more unresolved files -- ' 6141 b'(no more unresolved files -- '
5995 'run "hg resolve --all" to conclude)\n' 6142 b'run "hg resolve --all" to conclude)\n'
5996 ) 6143 )
5997 ) 6144 )
5998 6145
5999 return ret 6146 return ret
6000 6147
6001 6148
6002 @command( 6149 @command(
6003 'revert', 6150 b'revert',
6004 [ 6151 [
6005 ('a', 'all', None, _('revert all changes when no arguments given')), 6152 (b'a', b'all', None, _(b'revert all changes when no arguments given')),
6006 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')), 6153 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
6007 ('r', 'rev', '', _('revert to the specified revision'), _('REV')), 6154 (b'r', b'rev', b'', _(b'revert to the specified revision'), _(b'REV')),
6008 ('C', 'no-backup', None, _('do not save backup copies of files')), 6155 (b'C', b'no-backup', None, _(b'do not save backup copies of files')),
6009 ('i', 'interactive', None, _('interactively select the changes')), 6156 (b'i', b'interactive', None, _(b'interactively select the changes')),
6010 ] 6157 ]
6011 + walkopts 6158 + walkopts
6012 + dryrunopts, 6159 + dryrunopts,
6013 _('[OPTION]... [-r REV] [NAME]...'), 6160 _(b'[OPTION]... [-r REV] [NAME]...'),
6014 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 6161 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6015 ) 6162 )
6016 def revert(ui, repo, *pats, **opts): 6163 def revert(ui, repo, *pats, **opts):
6017 """restore files to their checkout state 6164 """restore files to their checkout state
6018 6165
6049 6196
6050 Returns 0 on success. 6197 Returns 0 on success.
6051 """ 6198 """
6052 6199
6053 opts = pycompat.byteskwargs(opts) 6200 opts = pycompat.byteskwargs(opts)
6054 if opts.get("date"): 6201 if opts.get(b"date"):
6055 if opts.get("rev"): 6202 if opts.get(b"rev"):
6056 raise error.Abort(_("you can't specify a revision and a date")) 6203 raise error.Abort(_(b"you can't specify a revision and a date"))
6057 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"]) 6204 opts[b"rev"] = cmdutil.finddate(ui, repo, opts[b"date"])
6058 6205
6059 parent, p2 = repo.dirstate.parents() 6206 parent, p2 = repo.dirstate.parents()
6060 if not opts.get('rev') and p2 != nullid: 6207 if not opts.get(b'rev') and p2 != nullid:
6061 # revert after merge is a trap for new users (issue2915) 6208 # revert after merge is a trap for new users (issue2915)
6062 raise error.Abort( 6209 raise error.Abort(
6063 _('uncommitted merge with no revision specified'), 6210 _(b'uncommitted merge with no revision specified'),
6064 hint=_("use 'hg update' or see 'hg help revert'"), 6211 hint=_(b"use 'hg update' or see 'hg help revert'"),
6065 ) 6212 )
6066 6213
6067 rev = opts.get('rev') 6214 rev = opts.get(b'rev')
6068 if rev: 6215 if rev:
6069 repo = scmutil.unhidehashlikerevs(repo, [rev], 'nowarn') 6216 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
6070 ctx = scmutil.revsingle(repo, rev) 6217 ctx = scmutil.revsingle(repo, rev)
6071 6218
6072 if not ( 6219 if not (
6073 pats 6220 pats
6074 or opts.get('include') 6221 or opts.get(b'include')
6075 or opts.get('exclude') 6222 or opts.get(b'exclude')
6076 or opts.get('all') 6223 or opts.get(b'all')
6077 or opts.get('interactive') 6224 or opts.get(b'interactive')
6078 ): 6225 ):
6079 msg = _("no files or directories specified") 6226 msg = _(b"no files or directories specified")
6080 if p2 != nullid: 6227 if p2 != nullid:
6081 hint = _( 6228 hint = _(
6082 "uncommitted merge, use --all to discard all changes," 6229 b"uncommitted merge, use --all to discard all changes,"
6083 " or 'hg update -C .' to abort the merge" 6230 b" or 'hg update -C .' to abort the merge"
6084 ) 6231 )
6085 raise error.Abort(msg, hint=hint) 6232 raise error.Abort(msg, hint=hint)
6086 dirty = any(repo.status()) 6233 dirty = any(repo.status())
6087 node = ctx.node() 6234 node = ctx.node()
6088 if node != parent: 6235 if node != parent:
6089 if dirty: 6236 if dirty:
6090 hint = ( 6237 hint = (
6091 _( 6238 _(
6092 "uncommitted changes, use --all to discard all" 6239 b"uncommitted changes, use --all to discard all"
6093 " changes, or 'hg update %d' to update" 6240 b" changes, or 'hg update %d' to update"
6094 ) 6241 )
6095 % ctx.rev() 6242 % ctx.rev()
6096 ) 6243 )
6097 else: 6244 else:
6098 hint = ( 6245 hint = (
6099 _( 6246 _(
6100 "use --all to revert all files," 6247 b"use --all to revert all files,"
6101 " or 'hg update %d' to update" 6248 b" or 'hg update %d' to update"
6102 ) 6249 )
6103 % ctx.rev() 6250 % ctx.rev()
6104 ) 6251 )
6105 elif dirty: 6252 elif dirty:
6106 hint = _("uncommitted changes, use --all to discard all changes") 6253 hint = _(b"uncommitted changes, use --all to discard all changes")
6107 else: 6254 else:
6108 hint = _("use --all to revert all files") 6255 hint = _(b"use --all to revert all files")
6109 raise error.Abort(msg, hint=hint) 6256 raise error.Abort(msg, hint=hint)
6110 6257
6111 return cmdutil.revert( 6258 return cmdutil.revert(
6112 ui, repo, ctx, (parent, p2), *pats, **pycompat.strkwargs(opts) 6259 ui, repo, ctx, (parent, p2), *pats, **pycompat.strkwargs(opts)
6113 ) 6260 )
6114 6261
6115 6262
6116 @command( 6263 @command(
6117 'rollback', 6264 b'rollback',
6118 dryrunopts + [('f', 'force', False, _('ignore safety measures'))], 6265 dryrunopts + [(b'f', b'force', False, _(b'ignore safety measures'))],
6119 helpcategory=command.CATEGORY_MAINTENANCE, 6266 helpcategory=command.CATEGORY_MAINTENANCE,
6120 ) 6267 )
6121 def rollback(ui, repo, **opts): 6268 def rollback(ui, repo, **opts):
6122 """roll back the last transaction (DANGEROUS) (DEPRECATED) 6269 """roll back the last transaction (DANGEROUS) (DEPRECATED)
6123 6270
6161 repository; for example an in-progress pull from the repository 6308 repository; for example an in-progress pull from the repository
6162 may fail if a rollback is performed. 6309 may fail if a rollback is performed.
6163 6310
6164 Returns 0 on success, 1 if no rollback data is available. 6311 Returns 0 on success, 1 if no rollback data is available.
6165 """ 6312 """
6166 if not ui.configbool('ui', 'rollback'): 6313 if not ui.configbool(b'ui', b'rollback'):
6167 raise error.Abort( 6314 raise error.Abort(
6168 _('rollback is disabled because it is unsafe'), 6315 _(b'rollback is disabled because it is unsafe'),
6169 hint='see `hg help -v rollback` for information', 6316 hint=b'see `hg help -v rollback` for information',
6170 ) 6317 )
6171 return repo.rollback(dryrun=opts.get(r'dry_run'), force=opts.get(r'force')) 6318 return repo.rollback(dryrun=opts.get(r'dry_run'), force=opts.get(r'force'))
6172 6319
6173 6320
6174 @command( 6321 @command(
6175 'root', 6322 b'root',
6176 [] + formatteropts, 6323 [] + formatteropts,
6177 intents={INTENT_READONLY}, 6324 intents={INTENT_READONLY},
6178 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 6325 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6179 ) 6326 )
6180 def root(ui, repo, **opts): 6327 def root(ui, repo, **opts):
6193 :storepath: String. Path to the directory holding versioned data. 6340 :storepath: String. Path to the directory holding versioned data.
6194 6341
6195 Returns 0 on success. 6342 Returns 0 on success.
6196 """ 6343 """
6197 opts = pycompat.byteskwargs(opts) 6344 opts = pycompat.byteskwargs(opts)
6198 with ui.formatter('root', opts) as fm: 6345 with ui.formatter(b'root', opts) as fm:
6199 fm.startitem() 6346 fm.startitem()
6200 fm.write('reporoot', '%s\n', repo.root) 6347 fm.write(b'reporoot', b'%s\n', repo.root)
6201 fm.data(hgpath=repo.path, storepath=repo.spath) 6348 fm.data(hgpath=repo.path, storepath=repo.spath)
6202 6349
6203 6350
6204 @command( 6351 @command(
6205 'serve', 6352 b'serve',
6206 [ 6353 [
6207 ( 6354 (
6208 'A', 6355 b'A',
6209 'accesslog', 6356 b'accesslog',
6210 '', 6357 b'',
6211 _('name of access log file to write to'), 6358 _(b'name of access log file to write to'),
6212 _('FILE'), 6359 _(b'FILE'),
6213 ), 6360 ),
6214 ('d', 'daemon', None, _('run server in background')), 6361 (b'd', b'daemon', None, _(b'run server in background')),
6215 ('', 'daemon-postexec', [], _('used internally by daemon mode')), 6362 (b'', b'daemon-postexec', [], _(b'used internally by daemon mode')),
6216 ( 6363 (
6217 'E', 6364 b'E',
6218 'errorlog', 6365 b'errorlog',
6219 '', 6366 b'',
6220 _('name of error log file to write to'), 6367 _(b'name of error log file to write to'),
6221 _('FILE'), 6368 _(b'FILE'),
6222 ), 6369 ),
6223 # use string type, then we can check if something was passed 6370 # use string type, then we can check if something was passed
6224 ('p', 'port', '', _('port to listen on (default: 8000)'), _('PORT')), 6371 (
6225 ( 6372 b'p',
6226 'a', 6373 b'port',
6227 'address', 6374 b'',
6228 '', 6375 _(b'port to listen on (default: 8000)'),
6229 _('address to listen on (default: all interfaces)'), 6376 _(b'PORT'),
6230 _('ADDR'), 6377 ),
6231 ), 6378 (
6232 ( 6379 b'a',
6233 '', 6380 b'address',
6234 'prefix', 6381 b'',
6235 '', 6382 _(b'address to listen on (default: all interfaces)'),
6236 _('prefix path to serve from (default: server root)'), 6383 _(b'ADDR'),
6237 _('PREFIX'), 6384 ),
6238 ), 6385 (
6239 ( 6386 b'',
6240 'n', 6387 b'prefix',
6241 'name', 6388 b'',
6242 '', 6389 _(b'prefix path to serve from (default: server root)'),
6243 _('name to show in web pages (default: working directory)'), 6390 _(b'PREFIX'),
6244 _('NAME'), 6391 ),
6245 ), 6392 (
6246 ( 6393 b'n',
6247 '', 6394 b'name',
6248 'web-conf', 6395 b'',
6249 '', 6396 _(b'name to show in web pages (default: working directory)'),
6250 _("name of the hgweb config file (see 'hg help hgweb')"), 6397 _(b'NAME'),
6251 _('FILE'), 6398 ),
6252 ), 6399 (
6253 ( 6400 b'',
6254 '', 6401 b'web-conf',
6255 'webdir-conf', 6402 b'',
6256 '', 6403 _(b"name of the hgweb config file (see 'hg help hgweb')"),
6257 _('name of the hgweb config file (DEPRECATED)'), 6404 _(b'FILE'),
6258 _('FILE'), 6405 ),
6259 ), 6406 (
6260 ( 6407 b'',
6261 '', 6408 b'webdir-conf',
6262 'pid-file', 6409 b'',
6263 '', 6410 _(b'name of the hgweb config file (DEPRECATED)'),
6264 _('name of file to write process ID to'), 6411 _(b'FILE'),
6265 _('FILE'), 6412 ),
6266 ), 6413 (
6267 ('', 'stdio', None, _('for remote clients (ADVANCED)')), 6414 b'',
6268 ('', 'cmdserver', '', _('for remote clients (ADVANCED)'), _('MODE')), 6415 b'pid-file',
6269 ('t', 'templates', '', _('web templates to use'), _('TEMPLATE')), 6416 b'',
6270 ('', 'style', '', _('template style to use'), _('STYLE')), 6417 _(b'name of file to write process ID to'),
6271 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')), 6418 _(b'FILE'),
6272 ('', 'certificate', '', _('SSL certificate file'), _('FILE')), 6419 ),
6273 ('', 'print-url', None, _('start and print only the URL')), 6420 (b'', b'stdio', None, _(b'for remote clients (ADVANCED)')),
6421 (
6422 b'',
6423 b'cmdserver',
6424 b'',
6425 _(b'for remote clients (ADVANCED)'),
6426 _(b'MODE'),
6427 ),
6428 (b't', b'templates', b'', _(b'web templates to use'), _(b'TEMPLATE')),
6429 (b'', b'style', b'', _(b'template style to use'), _(b'STYLE')),
6430 (b'6', b'ipv6', None, _(b'use IPv6 in addition to IPv4')),
6431 (b'', b'certificate', b'', _(b'SSL certificate file'), _(b'FILE')),
6432 (b'', b'print-url', None, _(b'start and print only the URL')),
6274 ] 6433 ]
6275 + subrepoopts, 6434 + subrepoopts,
6276 _('[OPTION]...'), 6435 _(b'[OPTION]...'),
6277 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, 6436 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
6278 helpbasic=True, 6437 helpbasic=True,
6279 optionalrepo=True, 6438 optionalrepo=True,
6280 ) 6439 )
6281 def serve(ui, repo, **opts): 6440 def serve(ui, repo, **opts):
6302 6461
6303 Returns 0 on success. 6462 Returns 0 on success.
6304 """ 6463 """
6305 6464
6306 opts = pycompat.byteskwargs(opts) 6465 opts = pycompat.byteskwargs(opts)
6307 if opts["stdio"] and opts["cmdserver"]: 6466 if opts[b"stdio"] and opts[b"cmdserver"]:
6308 raise error.Abort(_("cannot use --stdio with --cmdserver")) 6467 raise error.Abort(_(b"cannot use --stdio with --cmdserver"))
6309 if opts["print_url"] and ui.verbose: 6468 if opts[b"print_url"] and ui.verbose:
6310 raise error.Abort(_("cannot use --print-url with --verbose")) 6469 raise error.Abort(_(b"cannot use --print-url with --verbose"))
6311 6470
6312 if opts["stdio"]: 6471 if opts[b"stdio"]:
6313 if repo is None: 6472 if repo is None:
6314 raise error.RepoError( 6473 raise error.RepoError(
6315 _("there is no Mercurial repository here" " (.hg not found)") 6474 _(b"there is no Mercurial repository here" b" (.hg not found)")
6316 ) 6475 )
6317 s = wireprotoserver.sshserver(ui, repo) 6476 s = wireprotoserver.sshserver(ui, repo)
6318 s.serve_forever() 6477 s.serve_forever()
6319 6478
6320 service = server.createservice(ui, repo, opts) 6479 service = server.createservice(ui, repo, opts)
6321 return server.runservice(opts, initfn=service.init, runfn=service.run) 6480 return server.runservice(opts, initfn=service.init, runfn=service.run)
6322 6481
6323 6482
6324 @command( 6483 @command(
6325 'shelve', 6484 b'shelve',
6326 [ 6485 [
6327 ( 6486 (
6328 'A', 6487 b'A',
6329 'addremove', 6488 b'addremove',
6330 None, 6489 None,
6331 _('mark new/missing files as added/removed before shelving'), 6490 _(b'mark new/missing files as added/removed before shelving'),
6332 ), 6491 ),
6333 ('u', 'unknown', None, _('store unknown files in the shelve')), 6492 (b'u', b'unknown', None, _(b'store unknown files in the shelve')),
6334 ('', 'cleanup', None, _('delete all shelved changes')), 6493 (b'', b'cleanup', None, _(b'delete all shelved changes')),
6335 ('', 'date', '', _('shelve with the specified commit date'), _('DATE')), 6494 (
6336 ('d', 'delete', None, _('delete the named shelved change(s)')), 6495 b'',
6337 ('e', 'edit', False, _('invoke editor on commit messages')), 6496 b'date',
6338 ( 6497 b'',
6339 'k', 6498 _(b'shelve with the specified commit date'),
6340 'keep', 6499 _(b'DATE'),
6500 ),
6501 (b'd', b'delete', None, _(b'delete the named shelved change(s)')),
6502 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
6503 (
6504 b'k',
6505 b'keep',
6341 False, 6506 False,
6342 _('shelve, but keep changes in the working directory'), 6507 _(b'shelve, but keep changes in the working directory'),
6343 ), 6508 ),
6344 ('l', 'list', None, _('list current shelves')), 6509 (b'l', b'list', None, _(b'list current shelves')),
6345 ('m', 'message', '', _('use text as shelve message'), _('TEXT')), 6510 (b'm', b'message', b'', _(b'use text as shelve message'), _(b'TEXT')),
6346 ( 6511 (
6347 'n', 6512 b'n',
6348 'name', 6513 b'name',
6349 '', 6514 b'',
6350 _('use the given name for the shelved commit'), 6515 _(b'use the given name for the shelved commit'),
6351 _('NAME'), 6516 _(b'NAME'),
6352 ), 6517 ),
6353 ( 6518 (
6354 'p', 6519 b'p',
6355 'patch', 6520 b'patch',
6356 None, 6521 None,
6357 _( 6522 _(
6358 'output patches for changes (provide the names of the shelved ' 6523 b'output patches for changes (provide the names of the shelved '
6359 'changes as positional arguments)' 6524 b'changes as positional arguments)'
6360 ), 6525 ),
6361 ), 6526 ),
6362 ('i', 'interactive', None, _('interactive mode')), 6527 (b'i', b'interactive', None, _(b'interactive mode')),
6363 ( 6528 (
6364 '', 6529 b'',
6365 'stat', 6530 b'stat',
6366 None, 6531 None,
6367 _( 6532 _(
6368 'output diffstat-style summary of changes (provide the names of ' 6533 b'output diffstat-style summary of changes (provide the names of '
6369 'the shelved changes as positional arguments)' 6534 b'the shelved changes as positional arguments)'
6370 ), 6535 ),
6371 ), 6536 ),
6372 ] 6537 ]
6373 + cmdutil.walkopts, 6538 + cmdutil.walkopts,
6374 _('hg shelve [OPTION]... [FILE]...'), 6539 _(b'hg shelve [OPTION]... [FILE]...'),
6375 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 6540 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6376 ) 6541 )
6377 def shelve(ui, repo, *pats, **opts): 6542 def shelve(ui, repo, *pats, **opts):
6378 '''save and set aside changes from the working directory 6543 '''save and set aside changes from the working directory
6379 6544
6407 To delete specific shelved changes, use ``--delete``. To delete 6572 To delete specific shelved changes, use ``--delete``. To delete
6408 all shelved changes, use ``--cleanup``. 6573 all shelved changes, use ``--cleanup``.
6409 ''' 6574 '''
6410 opts = pycompat.byteskwargs(opts) 6575 opts = pycompat.byteskwargs(opts)
6411 allowables = [ 6576 allowables = [
6412 ('addremove', {'create'}), # 'create' is pseudo action 6577 (b'addremove', {b'create'}), # 'create' is pseudo action
6413 ('unknown', {'create'}), 6578 (b'unknown', {b'create'}),
6414 ('cleanup', {'cleanup'}), 6579 (b'cleanup', {b'cleanup'}),
6415 # ('date', {'create'}), # ignored for passing '--date "0 0"' in tests 6580 # ('date', {'create'}), # ignored for passing '--date "0 0"' in tests
6416 ('delete', {'delete'}), 6581 (b'delete', {b'delete'}),
6417 ('edit', {'create'}), 6582 (b'edit', {b'create'}),
6418 ('keep', {'create'}), 6583 (b'keep', {b'create'}),
6419 ('list', {'list'}), 6584 (b'list', {b'list'}),
6420 ('message', {'create'}), 6585 (b'message', {b'create'}),
6421 ('name', {'create'}), 6586 (b'name', {b'create'}),
6422 ('patch', {'patch', 'list'}), 6587 (b'patch', {b'patch', b'list'}),
6423 ('stat', {'stat', 'list'}), 6588 (b'stat', {b'stat', b'list'}),
6424 ] 6589 ]
6425 6590
6426 def checkopt(opt): 6591 def checkopt(opt):
6427 if opts.get(opt): 6592 if opts.get(opt):
6428 for i, allowable in allowables: 6593 for i, allowable in allowables:
6429 if opts[i] and opt not in allowable: 6594 if opts[i] and opt not in allowable:
6430 raise error.Abort( 6595 raise error.Abort(
6431 _( 6596 _(
6432 "options '--%s' and '--%s' may not be " 6597 b"options '--%s' and '--%s' may not be "
6433 "used together" 6598 b"used together"
6434 ) 6599 )
6435 % (opt, i) 6600 % (opt, i)
6436 ) 6601 )
6437 return True 6602 return True
6438 6603
6439 if checkopt('cleanup'): 6604 if checkopt(b'cleanup'):
6440 if pats: 6605 if pats:
6441 raise error.Abort(_("cannot specify names when using '--cleanup'")) 6606 raise error.Abort(_(b"cannot specify names when using '--cleanup'"))
6442 return shelvemod.cleanupcmd(ui, repo) 6607 return shelvemod.cleanupcmd(ui, repo)
6443 elif checkopt('delete'): 6608 elif checkopt(b'delete'):
6444 return shelvemod.deletecmd(ui, repo, pats) 6609 return shelvemod.deletecmd(ui, repo, pats)
6445 elif checkopt('list'): 6610 elif checkopt(b'list'):
6446 return shelvemod.listcmd(ui, repo, pats, opts) 6611 return shelvemod.listcmd(ui, repo, pats, opts)
6447 elif checkopt('patch') or checkopt('stat'): 6612 elif checkopt(b'patch') or checkopt(b'stat'):
6448 return shelvemod.patchcmds(ui, repo, pats, opts) 6613 return shelvemod.patchcmds(ui, repo, pats, opts)
6449 else: 6614 else:
6450 return shelvemod.createcmd(ui, repo, pats, opts) 6615 return shelvemod.createcmd(ui, repo, pats, opts)
6451 6616
6452 6617
6453 _NOTTERSE = 'nothing' 6618 _NOTTERSE = b'nothing'
6454 6619
6455 6620
6456 @command( 6621 @command(
6457 'status|st', 6622 b'status|st',
6458 [ 6623 [
6459 ('A', 'all', None, _('show status of all files')), 6624 (b'A', b'all', None, _(b'show status of all files')),
6460 ('m', 'modified', None, _('show only modified files')), 6625 (b'm', b'modified', None, _(b'show only modified files')),
6461 ('a', 'added', None, _('show only added files')), 6626 (b'a', b'added', None, _(b'show only added files')),
6462 ('r', 'removed', None, _('show only removed files')), 6627 (b'r', b'removed', None, _(b'show only removed files')),
6463 ('d', 'deleted', None, _('show only deleted (but tracked) files')), 6628 (b'd', b'deleted', None, _(b'show only deleted (but tracked) files')),
6464 ('c', 'clean', None, _('show only files without changes')), 6629 (b'c', b'clean', None, _(b'show only files without changes')),
6465 ('u', 'unknown', None, _('show only unknown (not tracked) files')), 6630 (b'u', b'unknown', None, _(b'show only unknown (not tracked) files')),
6466 ('i', 'ignored', None, _('show only ignored files')), 6631 (b'i', b'ignored', None, _(b'show only ignored files')),
6467 ('n', 'no-status', None, _('hide status prefix')), 6632 (b'n', b'no-status', None, _(b'hide status prefix')),
6468 ('t', 'terse', _NOTTERSE, _('show the terse output (EXPERIMENTAL)')), 6633 (b't', b'terse', _NOTTERSE, _(b'show the terse output (EXPERIMENTAL)')),
6469 ('C', 'copies', None, _('show source of copied files')), 6634 (b'C', b'copies', None, _(b'show source of copied files')),
6470 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')), 6635 (
6471 ('', 'rev', [], _('show difference from revision'), _('REV')), 6636 b'0',
6472 ('', 'change', '', _('list the changed files of a revision'), _('REV')), 6637 b'print0',
6638 None,
6639 _(b'end filenames with NUL, for use with xargs'),
6640 ),
6641 (b'', b'rev', [], _(b'show difference from revision'), _(b'REV')),
6642 (
6643 b'',
6644 b'change',
6645 b'',
6646 _(b'list the changed files of a revision'),
6647 _(b'REV'),
6648 ),
6473 ] 6649 ]
6474 + walkopts 6650 + walkopts
6475 + subrepoopts 6651 + subrepoopts
6476 + formatteropts, 6652 + formatteropts,
6477 _('[OPTION]... [FILE]...'), 6653 _(b'[OPTION]... [FILE]...'),
6478 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 6654 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6479 helpbasic=True, 6655 helpbasic=True,
6480 inferrepo=True, 6656 inferrepo=True,
6481 intents={INTENT_READONLY}, 6657 intents={INTENT_READONLY},
6482 ) 6658 )
6574 Returns 0 on success. 6750 Returns 0 on success.
6575 6751
6576 """ 6752 """
6577 6753
6578 opts = pycompat.byteskwargs(opts) 6754 opts = pycompat.byteskwargs(opts)
6579 revs = opts.get('rev') 6755 revs = opts.get(b'rev')
6580 change = opts.get('change') 6756 change = opts.get(b'change')
6581 terse = opts.get('terse') 6757 terse = opts.get(b'terse')
6582 if terse is _NOTTERSE: 6758 if terse is _NOTTERSE:
6583 if revs: 6759 if revs:
6584 terse = '' 6760 terse = b''
6585 else: 6761 else:
6586 terse = ui.config('commands', 'status.terse') 6762 terse = ui.config(b'commands', b'status.terse')
6587 6763
6588 if revs and change: 6764 if revs and change:
6589 msg = _('cannot specify --rev and --change at the same time') 6765 msg = _(b'cannot specify --rev and --change at the same time')
6590 raise error.Abort(msg) 6766 raise error.Abort(msg)
6591 elif revs and terse: 6767 elif revs and terse:
6592 msg = _('cannot use --terse with --rev') 6768 msg = _(b'cannot use --terse with --rev')
6593 raise error.Abort(msg) 6769 raise error.Abort(msg)
6594 elif change: 6770 elif change:
6595 repo = scmutil.unhidehashlikerevs(repo, [change], 'nowarn') 6771 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
6596 ctx2 = scmutil.revsingle(repo, change, None) 6772 ctx2 = scmutil.revsingle(repo, change, None)
6597 ctx1 = ctx2.p1() 6773 ctx1 = ctx2.p1()
6598 else: 6774 else:
6599 repo = scmutil.unhidehashlikerevs(repo, revs, 'nowarn') 6775 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
6600 ctx1, ctx2 = scmutil.revpair(repo, revs) 6776 ctx1, ctx2 = scmutil.revpair(repo, revs)
6601 6777
6602 forcerelativevalue = None 6778 forcerelativevalue = None
6603 if ui.hasconfig('commands', 'status.relative'): 6779 if ui.hasconfig(b'commands', b'status.relative'):
6604 forcerelativevalue = ui.configbool('commands', 'status.relative') 6780 forcerelativevalue = ui.configbool(b'commands', b'status.relative')
6605 uipathfn = scmutil.getuipathfn( 6781 uipathfn = scmutil.getuipathfn(
6606 repo, 6782 repo,
6607 legacyrelativevalue=bool(pats), 6783 legacyrelativevalue=bool(pats),
6608 forcerelativevalue=forcerelativevalue, 6784 forcerelativevalue=forcerelativevalue,
6609 ) 6785 )
6610 6786
6611 if opts.get('print0'): 6787 if opts.get(b'print0'):
6612 end = '\0' 6788 end = b'\0'
6613 else: 6789 else:
6614 end = '\n' 6790 end = b'\n'
6615 copy = {} 6791 copy = {}
6616 states = 'modified added removed deleted unknown ignored clean'.split() 6792 states = b'modified added removed deleted unknown ignored clean'.split()
6617 show = [k for k in states if opts.get(k)] 6793 show = [k for k in states if opts.get(k)]
6618 if opts.get('all'): 6794 if opts.get(b'all'):
6619 show += ui.quiet and (states[:4] + ['clean']) or states 6795 show += ui.quiet and (states[:4] + [b'clean']) or states
6620 6796
6621 if not show: 6797 if not show:
6622 if ui.quiet: 6798 if ui.quiet:
6623 show = states[:4] 6799 show = states[:4]
6624 else: 6800 else:
6629 # we need to compute clean and unknown to terse 6805 # we need to compute clean and unknown to terse
6630 stat = repo.status( 6806 stat = repo.status(
6631 ctx1.node(), 6807 ctx1.node(),
6632 ctx2.node(), 6808 ctx2.node(),
6633 m, 6809 m,
6634 'ignored' in show or 'i' in terse, 6810 b'ignored' in show or b'i' in terse,
6635 clean=True, 6811 clean=True,
6636 unknown=True, 6812 unknown=True,
6637 listsubrepos=opts.get('subrepos'), 6813 listsubrepos=opts.get(b'subrepos'),
6638 ) 6814 )
6639 6815
6640 stat = cmdutil.tersedir(stat, terse) 6816 stat = cmdutil.tersedir(stat, terse)
6641 else: 6817 else:
6642 stat = repo.status( 6818 stat = repo.status(
6643 ctx1.node(), 6819 ctx1.node(),
6644 ctx2.node(), 6820 ctx2.node(),
6645 m, 6821 m,
6646 'ignored' in show, 6822 b'ignored' in show,
6647 'clean' in show, 6823 b'clean' in show,
6648 'unknown' in show, 6824 b'unknown' in show,
6649 opts.get('subrepos'), 6825 opts.get(b'subrepos'),
6650 ) 6826 )
6651 6827
6652 changestates = zip(states, pycompat.iterbytestr('MAR!?IC'), stat) 6828 changestates = zip(states, pycompat.iterbytestr(b'MAR!?IC'), stat)
6653 6829
6654 if ( 6830 if (
6655 opts.get('all') 6831 opts.get(b'all')
6656 or opts.get('copies') 6832 or opts.get(b'copies')
6657 or ui.configbool('ui', 'statuscopies') 6833 or ui.configbool(b'ui', b'statuscopies')
6658 ) and not opts.get('no_status'): 6834 ) and not opts.get(b'no_status'):
6659 copy = copies.pathcopies(ctx1, ctx2, m) 6835 copy = copies.pathcopies(ctx1, ctx2, m)
6660 6836
6661 ui.pager('status') 6837 ui.pager(b'status')
6662 fm = ui.formatter('status', opts) 6838 fm = ui.formatter(b'status', opts)
6663 fmt = '%s' + end 6839 fmt = b'%s' + end
6664 showchar = not opts.get('no_status') 6840 showchar = not opts.get(b'no_status')
6665 6841
6666 for state, char, files in changestates: 6842 for state, char, files in changestates:
6667 if state in show: 6843 if state in show:
6668 label = 'status.' + state 6844 label = b'status.' + state
6669 for f in files: 6845 for f in files:
6670 fm.startitem() 6846 fm.startitem()
6671 fm.context(ctx=ctx2) 6847 fm.context(ctx=ctx2)
6672 fm.data(path=f) 6848 fm.data(path=f)
6673 fm.condwrite(showchar, 'status', '%s ', char, label=label) 6849 fm.condwrite(showchar, b'status', b'%s ', char, label=label)
6674 fm.plain(fmt % uipathfn(f), label=label) 6850 fm.plain(fmt % uipathfn(f), label=label)
6675 if f in copy: 6851 if f in copy:
6676 fm.data(source=copy[f]) 6852 fm.data(source=copy[f])
6677 fm.plain( 6853 fm.plain(
6678 (' %s' + end) % uipathfn(copy[f]), 6854 (b' %s' + end) % uipathfn(copy[f]),
6679 label='status.copied', 6855 label=b'status.copied',
6680 ) 6856 )
6681 6857
6682 if ( 6858 if (
6683 ui.verbose or ui.configbool('commands', 'status.verbose') 6859 ui.verbose or ui.configbool(b'commands', b'status.verbose')
6684 ) and not ui.plain(): 6860 ) and not ui.plain():
6685 cmdutil.morestatus(repo, fm) 6861 cmdutil.morestatus(repo, fm)
6686 fm.end() 6862 fm.end()
6687 6863
6688 6864
6689 @command( 6865 @command(
6690 'summary|sum', 6866 b'summary|sum',
6691 [('', 'remote', None, _('check for push and pull'))], 6867 [(b'', b'remote', None, _(b'check for push and pull'))],
6692 '[--remote]', 6868 b'[--remote]',
6693 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 6869 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6694 helpbasic=True, 6870 helpbasic=True,
6695 intents={INTENT_READONLY}, 6871 intents={INTENT_READONLY},
6696 ) 6872 )
6697 def summary(ui, repo, **opts): 6873 def summary(ui, repo, **opts):
6705 6881
6706 Returns 0 on success. 6882 Returns 0 on success.
6707 """ 6883 """
6708 6884
6709 opts = pycompat.byteskwargs(opts) 6885 opts = pycompat.byteskwargs(opts)
6710 ui.pager('summary') 6886 ui.pager(b'summary')
6711 ctx = repo[None] 6887 ctx = repo[None]
6712 parents = ctx.parents() 6888 parents = ctx.parents()
6713 pnode = parents[0].node() 6889 pnode = parents[0].node()
6714 marks = [] 6890 marks = []
6715 6891
6716 try: 6892 try:
6717 ms = mergemod.mergestate.read(repo) 6893 ms = mergemod.mergestate.read(repo)
6718 except error.UnsupportedMergeRecords as e: 6894 except error.UnsupportedMergeRecords as e:
6719 s = ' '.join(e.recordtypes) 6895 s = b' '.join(e.recordtypes)
6720 ui.warn( 6896 ui.warn(
6721 _('warning: merge state has unsupported record types: %s\n') % s 6897 _(b'warning: merge state has unsupported record types: %s\n') % s
6722 ) 6898 )
6723 unresolved = [] 6899 unresolved = []
6724 else: 6900 else:
6725 unresolved = list(ms.unresolved()) 6901 unresolved = list(ms.unresolved())
6726 6902
6727 for p in parents: 6903 for p in parents:
6728 # label with log.changeset (instead of log.parent) since this 6904 # label with log.changeset (instead of log.parent) since this
6729 # shows a working directory parent *changeset*: 6905 # shows a working directory parent *changeset*:
6730 # i18n: column positioning for "hg summary" 6906 # i18n: column positioning for "hg summary"
6731 ui.write( 6907 ui.write(
6732 _('parent: %d:%s ') % (p.rev(), p), 6908 _(b'parent: %d:%s ') % (p.rev(), p),
6733 label=logcmdutil.changesetlabels(p), 6909 label=logcmdutil.changesetlabels(p),
6734 ) 6910 )
6735 ui.write(' '.join(p.tags()), label='log.tag') 6911 ui.write(b' '.join(p.tags()), label=b'log.tag')
6736 if p.bookmarks(): 6912 if p.bookmarks():
6737 marks.extend(p.bookmarks()) 6913 marks.extend(p.bookmarks())
6738 if p.rev() == -1: 6914 if p.rev() == -1:
6739 if not len(repo): 6915 if not len(repo):
6740 ui.write(_(' (empty repository)')) 6916 ui.write(_(b' (empty repository)'))
6741 else: 6917 else:
6742 ui.write(_(' (no revision checked out)')) 6918 ui.write(_(b' (no revision checked out)'))
6743 if p.obsolete(): 6919 if p.obsolete():
6744 ui.write(_(' (obsolete)')) 6920 ui.write(_(b' (obsolete)'))
6745 if p.isunstable(): 6921 if p.isunstable():
6746 instabilities = ( 6922 instabilities = (
6747 ui.label(instability, 'trouble.%s' % instability) 6923 ui.label(instability, b'trouble.%s' % instability)
6748 for instability in p.instabilities() 6924 for instability in p.instabilities()
6749 ) 6925 )
6750 ui.write(' (' + ', '.join(instabilities) + ')') 6926 ui.write(b' (' + b', '.join(instabilities) + b')')
6751 ui.write('\n') 6927 ui.write(b'\n')
6752 if p.description(): 6928 if p.description():
6753 ui.status( 6929 ui.status(
6754 ' ' + p.description().splitlines()[0].strip() + '\n', 6930 b' ' + p.description().splitlines()[0].strip() + b'\n',
6755 label='log.summary', 6931 label=b'log.summary',
6756 ) 6932 )
6757 6933
6758 branch = ctx.branch() 6934 branch = ctx.branch()
6759 bheads = repo.branchheads(branch) 6935 bheads = repo.branchheads(branch)
6760 # i18n: column positioning for "hg summary" 6936 # i18n: column positioning for "hg summary"
6761 m = _('branch: %s\n') % branch 6937 m = _(b'branch: %s\n') % branch
6762 if branch != 'default': 6938 if branch != b'default':
6763 ui.write(m, label='log.branch') 6939 ui.write(m, label=b'log.branch')
6764 else: 6940 else:
6765 ui.status(m, label='log.branch') 6941 ui.status(m, label=b'log.branch')
6766 6942
6767 if marks: 6943 if marks:
6768 active = repo._activebookmark 6944 active = repo._activebookmark
6769 # i18n: column positioning for "hg summary" 6945 # i18n: column positioning for "hg summary"
6770 ui.write(_('bookmarks:'), label='log.bookmark') 6946 ui.write(_(b'bookmarks:'), label=b'log.bookmark')
6771 if active is not None: 6947 if active is not None:
6772 if active in marks: 6948 if active in marks:
6773 ui.write(' *' + active, label=bookmarks.activebookmarklabel) 6949 ui.write(b' *' + active, label=bookmarks.activebookmarklabel)
6774 marks.remove(active) 6950 marks.remove(active)
6775 else: 6951 else:
6776 ui.write(' [%s]' % active, label=bookmarks.activebookmarklabel) 6952 ui.write(b' [%s]' % active, label=bookmarks.activebookmarklabel)
6777 for m in marks: 6953 for m in marks:
6778 ui.write(' ' + m, label='log.bookmark') 6954 ui.write(b' ' + m, label=b'log.bookmark')
6779 ui.write('\n', label='log.bookmark') 6955 ui.write(b'\n', label=b'log.bookmark')
6780 6956
6781 status = repo.status(unknown=True) 6957 status = repo.status(unknown=True)
6782 6958
6783 c = repo.dirstate.copies() 6959 c = repo.dirstate.copies()
6784 copied, renamed = [], [] 6960 copied, renamed = [], []
6792 status.added.remove(d) 6968 status.added.remove(d)
6793 6969
6794 subs = [s for s in ctx.substate if ctx.sub(s).dirty()] 6970 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
6795 6971
6796 labels = [ 6972 labels = [
6797 (ui.label(_('%d modified'), 'status.modified'), status.modified), 6973 (ui.label(_(b'%d modified'), b'status.modified'), status.modified),
6798 (ui.label(_('%d added'), 'status.added'), status.added), 6974 (ui.label(_(b'%d added'), b'status.added'), status.added),
6799 (ui.label(_('%d removed'), 'status.removed'), status.removed), 6975 (ui.label(_(b'%d removed'), b'status.removed'), status.removed),
6800 (ui.label(_('%d renamed'), 'status.copied'), renamed), 6976 (ui.label(_(b'%d renamed'), b'status.copied'), renamed),
6801 (ui.label(_('%d copied'), 'status.copied'), copied), 6977 (ui.label(_(b'%d copied'), b'status.copied'), copied),
6802 (ui.label(_('%d deleted'), 'status.deleted'), status.deleted), 6978 (ui.label(_(b'%d deleted'), b'status.deleted'), status.deleted),
6803 (ui.label(_('%d unknown'), 'status.unknown'), status.unknown), 6979 (ui.label(_(b'%d unknown'), b'status.unknown'), status.unknown),
6804 (ui.label(_('%d unresolved'), 'resolve.unresolved'), unresolved), 6980 (ui.label(_(b'%d unresolved'), b'resolve.unresolved'), unresolved),
6805 (ui.label(_('%d subrepos'), 'status.modified'), subs), 6981 (ui.label(_(b'%d subrepos'), b'status.modified'), subs),
6806 ] 6982 ]
6807 t = [] 6983 t = []
6808 for l, s in labels: 6984 for l, s in labels:
6809 if s: 6985 if s:
6810 t.append(l % len(s)) 6986 t.append(l % len(s))
6811 6987
6812 t = ', '.join(t) 6988 t = b', '.join(t)
6813 cleanworkdir = False 6989 cleanworkdir = False
6814 6990
6815 if repo.vfs.exists('graftstate'): 6991 if repo.vfs.exists(b'graftstate'):
6816 t += _(' (graft in progress)') 6992 t += _(b' (graft in progress)')
6817 if repo.vfs.exists('updatestate'): 6993 if repo.vfs.exists(b'updatestate'):
6818 t += _(' (interrupted update)') 6994 t += _(b' (interrupted update)')
6819 elif len(parents) > 1: 6995 elif len(parents) > 1:
6820 t += _(' (merge)') 6996 t += _(b' (merge)')
6821 elif branch != parents[0].branch(): 6997 elif branch != parents[0].branch():
6822 t += _(' (new branch)') 6998 t += _(b' (new branch)')
6823 elif parents[0].closesbranch() and pnode in repo.branchheads( 6999 elif parents[0].closesbranch() and pnode in repo.branchheads(
6824 branch, closed=True 7000 branch, closed=True
6825 ): 7001 ):
6826 t += _(' (head closed)') 7002 t += _(b' (head closed)')
6827 elif not ( 7003 elif not (
6828 status.modified 7004 status.modified
6829 or status.added 7005 or status.added
6830 or status.removed 7006 or status.removed
6831 or renamed 7007 or renamed
6832 or copied 7008 or copied
6833 or subs 7009 or subs
6834 ): 7010 ):
6835 t += _(' (clean)') 7011 t += _(b' (clean)')
6836 cleanworkdir = True 7012 cleanworkdir = True
6837 elif pnode not in bheads: 7013 elif pnode not in bheads:
6838 t += _(' (new branch head)') 7014 t += _(b' (new branch head)')
6839 7015
6840 if parents: 7016 if parents:
6841 pendingphase = max(p.phase() for p in parents) 7017 pendingphase = max(p.phase() for p in parents)
6842 else: 7018 else:
6843 pendingphase = phases.public 7019 pendingphase = phases.public
6844 7020
6845 if pendingphase > phases.newcommitphase(ui): 7021 if pendingphase > phases.newcommitphase(ui):
6846 t += ' (%s)' % phases.phasenames[pendingphase] 7022 t += b' (%s)' % phases.phasenames[pendingphase]
6847 7023
6848 if cleanworkdir: 7024 if cleanworkdir:
6849 # i18n: column positioning for "hg summary" 7025 # i18n: column positioning for "hg summary"
6850 ui.status(_('commit: %s\n') % t.strip()) 7026 ui.status(_(b'commit: %s\n') % t.strip())
6851 else: 7027 else:
6852 # i18n: column positioning for "hg summary" 7028 # i18n: column positioning for "hg summary"
6853 ui.write(_('commit: %s\n') % t.strip()) 7029 ui.write(_(b'commit: %s\n') % t.strip())
6854 7030
6855 # all ancestors of branch heads - all ancestors of parent = new csets 7031 # all ancestors of branch heads - all ancestors of parent = new csets
6856 new = len( 7032 new = len(
6857 repo.changelog.findmissing([pctx.node() for pctx in parents], bheads) 7033 repo.changelog.findmissing([pctx.node() for pctx in parents], bheads)
6858 ) 7034 )
6859 7035
6860 if new == 0: 7036 if new == 0:
6861 # i18n: column positioning for "hg summary" 7037 # i18n: column positioning for "hg summary"
6862 ui.status(_('update: (current)\n')) 7038 ui.status(_(b'update: (current)\n'))
6863 elif pnode not in bheads: 7039 elif pnode not in bheads:
6864 # i18n: column positioning for "hg summary" 7040 # i18n: column positioning for "hg summary"
6865 ui.write(_('update: %d new changesets (update)\n') % new) 7041 ui.write(_(b'update: %d new changesets (update)\n') % new)
6866 else: 7042 else:
6867 # i18n: column positioning for "hg summary" 7043 # i18n: column positioning for "hg summary"
6868 ui.write( 7044 ui.write(
6869 _('update: %d new changesets, %d branch heads (merge)\n') 7045 _(b'update: %d new changesets, %d branch heads (merge)\n')
6870 % (new, len(bheads)) 7046 % (new, len(bheads))
6871 ) 7047 )
6872 7048
6873 t = [] 7049 t = []
6874 draft = len(repo.revs('draft()')) 7050 draft = len(repo.revs(b'draft()'))
6875 if draft: 7051 if draft:
6876 t.append(_('%d draft') % draft) 7052 t.append(_(b'%d draft') % draft)
6877 secret = len(repo.revs('secret()')) 7053 secret = len(repo.revs(b'secret()'))
6878 if secret: 7054 if secret:
6879 t.append(_('%d secret') % secret) 7055 t.append(_(b'%d secret') % secret)
6880 7056
6881 if draft or secret: 7057 if draft or secret:
6882 ui.status(_('phases: %s\n') % ', '.join(t)) 7058 ui.status(_(b'phases: %s\n') % b', '.join(t))
6883 7059
6884 if obsolete.isenabled(repo, obsolete.createmarkersopt): 7060 if obsolete.isenabled(repo, obsolete.createmarkersopt):
6885 for trouble in ("orphan", "contentdivergent", "phasedivergent"): 7061 for trouble in (b"orphan", b"contentdivergent", b"phasedivergent"):
6886 numtrouble = len(repo.revs(trouble + "()")) 7062 numtrouble = len(repo.revs(trouble + b"()"))
6887 # We write all the possibilities to ease translation 7063 # We write all the possibilities to ease translation
6888 troublemsg = { 7064 troublemsg = {
6889 "orphan": _("orphan: %d changesets"), 7065 b"orphan": _(b"orphan: %d changesets"),
6890 "contentdivergent": _("content-divergent: %d changesets"), 7066 b"contentdivergent": _(b"content-divergent: %d changesets"),
6891 "phasedivergent": _("phase-divergent: %d changesets"), 7067 b"phasedivergent": _(b"phase-divergent: %d changesets"),
6892 } 7068 }
6893 if numtrouble > 0: 7069 if numtrouble > 0:
6894 ui.status(troublemsg[trouble] % numtrouble + "\n") 7070 ui.status(troublemsg[trouble] % numtrouble + b"\n")
6895 7071
6896 cmdutil.summaryhooks(ui, repo) 7072 cmdutil.summaryhooks(ui, repo)
6897 7073
6898 if opts.get('remote'): 7074 if opts.get(b'remote'):
6899 needsincoming, needsoutgoing = True, True 7075 needsincoming, needsoutgoing = True, True
6900 else: 7076 else:
6901 needsincoming, needsoutgoing = False, False 7077 needsincoming, needsoutgoing = False, False
6902 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None): 7078 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
6903 if i: 7079 if i:
6906 needsoutgoing = True 7082 needsoutgoing = True
6907 if not needsincoming and not needsoutgoing: 7083 if not needsincoming and not needsoutgoing:
6908 return 7084 return
6909 7085
6910 def getincoming(): 7086 def getincoming():
6911 source, branches = hg.parseurl(ui.expandpath('default')) 7087 source, branches = hg.parseurl(ui.expandpath(b'default'))
6912 sbranch = branches[0] 7088 sbranch = branches[0]
6913 try: 7089 try:
6914 other = hg.peer(repo, {}, source) 7090 other = hg.peer(repo, {}, source)
6915 except error.RepoError: 7091 except error.RepoError:
6916 if opts.get('remote'): 7092 if opts.get(b'remote'):
6917 raise 7093 raise
6918 return source, sbranch, None, None, None 7094 return source, sbranch, None, None, None
6919 revs, checkout = hg.addbranchrevs(repo, other, branches, None) 7095 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
6920 if revs: 7096 if revs:
6921 revs = [other.lookup(rev) for rev in revs] 7097 revs = [other.lookup(rev) for rev in revs]
6922 ui.debug('comparing with %s\n' % util.hidepassword(source)) 7098 ui.debug(b'comparing with %s\n' % util.hidepassword(source))
6923 repo.ui.pushbuffer() 7099 repo.ui.pushbuffer()
6924 commoninc = discovery.findcommonincoming(repo, other, heads=revs) 7100 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
6925 repo.ui.popbuffer() 7101 repo.ui.popbuffer()
6926 return source, sbranch, other, commoninc, commoninc[1] 7102 return source, sbranch, other, commoninc, commoninc[1]
6927 7103
6929 source, sbranch, sother, commoninc, incoming = getincoming() 7105 source, sbranch, sother, commoninc, incoming = getincoming()
6930 else: 7106 else:
6931 source = sbranch = sother = commoninc = incoming = None 7107 source = sbranch = sother = commoninc = incoming = None
6932 7108
6933 def getoutgoing(): 7109 def getoutgoing():
6934 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default')) 7110 dest, branches = hg.parseurl(ui.expandpath(b'default-push', b'default'))
6935 dbranch = branches[0] 7111 dbranch = branches[0]
6936 revs, checkout = hg.addbranchrevs(repo, repo, branches, None) 7112 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
6937 if source != dest: 7113 if source != dest:
6938 try: 7114 try:
6939 dother = hg.peer(repo, {}, dest) 7115 dother = hg.peer(repo, {}, dest)
6940 except error.RepoError: 7116 except error.RepoError:
6941 if opts.get('remote'): 7117 if opts.get(b'remote'):
6942 raise 7118 raise
6943 return dest, dbranch, None, None 7119 return dest, dbranch, None, None
6944 ui.debug('comparing with %s\n' % util.hidepassword(dest)) 7120 ui.debug(b'comparing with %s\n' % util.hidepassword(dest))
6945 elif sother is None: 7121 elif sother is None:
6946 # there is no explicit destination peer, but source one is invalid 7122 # there is no explicit destination peer, but source one is invalid
6947 return dest, dbranch, None, None 7123 return dest, dbranch, None, None
6948 else: 7124 else:
6949 dother = sother 7125 dother = sother
6963 if needsoutgoing: 7139 if needsoutgoing:
6964 dest, dbranch, dother, outgoing = getoutgoing() 7140 dest, dbranch, dother, outgoing = getoutgoing()
6965 else: 7141 else:
6966 dest = dbranch = dother = outgoing = None 7142 dest = dbranch = dother = outgoing = None
6967 7143
6968 if opts.get('remote'): 7144 if opts.get(b'remote'):
6969 t = [] 7145 t = []
6970 if incoming: 7146 if incoming:
6971 t.append(_('1 or more incoming')) 7147 t.append(_(b'1 or more incoming'))
6972 o = outgoing.missing 7148 o = outgoing.missing
6973 if o: 7149 if o:
6974 t.append(_('%d outgoing') % len(o)) 7150 t.append(_(b'%d outgoing') % len(o))
6975 other = dother or sother 7151 other = dother or sother
6976 if 'bookmarks' in other.listkeys('namespaces'): 7152 if b'bookmarks' in other.listkeys(b'namespaces'):
6977 counts = bookmarks.summary(repo, other) 7153 counts = bookmarks.summary(repo, other)
6978 if counts[0] > 0: 7154 if counts[0] > 0:
6979 t.append(_('%d incoming bookmarks') % counts[0]) 7155 t.append(_(b'%d incoming bookmarks') % counts[0])
6980 if counts[1] > 0: 7156 if counts[1] > 0:
6981 t.append(_('%d outgoing bookmarks') % counts[1]) 7157 t.append(_(b'%d outgoing bookmarks') % counts[1])
6982 7158
6983 if t: 7159 if t:
6984 # i18n: column positioning for "hg summary" 7160 # i18n: column positioning for "hg summary"
6985 ui.write(_('remote: %s\n') % (', '.join(t))) 7161 ui.write(_(b'remote: %s\n') % (b', '.join(t)))
6986 else: 7162 else:
6987 # i18n: column positioning for "hg summary" 7163 # i18n: column positioning for "hg summary"
6988 ui.status(_('remote: (synced)\n')) 7164 ui.status(_(b'remote: (synced)\n'))
6989 7165
6990 cmdutil.summaryremotehooks( 7166 cmdutil.summaryremotehooks(
6991 ui, 7167 ui,
6992 repo, 7168 repo,
6993 opts, 7169 opts,
6997 ), 7173 ),
6998 ) 7174 )
6999 7175
7000 7176
7001 @command( 7177 @command(
7002 'tag', 7178 b'tag',
7003 [ 7179 [
7004 ('f', 'force', None, _('force tag')), 7180 (b'f', b'force', None, _(b'force tag')),
7005 ('l', 'local', None, _('make the tag local')), 7181 (b'l', b'local', None, _(b'make the tag local')),
7006 ('r', 'rev', '', _('revision to tag'), _('REV')), 7182 (b'r', b'rev', b'', _(b'revision to tag'), _(b'REV')),
7007 ('', 'remove', None, _('remove a tag')), 7183 (b'', b'remove', None, _(b'remove a tag')),
7008 # -l/--local is already there, commitopts cannot be used 7184 # -l/--local is already there, commitopts cannot be used
7009 ('e', 'edit', None, _('invoke editor on commit messages')), 7185 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
7010 ('m', 'message', '', _('use text as commit message'), _('TEXT')), 7186 (b'm', b'message', b'', _(b'use text as commit message'), _(b'TEXT')),
7011 ] 7187 ]
7012 + commitopts2, 7188 + commitopts2,
7013 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'), 7189 _(b'[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'),
7014 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION, 7190 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7015 ) 7191 )
7016 def tag(ui, repo, name1, *names, **opts): 7192 def tag(ui, repo, name1, *names, **opts):
7017 """add one or more tags for the current or given revision 7193 """add one or more tags for the current or given revision
7018 7194
7045 7221
7046 Returns 0 on success. 7222 Returns 0 on success.
7047 """ 7223 """
7048 opts = pycompat.byteskwargs(opts) 7224 opts = pycompat.byteskwargs(opts)
7049 with repo.wlock(), repo.lock(): 7225 with repo.wlock(), repo.lock():
7050 rev_ = "." 7226 rev_ = b"."
7051 names = [t.strip() for t in (name1,) + names] 7227 names = [t.strip() for t in (name1,) + names]
7052 if len(names) != len(set(names)): 7228 if len(names) != len(set(names)):
7053 raise error.Abort(_('tag names must be unique')) 7229 raise error.Abort(_(b'tag names must be unique'))
7054 for n in names: 7230 for n in names:
7055 scmutil.checknewlabel(repo, n, 'tag') 7231 scmutil.checknewlabel(repo, n, b'tag')
7056 if not n: 7232 if not n:
7057 raise error.Abort( 7233 raise error.Abort(
7058 _('tag names cannot consist entirely of ' 'whitespace') 7234 _(b'tag names cannot consist entirely of ' b'whitespace')
7059 ) 7235 )
7060 if opts.get('rev') and opts.get('remove'): 7236 if opts.get(b'rev') and opts.get(b'remove'):
7061 raise error.Abort(_("--rev and --remove are incompatible")) 7237 raise error.Abort(_(b"--rev and --remove are incompatible"))
7062 if opts.get('rev'): 7238 if opts.get(b'rev'):
7063 rev_ = opts['rev'] 7239 rev_ = opts[b'rev']
7064 message = opts.get('message') 7240 message = opts.get(b'message')
7065 if opts.get('remove'): 7241 if opts.get(b'remove'):
7066 if opts.get('local'): 7242 if opts.get(b'local'):
7067 expectedtype = 'local' 7243 expectedtype = b'local'
7068 else: 7244 else:
7069 expectedtype = 'global' 7245 expectedtype = b'global'
7070 7246
7071 for n in names: 7247 for n in names:
7072 if repo.tagtype(n) == 'global': 7248 if repo.tagtype(n) == b'global':
7073 alltags = tagsmod.findglobaltags(ui, repo) 7249 alltags = tagsmod.findglobaltags(ui, repo)
7074 if alltags[n][0] == nullid: 7250 if alltags[n][0] == nullid:
7075 raise error.Abort(_("tag '%s' is already removed") % n) 7251 raise error.Abort(_(b"tag '%s' is already removed") % n)
7076 if not repo.tagtype(n): 7252 if not repo.tagtype(n):
7077 raise error.Abort(_("tag '%s' does not exist") % n) 7253 raise error.Abort(_(b"tag '%s' does not exist") % n)
7078 if repo.tagtype(n) != expectedtype: 7254 if repo.tagtype(n) != expectedtype:
7079 if expectedtype == 'global': 7255 if expectedtype == b'global':
7080 raise error.Abort(_("tag '%s' is not a global tag") % n) 7256 raise error.Abort(
7257 _(b"tag '%s' is not a global tag") % n
7258 )
7081 else: 7259 else:
7082 raise error.Abort(_("tag '%s' is not a local tag") % n) 7260 raise error.Abort(_(b"tag '%s' is not a local tag") % n)
7083 rev_ = 'null' 7261 rev_ = b'null'
7084 if not message: 7262 if not message:
7085 # we don't translate commit messages 7263 # we don't translate commit messages
7086 message = 'Removed tag %s' % ', '.join(names) 7264 message = b'Removed tag %s' % b', '.join(names)
7087 elif not opts.get('force'): 7265 elif not opts.get(b'force'):
7088 for n in names: 7266 for n in names:
7089 if n in repo.tags(): 7267 if n in repo.tags():
7090 raise error.Abort( 7268 raise error.Abort(
7091 _("tag '%s' already exists " "(use -f to force)") % n 7269 _(b"tag '%s' already exists " b"(use -f to force)") % n
7092 ) 7270 )
7093 if not opts.get('local'): 7271 if not opts.get(b'local'):
7094 p1, p2 = repo.dirstate.parents() 7272 p1, p2 = repo.dirstate.parents()
7095 if p2 != nullid: 7273 if p2 != nullid:
7096 raise error.Abort(_('uncommitted merge')) 7274 raise error.Abort(_(b'uncommitted merge'))
7097 bheads = repo.branchheads() 7275 bheads = repo.branchheads()
7098 if not opts.get('force') and bheads and p1 not in bheads: 7276 if not opts.get(b'force') and bheads and p1 not in bheads:
7099 raise error.Abort( 7277 raise error.Abort(
7100 _( 7278 _(
7101 'working directory is not at a branch head ' 7279 b'working directory is not at a branch head '
7102 '(use -f to force)' 7280 b'(use -f to force)'
7103 ) 7281 )
7104 ) 7282 )
7105 node = scmutil.revsingle(repo, rev_).node() 7283 node = scmutil.revsingle(repo, rev_).node()
7106 7284
7107 if not message: 7285 if not message:
7108 # we don't translate commit messages 7286 # we don't translate commit messages
7109 message = 'Added tag %s for changeset %s' % ( 7287 message = b'Added tag %s for changeset %s' % (
7110 ', '.join(names), 7288 b', '.join(names),
7111 short(node), 7289 short(node),
7112 ) 7290 )
7113 7291
7114 date = opts.get('date') 7292 date = opts.get(b'date')
7115 if date: 7293 if date:
7116 date = dateutil.parsedate(date) 7294 date = dateutil.parsedate(date)
7117 7295
7118 if opts.get('remove'): 7296 if opts.get(b'remove'):
7119 editform = 'tag.remove' 7297 editform = b'tag.remove'
7120 else: 7298 else:
7121 editform = 'tag.add' 7299 editform = b'tag.add'
7122 editor = cmdutil.getcommiteditor( 7300 editor = cmdutil.getcommiteditor(
7123 editform=editform, **pycompat.strkwargs(opts) 7301 editform=editform, **pycompat.strkwargs(opts)
7124 ) 7302 )
7125 7303
7126 # don't allow tagging the null rev 7304 # don't allow tagging the null rev
7127 if ( 7305 if (
7128 not opts.get('remove') 7306 not opts.get(b'remove')
7129 and scmutil.revsingle(repo, rev_).rev() == nullrev 7307 and scmutil.revsingle(repo, rev_).rev() == nullrev
7130 ): 7308 ):
7131 raise error.Abort(_("cannot tag null revision")) 7309 raise error.Abort(_(b"cannot tag null revision"))
7132 7310
7133 tagsmod.tag( 7311 tagsmod.tag(
7134 repo, 7312 repo,
7135 names, 7313 names,
7136 node, 7314 node,
7137 message, 7315 message,
7138 opts.get('local'), 7316 opts.get(b'local'),
7139 opts.get('user'), 7317 opts.get(b'user'),
7140 date, 7318 date,
7141 editor=editor, 7319 editor=editor,
7142 ) 7320 )
7143 7321
7144 7322
7145 @command( 7323 @command(
7146 'tags', 7324 b'tags',
7147 formatteropts, 7325 formatteropts,
7148 '', 7326 b'',
7149 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION, 7327 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7150 intents={INTENT_READONLY}, 7328 intents={INTENT_READONLY},
7151 ) 7329 )
7152 def tags(ui, repo, **opts): 7330 def tags(ui, repo, **opts):
7153 """list repository tags 7331 """list repository tags
7168 7346
7169 Returns 0 on success. 7347 Returns 0 on success.
7170 """ 7348 """
7171 7349
7172 opts = pycompat.byteskwargs(opts) 7350 opts = pycompat.byteskwargs(opts)
7173 ui.pager('tags') 7351 ui.pager(b'tags')
7174 fm = ui.formatter('tags', opts) 7352 fm = ui.formatter(b'tags', opts)
7175 hexfunc = fm.hexfunc 7353 hexfunc = fm.hexfunc
7176 7354
7177 for t, n in reversed(repo.tagslist()): 7355 for t, n in reversed(repo.tagslist()):
7178 hn = hexfunc(n) 7356 hn = hexfunc(n)
7179 label = 'tags.normal' 7357 label = b'tags.normal'
7180 tagtype = '' 7358 tagtype = b''
7181 if repo.tagtype(t) == 'local': 7359 if repo.tagtype(t) == b'local':
7182 label = 'tags.local' 7360 label = b'tags.local'
7183 tagtype = 'local' 7361 tagtype = b'local'
7184 7362
7185 fm.startitem() 7363 fm.startitem()
7186 fm.context(repo=repo) 7364 fm.context(repo=repo)
7187 fm.write('tag', '%s', t, label=label) 7365 fm.write(b'tag', b'%s', t, label=label)
7188 fmt = " " * (30 - encoding.colwidth(t)) + ' %5d:%s' 7366 fmt = b" " * (30 - encoding.colwidth(t)) + b' %5d:%s'
7189 fm.condwrite( 7367 fm.condwrite(
7190 not ui.quiet, 7368 not ui.quiet,
7191 'rev node', 7369 b'rev node',
7192 fmt, 7370 fmt,
7193 repo.changelog.rev(n), 7371 repo.changelog.rev(n),
7194 hn, 7372 hn,
7195 label=label, 7373 label=label,
7196 ) 7374 )
7197 fm.condwrite( 7375 fm.condwrite(
7198 ui.verbose and tagtype, 'type', ' %s', tagtype, label=label 7376 ui.verbose and tagtype, b'type', b' %s', tagtype, label=label
7199 ) 7377 )
7200 fm.plain('\n') 7378 fm.plain(b'\n')
7201 fm.end() 7379 fm.end()
7202 7380
7203 7381
7204 @command( 7382 @command(
7205 'tip', 7383 b'tip',
7206 [ 7384 [
7207 ('p', 'patch', None, _('show patch')), 7385 (b'p', b'patch', None, _(b'show patch')),
7208 ('g', 'git', None, _('use git extended diff format')), 7386 (b'g', b'git', None, _(b'use git extended diff format')),
7209 ] 7387 ]
7210 + templateopts, 7388 + templateopts,
7211 _('[-p] [-g]'), 7389 _(b'[-p] [-g]'),
7212 helpcategory=command.CATEGORY_CHANGE_NAVIGATION, 7390 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
7213 ) 7391 )
7214 def tip(ui, repo, **opts): 7392 def tip(ui, repo, **opts):
7215 """show the tip revision (DEPRECATED) 7393 """show the tip revision (DEPRECATED)
7216 7394
7227 7405
7228 Returns 0 on success. 7406 Returns 0 on success.
7229 """ 7407 """
7230 opts = pycompat.byteskwargs(opts) 7408 opts = pycompat.byteskwargs(opts)
7231 displayer = logcmdutil.changesetdisplayer(ui, repo, opts) 7409 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
7232 displayer.show(repo['tip']) 7410 displayer.show(repo[b'tip'])
7233 displayer.close() 7411 displayer.close()
7234 7412
7235 7413
7236 @command( 7414 @command(
7237 'unbundle', 7415 b'unbundle',
7238 [ 7416 [
7239 ( 7417 (
7240 'u', 7418 b'u',
7241 'update', 7419 b'update',
7242 None, 7420 None,
7243 _('update to new branch head if changesets were unbundled'), 7421 _(b'update to new branch head if changesets were unbundled'),
7244 ) 7422 )
7245 ], 7423 ],
7246 _('[-u] FILE...'), 7424 _(b'[-u] FILE...'),
7247 helpcategory=command.CATEGORY_IMPORT_EXPORT, 7425 helpcategory=command.CATEGORY_IMPORT_EXPORT,
7248 ) 7426 )
7249 def unbundle(ui, repo, fname1, *fnames, **opts): 7427 def unbundle(ui, repo, fname1, *fnames, **opts):
7250 """apply one or more bundle files 7428 """apply one or more bundle files
7251 7429
7259 for fname in fnames: 7437 for fname in fnames:
7260 f = hg.openpath(ui, fname) 7438 f = hg.openpath(ui, fname)
7261 gen = exchange.readbundle(ui, f, fname) 7439 gen = exchange.readbundle(ui, f, fname)
7262 if isinstance(gen, streamclone.streamcloneapplier): 7440 if isinstance(gen, streamclone.streamcloneapplier):
7263 raise error.Abort( 7441 raise error.Abort(
7264 _('packed bundles cannot be applied with ' '"hg unbundle"'), 7442 _(
7265 hint=_('use "hg debugapplystreamclonebundle"'), 7443 b'packed bundles cannot be applied with '
7444 b'"hg unbundle"'
7445 ),
7446 hint=_(b'use "hg debugapplystreamclonebundle"'),
7266 ) 7447 )
7267 url = 'bundle:' + fname 7448 url = b'bundle:' + fname
7268 try: 7449 try:
7269 txnname = 'unbundle' 7450 txnname = b'unbundle'
7270 if not isinstance(gen, bundle2.unbundle20): 7451 if not isinstance(gen, bundle2.unbundle20):
7271 txnname = 'unbundle\n%s' % util.hidepassword(url) 7452 txnname = b'unbundle\n%s' % util.hidepassword(url)
7272 with repo.transaction(txnname) as tr: 7453 with repo.transaction(txnname) as tr:
7273 op = bundle2.applybundle( 7454 op = bundle2.applybundle(
7274 repo, gen, tr, source='unbundle', url=url 7455 repo, gen, tr, source=b'unbundle', url=url
7275 ) 7456 )
7276 except error.BundleUnknownFeatureError as exc: 7457 except error.BundleUnknownFeatureError as exc:
7277 raise error.Abort( 7458 raise error.Abort(
7278 _('%s: unknown bundle feature, %s') % (fname, exc), 7459 _(b'%s: unknown bundle feature, %s') % (fname, exc),
7279 hint=_( 7460 hint=_(
7280 "see https://mercurial-scm.org/" 7461 b"see https://mercurial-scm.org/"
7281 "wiki/BundleFeature for more " 7462 b"wiki/BundleFeature for more "
7282 "information" 7463 b"information"
7283 ), 7464 ),
7284 ) 7465 )
7285 modheads = bundle2.combinechangegroupresults(op) 7466 modheads = bundle2.combinechangegroupresults(op)
7286 7467
7287 return postincoming(ui, repo, modheads, opts.get(r'update'), None, None) 7468 return postincoming(ui, repo, modheads, opts.get(r'update'), None, None)
7288 7469
7289 7470
7290 @command( 7471 @command(
7291 'unshelve', 7472 b'unshelve',
7292 [ 7473 [
7293 ('a', 'abort', None, _('abort an incomplete unshelve operation')), 7474 (b'a', b'abort', None, _(b'abort an incomplete unshelve operation')),
7294 ('c', 'continue', None, _('continue an incomplete unshelve operation')), 7475 (
7295 ('i', 'interactive', None, _('use interactive mode (EXPERIMENTAL)')), 7476 b'c',
7296 ('k', 'keep', None, _('keep shelve after unshelving')), 7477 b'continue',
7297 ( 7478 None,
7298 'n', 7479 _(b'continue an incomplete unshelve operation'),
7299 'name', 7480 ),
7300 '', 7481 (b'i', b'interactive', None, _(b'use interactive mode (EXPERIMENTAL)')),
7301 _('restore shelved change with given name'), 7482 (b'k', b'keep', None, _(b'keep shelve after unshelving')),
7302 _('NAME'), 7483 (
7303 ), 7484 b'n',
7304 ('t', 'tool', '', _('specify merge tool')), 7485 b'name',
7305 ( 7486 b'',
7306 '', 7487 _(b'restore shelved change with given name'),
7307 'date', 7488 _(b'NAME'),
7308 '', 7489 ),
7309 _('set date for temporary commits (DEPRECATED)'), 7490 (b't', b'tool', b'', _(b'specify merge tool')),
7310 _('DATE'), 7491 (
7492 b'',
7493 b'date',
7494 b'',
7495 _(b'set date for temporary commits (DEPRECATED)'),
7496 _(b'DATE'),
7311 ), 7497 ),
7312 ], 7498 ],
7313 _('hg unshelve [OPTION]... [FILE]... [-n SHELVED]'), 7499 _(b'hg unshelve [OPTION]... [FILE]... [-n SHELVED]'),
7314 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 7500 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7315 ) 7501 )
7316 def unshelve(ui, repo, *shelved, **opts): 7502 def unshelve(ui, repo, *shelved, **opts):
7317 """restore a shelved change to the working directory 7503 """restore a shelved change to the working directory
7318 7504
7360 with repo.wlock(): 7546 with repo.wlock():
7361 return shelvemod.dounshelve(ui, repo, *shelved, **opts) 7547 return shelvemod.dounshelve(ui, repo, *shelved, **opts)
7362 7548
7363 7549
7364 statemod.addunfinished( 7550 statemod.addunfinished(
7365 'unshelve', 7551 b'unshelve',
7366 fname='shelvedstate', 7552 fname=b'shelvedstate',
7367 continueflag=True, 7553 continueflag=True,
7368 abortfunc=shelvemod.hgabortunshelve, 7554 abortfunc=shelvemod.hgabortunshelve,
7369 continuefunc=shelvemod.hgcontinueunshelve, 7555 continuefunc=shelvemod.hgcontinueunshelve,
7370 cmdmsg=_('unshelve already in progress'), 7556 cmdmsg=_(b'unshelve already in progress'),
7371 ) 7557 )
7372 7558
7373 7559
7374 @command( 7560 @command(
7375 'update|up|checkout|co', 7561 b'update|up|checkout|co',
7376 [ 7562 [
7377 ('C', 'clean', None, _('discard uncommitted changes (no backup)')), 7563 (b'C', b'clean', None, _(b'discard uncommitted changes (no backup)')),
7378 ('c', 'check', None, _('require clean working directory')), 7564 (b'c', b'check', None, _(b'require clean working directory')),
7379 ('m', 'merge', None, _('merge uncommitted changes')), 7565 (b'm', b'merge', None, _(b'merge uncommitted changes')),
7380 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')), 7566 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
7381 ('r', 'rev', '', _('revision'), _('REV')), 7567 (b'r', b'rev', b'', _(b'revision'), _(b'REV')),
7382 ] 7568 ]
7383 + mergetoolopts, 7569 + mergetoolopts,
7384 _('[-C|-c|-m] [-d DATE] [[-r] REV]'), 7570 _(b'[-C|-c|-m] [-d DATE] [[-r] REV]'),
7385 helpcategory=command.CATEGORY_WORKING_DIRECTORY, 7571 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7386 helpbasic=True, 7572 helpbasic=True,
7387 ) 7573 )
7388 def update(ui, repo, node=None, **opts): 7574 def update(ui, repo, node=None, **opts):
7389 """update working directory (or switch revisions) 7575 """update working directory (or switch revisions)
7444 date = opts.get(r'date') 7630 date = opts.get(r'date')
7445 clean = opts.get(r'clean') 7631 clean = opts.get(r'clean')
7446 check = opts.get(r'check') 7632 check = opts.get(r'check')
7447 merge = opts.get(r'merge') 7633 merge = opts.get(r'merge')
7448 if rev and node: 7634 if rev and node:
7449 raise error.Abort(_("please specify just one revision")) 7635 raise error.Abort(_(b"please specify just one revision"))
7450 7636
7451 if ui.configbool('commands', 'update.requiredest'): 7637 if ui.configbool(b'commands', b'update.requiredest'):
7452 if not node and not rev and not date: 7638 if not node and not rev and not date:
7453 raise error.Abort( 7639 raise error.Abort(
7454 _('you must specify a destination'), 7640 _(b'you must specify a destination'),
7455 hint=_('for example: hg update ".::"'), 7641 hint=_(b'for example: hg update ".::"'),
7456 ) 7642 )
7457 7643
7458 if rev is None or rev == '': 7644 if rev is None or rev == b'':
7459 rev = node 7645 rev = node
7460 7646
7461 if date and rev is not None: 7647 if date and rev is not None:
7462 raise error.Abort(_("you can't specify a revision and a date")) 7648 raise error.Abort(_(b"you can't specify a revision and a date"))
7463 7649
7464 if len([x for x in (clean, check, merge) if x]) > 1: 7650 if len([x for x in (clean, check, merge) if x]) > 1:
7465 raise error.Abort( 7651 raise error.Abort(
7466 _( 7652 _(
7467 "can only specify one of -C/--clean, -c/--check, " 7653 b"can only specify one of -C/--clean, -c/--check, "
7468 "or -m/--merge" 7654 b"or -m/--merge"
7469 ) 7655 )
7470 ) 7656 )
7471 7657
7472 updatecheck = None 7658 updatecheck = None
7473 if check: 7659 if check:
7474 updatecheck = 'abort' 7660 updatecheck = b'abort'
7475 elif merge: 7661 elif merge:
7476 updatecheck = 'none' 7662 updatecheck = b'none'
7477 7663
7478 with repo.wlock(): 7664 with repo.wlock():
7479 cmdutil.clearunfinished(repo) 7665 cmdutil.clearunfinished(repo)
7480 if date: 7666 if date:
7481 rev = cmdutil.finddate(ui, repo, date) 7667 rev = cmdutil.finddate(ui, repo, date)
7482 7668
7483 # if we defined a bookmark, we have to remember the original name 7669 # if we defined a bookmark, we have to remember the original name
7484 brev = rev 7670 brev = rev
7485 if rev: 7671 if rev:
7486 repo = scmutil.unhidehashlikerevs(repo, [rev], 'nowarn') 7672 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
7487 ctx = scmutil.revsingle(repo, rev, default=None) 7673 ctx = scmutil.revsingle(repo, rev, default=None)
7488 rev = ctx.rev() 7674 rev = ctx.rev()
7489 hidden = ctx.hidden() 7675 hidden = ctx.hidden()
7490 overrides = {('ui', 'forcemerge'): opts.get(r'tool', '')} 7676 overrides = {(b'ui', b'forcemerge'): opts.get(r'tool', b'')}
7491 with ui.configoverride(overrides, 'update'): 7677 with ui.configoverride(overrides, b'update'):
7492 ret = hg.updatetotally( 7678 ret = hg.updatetotally(
7493 ui, repo, rev, brev, clean=clean, updatecheck=updatecheck 7679 ui, repo, rev, brev, clean=clean, updatecheck=updatecheck
7494 ) 7680 )
7495 if hidden: 7681 if hidden:
7496 ctxstr = ctx.hex()[:12] 7682 ctxstr = ctx.hex()[:12]
7497 ui.warn(_("updated to hidden changeset %s\n") % ctxstr) 7683 ui.warn(_(b"updated to hidden changeset %s\n") % ctxstr)
7498 7684
7499 if ctx.obsolete(): 7685 if ctx.obsolete():
7500 obsfatemsg = obsutil._getfilteredreason(repo, ctxstr, ctx) 7686 obsfatemsg = obsutil._getfilteredreason(repo, ctxstr, ctx)
7501 ui.warn("(%s)\n" % obsfatemsg) 7687 ui.warn(b"(%s)\n" % obsfatemsg)
7502 return ret 7688 return ret
7503 7689
7504 7690
7505 @command( 7691 @command(
7506 'verify', 7692 b'verify',
7507 [('', 'full', False, 'perform more checks (EXPERIMENTAL)')], 7693 [(b'', b'full', False, b'perform more checks (EXPERIMENTAL)')],
7508 helpcategory=command.CATEGORY_MAINTENANCE, 7694 helpcategory=command.CATEGORY_MAINTENANCE,
7509 ) 7695 )
7510 def verify(ui, repo, **opts): 7696 def verify(ui, repo, **opts):
7511 """verify the integrity of the repository 7697 """verify the integrity of the repository
7512 7698
7524 Returns 0 on success, 1 if errors are encountered. 7710 Returns 0 on success, 1 if errors are encountered.
7525 """ 7711 """
7526 opts = pycompat.byteskwargs(opts) 7712 opts = pycompat.byteskwargs(opts)
7527 7713
7528 level = None 7714 level = None
7529 if opts['full']: 7715 if opts[b'full']:
7530 level = verifymod.VERIFY_FULL 7716 level = verifymod.VERIFY_FULL
7531 return hg.verify(repo, level) 7717 return hg.verify(repo, level)
7532 7718
7533 7719
7534 @command( 7720 @command(
7535 'version', 7721 b'version',
7536 [] + formatteropts, 7722 [] + formatteropts,
7537 helpcategory=command.CATEGORY_HELP, 7723 helpcategory=command.CATEGORY_HELP,
7538 norepo=True, 7724 norepo=True,
7539 intents={INTENT_READONLY}, 7725 intents={INTENT_READONLY},
7540 ) 7726 )
7556 :bundled: Boolean. True if included in the release. 7742 :bundled: Boolean. True if included in the release.
7557 :name: String. Extension name. 7743 :name: String. Extension name.
7558 """ 7744 """
7559 opts = pycompat.byteskwargs(opts) 7745 opts = pycompat.byteskwargs(opts)
7560 if ui.verbose: 7746 if ui.verbose:
7561 ui.pager('version') 7747 ui.pager(b'version')
7562 fm = ui.formatter("version", opts) 7748 fm = ui.formatter(b"version", opts)
7563 fm.startitem() 7749 fm.startitem()
7564 fm.write( 7750 fm.write(
7565 "ver", _("Mercurial Distributed SCM (version %s)\n"), util.version() 7751 b"ver", _(b"Mercurial Distributed SCM (version %s)\n"), util.version()
7566 ) 7752 )
7567 license = _( 7753 license = _(
7568 "(see https://mercurial-scm.org for more information)\n" 7754 b"(see https://mercurial-scm.org for more information)\n"
7569 "\nCopyright (C) 2005-2019 Matt Mackall and others\n" 7755 b"\nCopyright (C) 2005-2019 Matt Mackall and others\n"
7570 "This is free software; see the source for copying conditions. " 7756 b"This is free software; see the source for copying conditions. "
7571 "There is NO\nwarranty; " 7757 b"There is NO\nwarranty; "
7572 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" 7758 b"not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
7573 ) 7759 )
7574 if not ui.quiet: 7760 if not ui.quiet:
7575 fm.plain(license) 7761 fm.plain(license)
7576 7762
7577 if ui.verbose: 7763 if ui.verbose:
7578 fm.plain(_("\nEnabled extensions:\n\n")) 7764 fm.plain(_(b"\nEnabled extensions:\n\n"))
7579 # format names and versions into columns 7765 # format names and versions into columns
7580 names = [] 7766 names = []
7581 vers = [] 7767 vers = []
7582 isinternals = [] 7768 isinternals = []
7583 for name, module in extensions.extensions(): 7769 for name, module in extensions.extensions():
7584 names.append(name) 7770 names.append(name)
7585 vers.append(extensions.moduleversion(module) or None) 7771 vers.append(extensions.moduleversion(module) or None)
7586 isinternals.append(extensions.ismoduleinternal(module)) 7772 isinternals.append(extensions.ismoduleinternal(module))
7587 fn = fm.nested("extensions", tmpl='{name}\n') 7773 fn = fm.nested(b"extensions", tmpl=b'{name}\n')
7588 if names: 7774 if names:
7589 namefmt = " %%-%ds " % max(len(n) for n in names) 7775 namefmt = b" %%-%ds " % max(len(n) for n in names)
7590 places = [_("external"), _("internal")] 7776 places = [_(b"external"), _(b"internal")]
7591 for n, v, p in zip(names, vers, isinternals): 7777 for n, v, p in zip(names, vers, isinternals):
7592 fn.startitem() 7778 fn.startitem()
7593 fn.condwrite(ui.verbose, "name", namefmt, n) 7779 fn.condwrite(ui.verbose, b"name", namefmt, n)
7594 if ui.verbose: 7780 if ui.verbose:
7595 fn.plain("%s " % places[p]) 7781 fn.plain(b"%s " % places[p])
7596 fn.data(bundled=p) 7782 fn.data(bundled=p)
7597 fn.condwrite(ui.verbose and v, "ver", "%s", v) 7783 fn.condwrite(ui.verbose and v, b"ver", b"%s", v)
7598 if ui.verbose: 7784 if ui.verbose:
7599 fn.plain("\n") 7785 fn.plain(b"\n")
7600 fn.end() 7786 fn.end()
7601 fm.end() 7787 fm.end()
7602 7788
7603 7789
7604 def loadcmdtable(ui, name, cmdtable): 7790 def loadcmdtable(ui, name, cmdtable):
7605 """Load command functions from specified cmdtable 7791 """Load command functions from specified cmdtable
7606 """ 7792 """
7607 overrides = [cmd for cmd in cmdtable if cmd in table] 7793 overrides = [cmd for cmd in cmdtable if cmd in table]
7608 if overrides: 7794 if overrides:
7609 ui.warn( 7795 ui.warn(
7610 _("extension '%s' overrides commands: %s\n") 7796 _(b"extension '%s' overrides commands: %s\n")
7611 % (name, " ".join(overrides)) 7797 % (name, b" ".join(overrides))
7612 ) 7798 )
7613 table.update(cmdtable) 7799 table.update(cmdtable)