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>maint
							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
	
	 Nguyễn Thái Ngọc Duy
						Nguyễn Thái Ngọc Duy