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_HIDDEN_BOOL(0, "exclude-guides", &exclude_guides, N_("exclude guides")),
|
||||||
OPT_BOOL('g', "guides", &show_guides, N_("print list of useful 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_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('m', "man", &help_format, N_("show man page"), HELP_FORMAT_MAN),
|
||||||
OPT_SET_INT('w', "web", &help_format, N_("show manual in web browser"),
|
OPT_SET_INT('w', "web", &help_format, N_("show manual in web browser"),
|
||||||
HELP_FORMAT_WEB),
|
HELP_FORMAT_WEB),
|
||||||
@ -447,8 +448,14 @@ int cmd_help(int argc, const char **argv, const char *prefix)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (show_config) {
|
if (show_config) {
|
||||||
|
int for_human = show_config == 1;
|
||||||
|
|
||||||
|
if (!for_human) {
|
||||||
|
list_config_help(for_human);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
setup_pager();
|
setup_pager();
|
||||||
list_config_help();
|
list_config_help(for_human);
|
||||||
printf("\n%s\n", _("'git help config' for more information"));
|
printf("\n%s\n", _("'git help config' for more information"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1986,6 +1986,13 @@ __git_config_get_set_variables ()
|
|||||||
__git config $config_file --name-only --list
|
__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 ()
|
_git_config ()
|
||||||
{
|
{
|
||||||
case "$prev" in
|
case "$prev" in
|
||||||
@ -2144,332 +2151,8 @@ _git_config ()
|
|||||||
return
|
return
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
__gitcomp "
|
__git_compute_config_vars
|
||||||
add.ignoreErrors
|
__gitcomp "$__git_config_vars"
|
||||||
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_remote ()
|
_git_remote ()
|
||||||
|
34
help.c
34
help.c
@ -416,7 +416,7 @@ struct slot_expansion {
|
|||||||
int found;
|
int found;
|
||||||
};
|
};
|
||||||
|
|
||||||
void list_config_help(void)
|
void list_config_help(int for_human)
|
||||||
{
|
{
|
||||||
struct slot_expansion slot_expansions[] = {
|
struct slot_expansion slot_expansions[] = {
|
||||||
{ "advice", "*", list_config_advices },
|
{ "advice", "*", list_config_advices },
|
||||||
@ -460,8 +460,36 @@ void list_config_help(void)
|
|||||||
e->prefix, e->placeholder);
|
e->prefix, e->placeholder);
|
||||||
|
|
||||||
string_list_sort(&keys);
|
string_list_sort(&keys);
|
||||||
for (i = 0; i < keys.nr; i++)
|
for (i = 0; i < keys.nr; i++) {
|
||||||
puts(keys.items[i].string);
|
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);
|
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_common_cmds_help(void);
|
||||||
extern void list_all_cmds_help(void);
|
extern void list_all_cmds_help(void);
|
||||||
extern void list_common_guides_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_main_cmds(struct string_list *list);
|
||||||
extern void list_all_other_cmds(struct string_list *list);
|
extern void list_all_other_cmds(struct string_list *list);
|
||||||
|
Loading…
Reference in New Issue
Block a user