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