# HG changeset patch # User Rodrigo Damazio # Date 1539362951 -7200 # Node ID fa88170c10bbc9000b32318a3b5e44385e516cde # Parent fabbf93100252be088d562d8547159a497644bbf help: adding a proper declaration for shortlist/basic commands (API) We previously used the '^' prefix to indicate that a command should be shown on the short list (shown for just "hg"), but that's a horrible hack, so I'm removing it. Differential Revision: https://phab.mercurial-scm.org/D5069 diff -r fabbf9310025 -r fa88170c10bb contrib/perf.py --- a/contrib/perf.py Fri Oct 12 18:06:32 2018 +0200 +++ b/contrib/perf.py Fri Oct 12 18:49:11 2018 +0200 @@ -152,7 +152,7 @@ # define parsealiases locally, because cmdutil.parsealiases has been # available since 1.5 (or 6252852b4332) def parsealiases(cmd): - return cmd.lstrip(b"^").split(b"|") + return cmd.split(b"|") if safehasattr(registrar, 'command'): command = registrar.command(cmdtable) diff -r fabbf9310025 -r fa88170c10bb hgext/absorb.py --- a/hgext/absorb.py Fri Oct 12 18:06:32 2018 +0200 +++ b/hgext/absorb.py Fri Oct 12 18:49:11 2018 +0200 @@ -982,7 +982,7 @@ ui.write(_('nothing applied\n')) return state -@command('^absorb', +@command('absorb', [('a', 'apply-changes', None, _('apply changes without prompting for confirmation')), ('p', 'print-changes', None, @@ -994,7 +994,8 @@ '(EXPERIMENTAL)')), ] + commands.dryrunopts + commands.templateopts + commands.walkopts, _('hg absorb [OPTION] [FILE]...'), - helpcategory=command.CATEGORY_COMMITTING) + helpcategory=command.CATEGORY_COMMITTING, + helpbasic=True) def absorbcmd(ui, repo, *pats, **opts): """incorporate corrections into the stack of draft changesets diff -r fabbf9310025 -r fa88170c10bb hgext/blackbox.py --- a/hgext/blackbox.py Fri Oct 12 18:06:32 2018 +0200 +++ b/hgext/blackbox.py Fri Oct 12 18:49:11 2018 +0200 @@ -226,11 +226,12 @@ repo._wlockfreeprefix.add('blackbox.log') -@command('^blackbox', +@command('blackbox', [('l', 'limit', 10, _('the number of events to show')), ], _('hg blackbox [OPTION]...'), - helpcategory=command.CATEGORY_MAINTENANCE) + helpcategory=command.CATEGORY_MAINTENANCE, + helpbasic=True) def blackbox(ui, repo, *revs, **opts): '''view the recent repository events ''' diff -r fabbf9310025 -r fa88170c10bb hgext/fastannotate/commands.py --- a/hgext/fastannotate/commands.py Fri Oct 12 18:06:32 2018 +0200 +++ b/hgext/fastannotate/commands.py Fri Oct 12 18:49:11 2018 +0200 @@ -222,8 +222,8 @@ def registercommand(): """register the fastannotate command""" - name = '^fastannotate|fastblame|fa' - command(name, **fastannotatecommandargs)(fastannotate) + name = 'fastannotate|fastblame|fa' + command(name, helpbasic=True, **fastannotatecommandargs)(fastannotate) def wrapdefault(): """wrap the default annotate command, to be aware of the protocol""" diff -r fabbf9310025 -r fa88170c10bb hgext/githelp.py --- a/hgext/githelp.py Fri Oct 12 18:06:32 2018 +0200 +++ b/hgext/githelp.py Fri Oct 12 18:49:11 2018 +0200 @@ -50,9 +50,9 @@ s = re.sub('~$', '~1', s) return s -@command('^githelp|git', [ +@command('githelp|git', [ ], _('hg githelp'), - helpcategory=command.CATEGORY_HELP) + helpcategory=command.CATEGORY_HELP, helpbasic=True) def githelp(ui, repo, *args, **kwargs): '''suggests the Mercurial equivalent of the given git command diff -r fabbf9310025 -r fa88170c10bb hgext/mq.py --- a/hgext/mq.py Fri Oct 12 18:06:32 2018 +0200 +++ b/hgext/mq.py Fri Oct 12 18:49:11 2018 +0200 @@ -2433,10 +2433,11 @@ commands.add(ui, r) return 0 -@command("^qinit", +@command("qinit", [('c', 'create-repo', None, _('create queue repository'))], _('hg qinit [-c]'), - helpcategory=command.CATEGORY_REPO_CREATION) + helpcategory=command.CATEGORY_REPO_CREATION, + helpbasic=True) def init(ui, repo, **opts): """init a new queue repository (DEPRECATED) @@ -2540,7 +2541,7 @@ hg.update(repo, repo.changelog.tip()) @command("qcommit|qci", - commands.table["^commit|ci"][1], + commands.table["commit|ci"][1], _('hg qcommit [OPTION]... [FILE]...'), helpcategory=command.CATEGORY_COMMITTING, inferrepo=True) @@ -2623,7 +2624,7 @@ if not opts.get('date') and opts.get('currentdate'): opts['date'] = "%d %d" % dateutil.makedate() -@command("^qnew", +@command("qnew", [('e', 'edit', None, _('invoke editor on commit messages')), ('f', 'force', None, _('import uncommitted changes (DEPRECATED)')), ('g', 'git', None, _('use git extended diff format')), @@ -2635,7 +2636,7 @@ _('add "Date: " to patch'), _('DATE')) ] + cmdutil.walkopts + cmdutil.commitopts, _('hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]...'), - helpcategory=command.CATEGORY_COMMITTING, + helpcategory=command.CATEGORY_COMMITTING, helpbasic=True, inferrepo=True) def new(ui, repo, patch, *args, **opts): """create a new patch @@ -2671,7 +2672,7 @@ q.savedirty() return 0 -@command("^qrefresh", +@command("qrefresh", [('e', 'edit', None, _('invoke editor on commit messages')), ('g', 'git', None, _('use git extended diff format')), ('s', 'short', None, @@ -2686,7 +2687,7 @@ _('add/update date field in patch with given date'), _('DATE')) ] + cmdutil.walkopts + cmdutil.commitopts, _('hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]...'), - helpcategory=command.CATEGORY_COMMITTING, + helpcategory=command.CATEGORY_COMMITTING, helpbasic=True, inferrepo=True) def refresh(ui, repo, *pats, **opts): """update the current patch @@ -2718,10 +2719,10 @@ q.savedirty() return ret -@command("^qdiff", +@command("qdiff", cmdutil.diffopts + cmdutil.diffopts2 + cmdutil.walkopts, _('hg qdiff [OPTION]... [FILE]...'), - helpcategory=command.CATEGORY_FILE_CONTENTS, + helpcategory=command.CATEGORY_FILE_CONTENTS, helpbasic=True, inferrepo=True) def diff(ui, repo, *pats, **opts): """diff of the current patch and subsequent modifications @@ -2956,7 +2957,7 @@ newpath = path + ".%d" % (index + 1) return newpath -@command("^qpush", +@command("qpush", [('', 'keep-changes', None, _('tolerate non-conflicting local changes')), ('f', 'force', None, _('apply on top of local changes')), @@ -2971,7 +2972,8 @@ _('reorder patch series and apply only the patch')), ('', 'no-backup', None, _('do not save backup copies of files'))], _('hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]'), - helpcategory=command.CATEGORY_CHANGE_ORGANIZATION) + helpcategory=command.CATEGORY_CHANGE_ORGANIZATION, + helpbasic=True) def push(ui, repo, patch=None, **opts): """push the next patch onto the stack @@ -3003,7 +3005,7 @@ keepchanges=opts.get('keep_changes')) return ret -@command("^qpop", +@command("qpop", [('a', 'all', None, _('pop all patches')), ('n', 'name', '', _('queue name to pop (DEPRECATED)'), _('NAME')), @@ -3012,7 +3014,8 @@ ('f', 'force', None, _('forget any local changes to patched files')), ('', 'no-backup', None, _('do not save backup copies of files'))], _('hg qpop [-a] [-f] [PATCH | INDEX]'), - helpcategory=command.CATEGORY_CHANGE_ORGANIZATION) + helpcategory=command.CATEGORY_CHANGE_ORGANIZATION, + helpbasic=True) def pop(ui, repo, patch=None, **opts): """pop the current patch off the stack diff -r fabbf9310025 -r fa88170c10bb hgext/record.py --- a/hgext/record.py Fri Oct 12 18:06:32 2018 +0200 +++ b/hgext/record.py Fri Oct 12 18:49:11 2018 +0200 @@ -32,7 +32,7 @@ @command("record", # same options as commit + white space diff options - [c for c in commands.table['^commit|ci'][1][:] + [c for c in commands.table['commit|ci'][1][:] if c[1] != "interactive"] + cmdutil.diffwsopts, _('hg record [OPTION]... [FILE]...'), helpcategory=command.CATEGORY_COMMITTING) @@ -138,7 +138,7 @@ (qrecord, # same options as qnew, but copy them so we don't get # -i/--interactive for qrecord and add white space diff options - mq.cmdtable['^qnew'][1][:] + cmdutil.diffwsopts, + mq.cmdtable['qnew'][1][:] + cmdutil.diffwsopts, _('hg qrecord [OPTION]... PATCH [FILE]...')) _wrapcmd('qnew', mq.cmdtable, qnew, _("interactively record a new patch")) diff -r fabbf9310025 -r fa88170c10bb hgext/sparse.py --- a/hgext/sparse.py Fri Oct 12 18:06:32 2018 +0200 +++ b/hgext/sparse.py Fri Oct 12 18:49:11 2018 +0200 @@ -122,7 +122,7 @@ propname)) def _setuplog(ui): - entry = commands.table['^log|history'] + entry = commands.table['log|history'] entry[1].append(('', 'sparse', None, "limit to changesets affecting the sparse checkout")) @@ -163,7 +163,7 @@ return orig(ui, repo, *args, **opts) def _setupclone(ui): - entry = commands.table['^clone'] + entry = commands.table['clone'] entry[1].append(('', 'enable-profile', [], 'enable a sparse profile')) entry[1].append(('', 'include', [], @@ -173,7 +173,7 @@ extensions.wrapcommand(commands.table, 'clone', _clonesparsecmd) def _setupadd(ui): - entry = commands.table['^add'] + entry = commands.table['add'] entry[1].append(('s', 'sparse', None, 'also include directories of added files in sparse config')) @@ -237,7 +237,7 @@ return orig(self, *args) extensions.wrapfunction(dirstate.dirstate, func, _wrapper) -@command('^debugsparse', [ +@command('debugsparse', [ ('I', 'include', False, _('include files in the sparse checkout')), ('X', 'exclude', False, _('exclude files in the sparse checkout')), ('d', 'delete', False, _('delete an include/exclude rule')), @@ -249,7 +249,8 @@ ('', 'refresh', False, _('updates the working after sparseness changes')), ('', 'reset', False, _('makes the repo full again')), ] + commands.templateopts, - _('[--OPTION] PATTERN...')) + _('[--OPTION] PATTERN...'), + helpbasic=True) def debugsparse(ui, repo, *pats, **opts): """make the current checkout sparse, or edit the existing checkout diff -r fabbf9310025 -r fa88170c10bb hgext/split.py --- a/hgext/split.py Fri Oct 12 18:06:32 2018 +0200 +++ b/hgext/split.py Fri Oct 12 18:49:11 2018 +0200 @@ -44,12 +44,12 @@ # leave the attribute unspecified. testedwith = 'ships-with-hg-core' -@command('^split', +@command('split', [('r', 'rev', '', _("revision to split"), _('REV')), ('', 'rebase', True, _('rebase descendants after split')), ] + cmdutil.commitopts2, _('hg split [--no-rebase] [[-r] REV]'), - helpcategory=command.CATEGORY_CHANGE_MANAGEMENT) + helpcategory=command.CATEGORY_CHANGE_MANAGEMENT, helpbasic=True) def split(ui, repo, *revs, **opts): """split a changeset into smaller ones diff -r fabbf9310025 -r fa88170c10bb hgext/uncommit.py --- a/hgext/uncommit.py Fri Oct 12 18:06:32 2018 +0200 +++ b/hgext/uncommit.py Fri Oct 12 18:49:11 2018 +0200 @@ -191,7 +191,8 @@ for data in ctx.repo().obsstore.predecessors.get(ctx.node(), ()): yield obsutil.marker(ctx.repo(), data) -@command('^unamend', [], helpcategory=command.CATEGORY_CHANGE_MANAGEMENT) +@command('unamend', [], helpcategory=command.CATEGORY_CHANGE_MANAGEMENT, + helpbasic=True) def unamend(ui, repo, **opts): """undo the most recent amend operation on a current changeset diff -r fabbf9310025 -r fa88170c10bb mercurial/cmdutil.py --- a/mercurial/cmdutil.py Fri Oct 12 18:06:32 2018 +0200 +++ b/mercurial/cmdutil.py Fri Oct 12 18:49:11 2018 +0200 @@ -185,7 +185,7 @@ return newlyaddedandmodifiedfiles def parsealiases(cmd): - return cmd.lstrip("^").split("|") + return cmd.split("|") def setupwrapcolorwrite(ui): # wrap ui.write so diff output can be labeled/colorized @@ -673,7 +673,7 @@ debugchoice = {} if cmd in table: - # short-circuit exact matches, "log" alias beats "^log|history" + # short-circuit exact matches, "log" alias beats "log|history" keys = [cmd] else: keys = table.keys() diff -r fabbf9310025 -r fa88170c10bb mercurial/commands.py --- a/mercurial/commands.py Fri Oct 12 18:06:32 2018 +0200 +++ b/mercurial/commands.py Fri Oct 12 18:49:11 2018 +0200 @@ -131,11 +131,11 @@ # Commands start here, listed alphabetically -@command('^add', +@command('add', walkopts + subrepoopts + dryrunopts, _('[OPTION]... [FILE]...'), helpcategory=command.CATEGORY_WORKING_DIRECTORY, - inferrepo=True) + helpbasic=True, inferrepo=True) def add(ui, repo, *pats, **opts): """add the specified files on the next commit @@ -256,7 +256,7 @@ matcher = scmutil.match(repo[None], pats, opts) return scmutil.addremove(repo, matcher, "", opts) -@command('^annotate|blame', +@command('annotate|blame', [('r', 'rev', '', _('annotate the specified revision'), _('REV')), ('', 'follow', None, _('follow copies/renames and list the filename (DEPRECATED)')), @@ -272,7 +272,7 @@ ] + diffwsopts + walkopts + formatteropts, _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'), helpcategory=command.CATEGORY_FILE_CONTENTS, - inferrepo=True) + helpbasic=True, inferrepo=True) def annotate(ui, repo, *pats, **opts): """show changeset information by line for each file @@ -1399,7 +1399,7 @@ return cmdutil.cat(ui, repo, ctx, m, fm, fntemplate, '', **pycompat.strkwargs(opts)) -@command('^clone', +@command('clone', [('U', 'noupdate', None, _('the clone will include an empty working ' 'directory (only a repository)')), ('u', 'updaterev', '', _('revision, tag, or branch to check out'), @@ -1416,7 +1416,7 @@ ] + remoteopts, _('[OPTION]... SOURCE [DEST]'), helpcategory=command.CATEGORY_REPO_CREATION, - norepo=True) + helpbasic=True, norepo=True) def clone(ui, source, dest=None, **opts): """make a copy of an existing repository @@ -1555,7 +1555,7 @@ return r is None -@command('^commit|ci', +@command('commit|ci', [('A', 'addremove', None, _('mark new/missing files as added/removed before committing')), ('', 'close-branch', None, @@ -1566,7 +1566,7 @@ ('i', 'interactive', None, _('use interactive mode')), ] + walkopts + commitopts + commitopts2 + subrepoopts, _('[OPTION]... [FILE]...'), - helpcategory=command.CATEGORY_COMMITTING, + helpcategory=command.CATEGORY_COMMITTING, helpbasic=True, inferrepo=True) def commit(ui, repo, *pats, **opts): """commit the specified files or all outstanding changes @@ -1867,7 +1867,7 @@ def debugcommands(ui, cmd='', *args): """list all available commands and options""" for cmd, vals in sorted(table.iteritems()): - cmd = cmd.split('|')[0].strip('^') + cmd = cmd.split('|')[0] opts = ', '.join([i[1] for i in vals[1]]) ui.write('%s: %s\n' % (cmd, opts)) @@ -1900,14 +1900,13 @@ cmdlist = [' '.join(c[0]) for c in cmdlist.values()] ui.write("%s\n" % "\n".join(sorted(cmdlist))) -@command('^diff', +@command('diff', [('r', 'rev', [], _('revision'), _('REV')), ('c', 'change', '', _('change made by revision'), _('REV')) ] + diffopts + diffopts2 + walkopts + subrepoopts, _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'), helpcategory=command.CATEGORY_FILE_CONTENTS, - inferrepo=True, - intents={INTENT_READONLY}) + helpbasic=True, inferrepo=True, intents={INTENT_READONLY}) def diff(ui, repo, *pats, **opts): """diff repository (or selected files) @@ -1995,7 +1994,7 @@ listsubrepos=opts.get('subrepos'), root=opts.get('root')) -@command('^export', +@command('export', [('B', 'bookmark', '', _('export changes only reachable by given bookmark')), ('o', 'output', '', @@ -2005,7 +2004,7 @@ ] + diffopts + formatteropts, _('[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'), helpcategory=command.CATEGORY_IMPORT_EXPORT, - intents={INTENT_READONLY}) + helpbasic=True, intents={INTENT_READONLY}) def export(ui, repo, *changesets, **opts): """dump the header and diffs for one or more changesets @@ -2198,12 +2197,12 @@ return cmdutil.files(ui, ctx, m, fm, fmt, opts.get('subrepos')) @command( - '^forget', + 'forget', [('i', 'interactive', None, _('use interactive mode')), ] + walkopts + dryrunopts, _('[OPTION]... FILE...'), helpcategory=command.CATEGORY_WORKING_DIRECTORY, - inferrepo=True) + helpbasic=True, inferrepo=True) def forget(ui, repo, *pats, **opts): """forget the specified files on the next commit @@ -3549,9 +3548,9 @@ del repo._subtoppath -@command('^init', remoteopts, _('[-e CMD] [--remotecmd CMD] [DEST]'), - helpcategory=command.CATEGORY_REPO_CREATION, - norepo=True) +@command('init', remoteopts, _('[-e CMD] [--remotecmd CMD] [DEST]'), + helpcategory=command.CATEGORY_REPO_CREATION, + helpbasic=True, norepo=True) def init(ui, dest=".", **opts): """create a new repository in the given directory @@ -3624,7 +3623,7 @@ return ret -@command('^log|history', +@command('log|history', [('f', 'follow', None, _('follow changeset history, or file history across copies and renames')), ('', 'follow-first', None, @@ -3650,7 +3649,7 @@ ] + logopts + walkopts, _('[OPTION]... [FILE]'), helpcategory=command.CATEGORY_CHANGE_NAVIGATION, - inferrepo=True, + helpbasic=True, inferrepo=True, intents={INTENT_READONLY}) def log(ui, repo, *pats, **opts): """show revision history of entire repository or files @@ -3878,7 +3877,7 @@ fm.write('path', '%s\n', f) fm.end() -@command('^merge', +@command('merge', [('f', 'force', None, _('force a merge including outstanding changes (DEPRECATED)')), ('r', 'rev', '', _('revision to merge'), _('REV')), @@ -3887,7 +3886,7 @@ ('', 'abort', None, _('abort the ongoing merge')), ] + mergetoolopts, _('[-P] [[-r] REV]'), - helpcategory=command.CATEGORY_CHANGE_MANAGEMENT) + helpcategory=command.CATEGORY_CHANGE_MANAGEMENT, helpbasic=True) def merge(ui, repo, node=None, **opts): """merge another revision into working directory @@ -4305,7 +4304,7 @@ elif not ui.configbool('commands', 'update.requiredest'): ui.status(_("(run 'hg update' to get a working copy)\n")) -@command('^pull', +@command('pull', [('u', 'update', None, _('update to new branch head if new descendants were pulled')), ('f', 'force', None, _('run even when remote repository is unrelated')), @@ -4315,7 +4314,8 @@ _('BRANCH')), ] + remoteopts, _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'), - helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT) + helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, + helpbasic=True) def pull(ui, repo, source="default", **opts): """pull changes from the specified source @@ -4435,7 +4435,7 @@ other.close() return ret -@command('^push', +@command('push', [('f', 'force', None, _('force push')), ('r', 'rev', [], _('a changeset intended to be included in the destination'), @@ -4447,7 +4447,8 @@ ('', 'pushvars', [], _('variables that can be sent to server (ADVANCED)')), ] + remoteopts, _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'), - helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT) + helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, + helpbasic=True) def push(ui, repo, dest=None, **opts): """push changes to the specified destination @@ -4589,14 +4590,14 @@ return hg.verify(repo) return 1 -@command('^remove|rm', +@command('remove|rm', [('A', 'after', None, _('record delete for missing files')), ('f', 'force', None, _('forget added files, delete modified files')), ] + subrepoopts + walkopts + dryrunopts, _('[OPTION]... FILE...'), helpcategory=command.CATEGORY_WORKING_DIRECTORY, - inferrepo=True) + helpbasic=True, inferrepo=True) def remove(ui, repo, *pats, **opts): """remove the specified files on the next commit @@ -5132,7 +5133,7 @@ """ ui.write(repo.root + "\n") -@command('^serve', +@command('serve', [('A', 'accesslog', '', _('name of access log file to write to'), _('FILE')), ('d', 'daemon', None, _('run server in background')), @@ -5161,7 +5162,7 @@ + subrepoopts, _('[OPTION]...'), helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT, - optionalrepo=True) + helpbasic=True, optionalrepo=True) def serve(ui, repo, **opts): """start stand-alone webserver @@ -5205,7 +5206,7 @@ _NOTTERSE = 'nothing' -@command('^status|st', +@command('status|st', [('A', 'all', None, _('show status of all files')), ('m', 'modified', None, _('show only modified files')), ('a', 'added', None, _('show only added files')), @@ -5223,7 +5224,7 @@ ] + walkopts + subrepoopts + formatteropts, _('[OPTION]... [FILE]...'), helpcategory=command.CATEGORY_WORKING_DIRECTORY, - inferrepo=True, + helpbasic=True, inferrepo=True, intents={INTENT_READONLY}) def status(ui, repo, *pats, **opts): """show changed files in the working directory @@ -5409,10 +5410,11 @@ cmdutil.morestatus(repo, fm) fm.end() -@command('^summary|sum', +@command('summary|sum', [('', 'remote', None, _('check for push and pull'))], '[--remote]', helpcategory=command.CATEGORY_WORKING_DIRECTORY, + helpbasic=True, intents={INTENT_READONLY}) def summary(ui, repo, **opts): """summarize working directory state @@ -5927,7 +5929,7 @@ return postincoming(ui, repo, modheads, opts.get(r'update'), None, None) -@command('^update|up|checkout|co', +@command('update|up|checkout|co', [('C', 'clean', None, _('discard uncommitted changes (no backup)')), ('c', 'check', None, _('require clean working directory')), ('m', 'merge', None, _('merge uncommitted changes')), @@ -5935,7 +5937,8 @@ ('r', 'rev', '', _('revision'), _('REV')) ] + mergetoolopts, _('[-C|-c|-m] [-d DATE] [[-r] REV]'), - helpcategory=command.CATEGORY_WORKING_DIRECTORY) + helpcategory=command.CATEGORY_WORKING_DIRECTORY, + helpbasic=True) def update(ui, repo, node=None, **opts): """update working directory (or switch revisions) diff -r fabbf9310025 -r fa88170c10bb mercurial/help.py --- a/mercurial/help.py Fri Oct 12 18:06:32 2018 +0200 +++ b/mercurial/help.py Fri Oct 12 18:49:11 2018 +0200 @@ -516,16 +516,14 @@ f = fs[0] syns[f] = ', '.join(fs) func = e[0] - p = '' - if c.startswith("^"): - p = '^' - if select and not select(p + f): + if select and not select(f): continue if (not select and name != 'shortlist' and func.__module__ != commands.__name__): continue - if name == "shortlist" and not p: - continue + if name == "shortlist": + if not getattr(func, 'helpbasic', False): + continue doc = pycompat.getdoc(func) if filtercmd(ui, f, name, doc): continue diff -r fabbf9310025 -r fa88170c10bb mercurial/hgweb/webcommands.py --- a/mercurial/hgweb/webcommands.py Fri Oct 12 18:06:32 2018 +0200 +++ b/mercurial/hgweb/webcommands.py Fri Oct 12 18:49:11 2018 +0200 @@ -1418,8 +1418,8 @@ if 'DEPRECATED' in doc or c.startswith('debug'): continue cmd = primary(c) - if cmd.startswith('^'): - early.append((cmd[1:], doc)) + if getattr(e[0], 'helpbasic', False): + early.append((cmd, doc)) else: other.append((cmd, doc)) diff -r fabbf9310025 -r fa88170c10bb mercurial/registrar.py --- a/mercurial/registrar.py Fri Oct 12 18:06:32 2018 +0200 +++ b/mercurial/registrar.py Fri Oct 12 18:49:11 2018 +0200 @@ -185,12 +185,13 @@ def _doregister(self, func, name, options=(), synopsis=None, norepo=False, optionalrepo=False, inferrepo=False, - intents=None, helpcategory=None): + intents=None, helpcategory=None, helpbasic=False): func.norepo = norepo func.optionalrepo = optionalrepo func.inferrepo = inferrepo func.intents = intents or set() func.helpcategory = helpcategory + func.helpbasic = helpbasic if synopsis: self._table[name] = func, list(options), synopsis else: diff -r fabbf9310025 -r fa88170c10bb tests/test-completion.t --- a/tests/test-completion.t Fri Oct 12 18:06:32 2018 +0200 +++ b/tests/test-completion.t Fri Oct 12 18:49:11 2018 +0200 @@ -231,23 +231,8 @@ Show all commands + options $ hg debugcommands add: include, exclude, subrepos, dry-run + addremove: similarity, subrepos, include, exclude, dry-run annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, skip, ignore-all-space, ignore-space-change, ignore-blank-lines, ignore-space-at-eol, include, exclude, template - clone: noupdate, updaterev, rev, branch, pull, uncompressed, stream, ssh, remotecmd, insecure - commit: addremove, close-branch, amend, secret, edit, interactive, include, exclude, message, logfile, date, user, subrepos - diff: rev, change, text, git, binary, nodates, noprefix, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, ignore-space-at-eol, unified, stat, root, include, exclude, subrepos - export: bookmark, output, switch-parent, rev, text, git, binary, nodates, template - forget: interactive, include, exclude, dry-run - init: ssh, remotecmd, insecure - log: follow, follow-first, date, copies, keyword, rev, line-range, removed, only-merges, user, only-branch, branch, prune, patch, git, limit, no-merges, stat, graph, style, template, include, exclude - merge: force, rev, preview, abort, tool - pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure - push: force, rev, bookmark, branch, new-branch, pushvars, ssh, remotecmd, insecure - remove: after, force, subrepos, include, exclude, dry-run - serve: accesslog, daemon, daemon-postexec, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, cmdserver, templates, style, ipv6, certificate, print-url, subrepos - status: all, modified, added, removed, deleted, clean, unknown, ignored, no-status, terse, copies, print0, rev, change, include, exclude, subrepos, template - summary: remote - update: clean, check, merge, date, rev, tool - addremove: similarity, subrepos, include, exclude, dry-run archive: no-decode, prefix, rev, type, subrepos, include, exclude backout: merge, commit, no-commit, parent, rev, edit, tool, include, exclude, message, logfile, date, user bisect: reset, good, bad, skip, extend, command, noupdate @@ -256,6 +241,8 @@ branches: active, closed, template bundle: force, rev, branch, base, all, type, ssh, remotecmd, insecure cat: output, rev, decode, include, exclude, template + clone: noupdate, updaterev, rev, branch, pull, uncompressed, stream, ssh, remotecmd, insecure + commit: addremove, close-branch, amend, secret, edit, interactive, include, exclude, message, logfile, date, user, subrepos config: untrusted, edit, local, global, template copy: after, force, include, exclude, dry-run debugancestor: @@ -317,7 +304,10 @@ debugwhyunstable: debugwireargs: three, four, five, ssh, remotecmd, insecure debugwireproto: localssh, peer, noreadstderr, nologhandshake, ssh, remotecmd, insecure + diff: rev, change, text, git, binary, nodates, noprefix, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, ignore-space-at-eol, unified, stat, root, include, exclude, subrepos + export: bookmark, output, switch-parent, rev, text, git, binary, nodates, template files: rev, print0, include, exclude, template, subrepos + forget: interactive, include, exclude, dry-run graft: rev, continue, stop, abort, edit, log, no-commit, force, currentdate, currentuser, date, user, tool, dry-run grep: print0, all, diff, text, follow, ignore-case, files-with-matches, line-number, rev, all-files, user, date, template, include, exclude heads: rev, topo, active, closed, style, template @@ -325,22 +315,32 @@ identify: rev, num, id, branch, tags, bookmarks, ssh, remotecmd, insecure, template import: strip, base, edit, force, no-commit, bypass, partial, exact, prefix, import-branch, message, logfile, date, user, similarity incoming: force, newest-first, bundle, rev, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos + init: ssh, remotecmd, insecure locate: rev, print0, fullpath, include, exclude + log: follow, follow-first, date, copies, keyword, rev, line-range, removed, only-merges, user, only-branch, branch, prune, patch, git, limit, no-merges, stat, graph, style, template, include, exclude manifest: rev, all, template + merge: force, rev, preview, abort, tool outgoing: force, rev, newest-first, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos parents: rev, style, template paths: template phase: public, draft, secret, force, rev + pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure + push: force, rev, bookmark, branch, new-branch, pushvars, ssh, remotecmd, insecure recover: + remove: after, force, subrepos, include, exclude, dry-run rename: after, force, include, exclude, dry-run resolve: all, list, mark, unmark, no-status, re-merge, tool, include, exclude, template revert: all, date, rev, no-backup, interactive, include, exclude, dry-run rollback: dry-run, force root: + serve: accesslog, daemon, daemon-postexec, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, cmdserver, templates, style, ipv6, certificate, print-url, subrepos + status: all, modified, added, removed, deleted, clean, unknown, ignored, no-status, terse, copies, print0, rev, change, include, exclude, subrepos, template + summary: remote tag: force, local, rev, remove, edit, message, date, user tags: template tip: patch, git, style, template unbundle: update + update: clean, check, merge, date, rev, tool verify: version: template