completion: drop the hard coded list of config vars
The new help option --config-for-completion is a machine friendlier version of --config where all the placeholders and wildcards are dropped, leaving only the good, completable prefixes for git-completion.bash to consume. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
431bb23a27
commit
e17ca92637
@ -47,6 +47,7 @@ static struct option builtin_help_options[] = {
|
||||
OPT_HIDDEN_BOOL(0, "exclude-guides", &exclude_guides, N_("exclude guides")),
|
||||
OPT_BOOL('g', "guides", &show_guides, N_("print list of useful guides")),
|
||||
OPT_BOOL('c', "config", &show_config, N_("print all configuration variable names")),
|
||||
OPT_SET_INT_F(0, "config-for-completion", &show_config, "", 2, PARSE_OPT_HIDDEN),
|
||||
OPT_SET_INT('m', "man", &help_format, N_("show man page"), HELP_FORMAT_MAN),
|
||||
OPT_SET_INT('w', "web", &help_format, N_("show manual in web browser"),
|
||||
HELP_FORMAT_WEB),
|
||||
@ -447,8 +448,14 @@ int cmd_help(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
|
||||
if (show_config) {
|
||||
int for_human = show_config == 1;
|
||||
|
||||
if (!for_human) {
|
||||
list_config_help(for_human);
|
||||
return 0;
|
||||
}
|
||||
setup_pager();
|
||||
list_config_help();
|
||||
list_config_help(for_human);
|
||||
printf("\n%s\n", _("'git help config' for more information"));
|
||||
return 0;
|
||||
}
|
||||
|
@ -1986,6 +1986,13 @@ __git_config_get_set_variables ()
|
||||
__git config $config_file --name-only --list
|
||||
}
|
||||
|
||||
__git_config_vars=
|
||||
__git_compute_config_vars ()
|
||||
{
|
||||
test -n "$__git_config_vars" ||
|
||||
__git_config_vars="$(git help --config-for-completion | sort | uniq)"
|
||||
}
|
||||
|
||||
_git_config ()
|
||||
{
|
||||
case "$prev" in
|
||||
@ -2144,332 +2151,8 @@ _git_config ()
|
||||
return
|
||||
;;
|
||||
esac
|
||||
__gitcomp "
|
||||
add.ignoreErrors
|
||||
advice.amWorkDir
|
||||
advice.commitBeforeMerge
|
||||
advice.detachedHead
|
||||
advice.implicitIdentity
|
||||
advice.pushAlreadyExists
|
||||
advice.pushFetchFirst
|
||||
advice.pushNeedsForce
|
||||
advice.pushNonFFCurrent
|
||||
advice.pushNonFFMatching
|
||||
advice.pushUpdateRejected
|
||||
advice.resolveConflict
|
||||
advice.rmHints
|
||||
advice.statusHints
|
||||
advice.statusUoption
|
||||
advice.ignoredHook
|
||||
alias.
|
||||
am.keepcr
|
||||
am.threeWay
|
||||
apply.ignorewhitespace
|
||||
apply.whitespace
|
||||
branch.autosetupmerge
|
||||
branch.autosetuprebase
|
||||
browser.
|
||||
clean.requireForce
|
||||
color.branch
|
||||
color.branch.current
|
||||
color.branch.local
|
||||
color.branch.plain
|
||||
color.branch.remote
|
||||
color.decorate.HEAD
|
||||
color.decorate.branch
|
||||
color.decorate.remoteBranch
|
||||
color.decorate.stash
|
||||
color.decorate.tag
|
||||
color.diff
|
||||
color.diff.commit
|
||||
color.diff.frag
|
||||
color.diff.func
|
||||
color.diff.meta
|
||||
color.diff.new
|
||||
color.diff.old
|
||||
color.diff.plain
|
||||
color.diff.whitespace
|
||||
color.grep
|
||||
color.grep.context
|
||||
color.grep.filename
|
||||
color.grep.function
|
||||
color.grep.linenumber
|
||||
color.grep.match
|
||||
color.grep.selected
|
||||
color.grep.separator
|
||||
color.interactive
|
||||
color.interactive.error
|
||||
color.interactive.header
|
||||
color.interactive.help
|
||||
color.interactive.prompt
|
||||
color.pager
|
||||
color.showbranch
|
||||
color.status
|
||||
color.status.added
|
||||
color.status.changed
|
||||
color.status.header
|
||||
color.status.localBranch
|
||||
color.status.nobranch
|
||||
color.status.remoteBranch
|
||||
color.status.unmerged
|
||||
color.status.untracked
|
||||
color.status.updated
|
||||
color.ui
|
||||
commit.cleanup
|
||||
commit.gpgSign
|
||||
commit.status
|
||||
commit.template
|
||||
commit.verbose
|
||||
core.abbrev
|
||||
core.askpass
|
||||
core.attributesfile
|
||||
core.autocrlf
|
||||
core.bare
|
||||
core.bigFileThreshold
|
||||
core.checkStat
|
||||
core.commentChar
|
||||
core.commitGraph
|
||||
core.compression
|
||||
core.createObject
|
||||
core.deltaBaseCacheLimit
|
||||
core.editor
|
||||
core.eol
|
||||
core.excludesfile
|
||||
core.fileMode
|
||||
core.fsyncobjectfiles
|
||||
core.gitProxy
|
||||
core.hideDotFiles
|
||||
core.hooksPath
|
||||
core.ignoreStat
|
||||
core.ignorecase
|
||||
core.logAllRefUpdates
|
||||
core.loosecompression
|
||||
core.notesRef
|
||||
core.packedGitLimit
|
||||
core.packedGitWindowSize
|
||||
core.packedRefsTimeout
|
||||
core.pager
|
||||
core.precomposeUnicode
|
||||
core.preferSymlinkRefs
|
||||
core.preloadindex
|
||||
core.protectHFS
|
||||
core.protectNTFS
|
||||
core.quotepath
|
||||
core.repositoryFormatVersion
|
||||
core.safecrlf
|
||||
core.sharedRepository
|
||||
core.sparseCheckout
|
||||
core.splitIndex
|
||||
core.sshCommand
|
||||
core.symlinks
|
||||
core.trustctime
|
||||
core.untrackedCache
|
||||
core.warnAmbiguousRefs
|
||||
core.whitespace
|
||||
core.worktree
|
||||
credential.helper
|
||||
credential.useHttpPath
|
||||
credential.username
|
||||
credentialCache.ignoreSIGHUP
|
||||
diff.autorefreshindex
|
||||
diff.external
|
||||
diff.ignoreSubmodules
|
||||
diff.mnemonicprefix
|
||||
diff.noprefix
|
||||
diff.renameLimit
|
||||
diff.renames
|
||||
diff.statGraphWidth
|
||||
diff.submodule
|
||||
diff.suppressBlankEmpty
|
||||
diff.tool
|
||||
diff.wordRegex
|
||||
diff.algorithm
|
||||
difftool.
|
||||
difftool.prompt
|
||||
fetch.recurseSubmodules
|
||||
fetch.unpackLimit
|
||||
format.attach
|
||||
format.cc
|
||||
format.coverLetter
|
||||
format.from
|
||||
format.headers
|
||||
format.numbered
|
||||
format.pretty
|
||||
format.signature
|
||||
format.signoff
|
||||
format.subjectprefix
|
||||
format.suffix
|
||||
format.thread
|
||||
format.to
|
||||
gc.
|
||||
gc.aggressiveDepth
|
||||
gc.aggressiveWindow
|
||||
gc.auto
|
||||
gc.autoDetach
|
||||
gc.autopacklimit
|
||||
gc.logExpiry
|
||||
gc.packrefs
|
||||
gc.pruneexpire
|
||||
gc.reflogexpire
|
||||
gc.reflogexpireunreachable
|
||||
gc.rerereresolved
|
||||
gc.rerereunresolved
|
||||
gc.worktreePruneExpire
|
||||
gitcvs.allbinary
|
||||
gitcvs.commitmsgannotation
|
||||
gitcvs.dbTableNamePrefix
|
||||
gitcvs.dbdriver
|
||||
gitcvs.dbname
|
||||
gitcvs.dbpass
|
||||
gitcvs.dbuser
|
||||
gitcvs.enabled
|
||||
gitcvs.logfile
|
||||
gitcvs.usecrlfattr
|
||||
guitool.
|
||||
gui.blamehistoryctx
|
||||
gui.commitmsgwidth
|
||||
gui.copyblamethreshold
|
||||
gui.diffcontext
|
||||
gui.encoding
|
||||
gui.fastcopyblame
|
||||
gui.matchtrackingbranch
|
||||
gui.newbranchtemplate
|
||||
gui.pruneduringfetch
|
||||
gui.spellingdictionary
|
||||
gui.trustmtime
|
||||
help.autocorrect
|
||||
help.browser
|
||||
help.format
|
||||
http.lowSpeedLimit
|
||||
http.lowSpeedTime
|
||||
http.maxRequests
|
||||
http.minSessions
|
||||
http.noEPSV
|
||||
http.postBuffer
|
||||
http.proxy
|
||||
http.sslCipherList
|
||||
http.sslVersion
|
||||
http.sslCAInfo
|
||||
http.sslCAPath
|
||||
http.sslCert
|
||||
http.sslCertPasswordProtected
|
||||
http.sslKey
|
||||
http.sslVerify
|
||||
http.useragent
|
||||
i18n.commitEncoding
|
||||
i18n.logOutputEncoding
|
||||
imap.authMethod
|
||||
imap.folder
|
||||
imap.host
|
||||
imap.pass
|
||||
imap.port
|
||||
imap.preformattedHTML
|
||||
imap.sslverify
|
||||
imap.tunnel
|
||||
imap.user
|
||||
init.templatedir
|
||||
instaweb.browser
|
||||
instaweb.httpd
|
||||
instaweb.local
|
||||
instaweb.modulepath
|
||||
instaweb.port
|
||||
interactive.singlekey
|
||||
log.date
|
||||
log.decorate
|
||||
log.showroot
|
||||
mailmap.file
|
||||
man.
|
||||
man.viewer
|
||||
merge.
|
||||
merge.conflictstyle
|
||||
merge.log
|
||||
merge.renameLimit
|
||||
merge.renormalize
|
||||
merge.stat
|
||||
merge.tool
|
||||
merge.verbosity
|
||||
mergetool.
|
||||
mergetool.keepBackup
|
||||
mergetool.keepTemporaries
|
||||
mergetool.prompt
|
||||
notes.displayRef
|
||||
notes.rewrite.
|
||||
notes.rewrite.amend
|
||||
notes.rewrite.rebase
|
||||
notes.rewriteMode
|
||||
notes.rewriteRef
|
||||
pack.compression
|
||||
pack.deltaCacheLimit
|
||||
pack.deltaCacheSize
|
||||
pack.depth
|
||||
pack.indexVersion
|
||||
pack.packSizeLimit
|
||||
pack.threads
|
||||
pack.window
|
||||
pack.windowMemory
|
||||
pager.
|
||||
pretty.
|
||||
pull.octopus
|
||||
pull.twohead
|
||||
push.default
|
||||
push.followTags
|
||||
rebase.autosquash
|
||||
rebase.stat
|
||||
receive.autogc
|
||||
receive.denyCurrentBranch
|
||||
receive.denyDeleteCurrent
|
||||
receive.denyDeletes
|
||||
receive.denyNonFastForwards
|
||||
receive.fsckObjects
|
||||
receive.unpackLimit
|
||||
receive.updateserverinfo
|
||||
remote.pushdefault
|
||||
remotes.
|
||||
repack.usedeltabaseoffset
|
||||
rerere.autoupdate
|
||||
rerere.enabled
|
||||
sendemail.
|
||||
sendemail.aliasesfile
|
||||
sendemail.aliasfiletype
|
||||
sendemail.bcc
|
||||
sendemail.cc
|
||||
sendemail.cccmd
|
||||
sendemail.chainreplyto
|
||||
sendemail.confirm
|
||||
sendemail.envelopesender
|
||||
sendemail.from
|
||||
sendemail.identity
|
||||
sendemail.multiedit
|
||||
sendemail.signedoffbycc
|
||||
sendemail.smtpdomain
|
||||
sendemail.smtpencryption
|
||||
sendemail.smtppass
|
||||
sendemail.smtpserver
|
||||
sendemail.smtpserveroption
|
||||
sendemail.smtpserverport
|
||||
sendemail.smtpuser
|
||||
sendemail.suppresscc
|
||||
sendemail.suppressfrom
|
||||
sendemail.thread
|
||||
sendemail.to
|
||||
sendemail.tocmd
|
||||
sendemail.validate
|
||||
sendemail.smtpbatchsize
|
||||
sendemail.smtprelogindelay
|
||||
showbranch.default
|
||||
status.relativePaths
|
||||
status.showUntrackedFiles
|
||||
status.submodulesummary
|
||||
submodule.
|
||||
tar.umask
|
||||
transfer.unpackLimit
|
||||
url.
|
||||
user.email
|
||||
user.name
|
||||
user.signingkey
|
||||
web.browser
|
||||
branch. remote.
|
||||
"
|
||||
__git_compute_config_vars
|
||||
__gitcomp "$__git_config_vars"
|
||||
}
|
||||
|
||||
_git_remote ()
|
||||
|
34
help.c
34
help.c
@ -416,7 +416,7 @@ struct slot_expansion {
|
||||
int found;
|
||||
};
|
||||
|
||||
void list_config_help(void)
|
||||
void list_config_help(int for_human)
|
||||
{
|
||||
struct slot_expansion slot_expansions[] = {
|
||||
{ "advice", "*", list_config_advices },
|
||||
@ -460,8 +460,36 @@ void list_config_help(void)
|
||||
e->prefix, e->placeholder);
|
||||
|
||||
string_list_sort(&keys);
|
||||
for (i = 0; i < keys.nr; i++)
|
||||
puts(keys.items[i].string);
|
||||
for (i = 0; i < keys.nr; i++) {
|
||||
const char *var = keys.items[i].string;
|
||||
const char *wildcard, *tag, *cut;
|
||||
|
||||
if (for_human) {
|
||||
puts(var);
|
||||
continue;
|
||||
}
|
||||
|
||||
wildcard = strchr(var, '*');
|
||||
tag = strchr(var, '<');
|
||||
|
||||
if (!wildcard && !tag) {
|
||||
puts(var);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (wildcard && !tag)
|
||||
cut = wildcard;
|
||||
else if (!wildcard && tag)
|
||||
cut = tag;
|
||||
else
|
||||
cut = wildcard < tag ? wildcard : tag;
|
||||
|
||||
/*
|
||||
* We may produce duplicates, but that's up to
|
||||
* git-completion.bash to handle
|
||||
*/
|
||||
printf("%.*s\n", (int)(cut - var), var);
|
||||
}
|
||||
string_list_clear(&keys, 0);
|
||||
}
|
||||
|
||||
|
2
help.h
2
help.h
@ -22,7 +22,7 @@ static inline void mput_char(char c, unsigned int num)
|
||||
extern void list_common_cmds_help(void);
|
||||
extern void list_all_cmds_help(void);
|
||||
extern void list_common_guides_help(void);
|
||||
extern void list_config_help(void);
|
||||
extern void list_config_help(int for_human);
|
||||
|
||||
extern void list_all_main_cmds(struct string_list *list);
|
||||
extern void list_all_other_cmds(struct string_list *list);
|
||||
|
Loading…
Reference in New Issue
Block a user