diff options
Diffstat (limited to 'contrib/completion/git-completion.bash')
| -rw-r--r-- | contrib/completion/git-completion.bash | 243 | 
1 files changed, 194 insertions, 49 deletions
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 3b1a9b1d4f..37888f4e57 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -10,6 +10,7 @@  #    *) local and remote tag names  #    *) .git/remotes file names  #    *) git 'subcommands' +#    *) git email aliases for git-send-email  #    *) tree paths within 'ref:path/to/file' expressions  #    *) file paths within current working directory and index  #    *) common --long-options @@ -663,10 +664,11 @@ __git_list_porcelain_commands ()  		check-mailmap)    : plumbing;;  		check-ref-format) : plumbing;;  		checkout-index)   : plumbing;; +		column)           : internal helper;;  		commit-tree)      : plumbing;;  		count-objects)    : infrequent;; -		credential-cache) : credentials helper;; -		credential-store) : credentials helper;; +		credential)       : credentials;; +		credential-*)     : credentials helper;;  		cvsexportcommit)  : export;;  		cvsimport)        : import;;  		cvsserver)        : daemon;; @@ -735,35 +737,28 @@ __git_list_porcelain_commands ()  __git_porcelain_commands=  __git_compute_porcelain_commands ()  { -	__git_compute_all_commands  	test -n "$__git_porcelain_commands" ||  	__git_porcelain_commands=$(__git_list_porcelain_commands)  } -__git_pretty_aliases () +# Lists all set config variables starting with the given section prefix, +# with the prefix removed. +__git_get_config_variables ()  { -	local i IFS=$'\n' -	for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do -		case "$i" in -		pretty.*) -			i="${i#pretty.}" -			echo "${i/ */}" -			;; -		esac +	local section="$1" i IFS=$'\n' +	for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do +		echo "${i#$section.}"  	done  } +__git_pretty_aliases () +{ +	__git_get_config_variables "pretty" +} +  __git_aliases ()  { -	local i IFS=$'\n' -	for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do -		case "$i" in -		alias.*) -			i="${i#alias.}" -			echo "${i/ */}" -			;; -		esac -	done +	__git_get_config_variables "alias"  }  # __git_aliased_command requires 1 argument @@ -808,6 +803,50 @@ __git_find_on_cmdline ()  	done  } +# Echo the value of an option set on the command line or config +# +# $1: short option name +# $2: long option name including = +# $3: list of possible values +# $4: config string (optional) +# +# example: +# result="$(__git_get_option_value "-d" "--do-something=" \ +#     "yes no" "core.doSomething")" +# +# result is then either empty (no option set) or "yes" or "no" +# +# __git_get_option_value requires 3 arguments +__git_get_option_value () +{ +	local c short_opt long_opt val +	local result= values config_key word + +	short_opt="$1" +	long_opt="$2" +	values="$3" +	config_key="$4" + +	((c = $cword - 1)) +	while [ $c -ge 0 ]; do +		word="${words[c]}" +		for val in $values; do +			if [ "$short_opt$val" = "$word" ] || +			   [ "$long_opt$val"  = "$word" ]; then +				result="$val" +				break 2 +			fi +		done +		((c--)) +	done + +	if [ -n "$config_key" ] && [ -z "$result" ]; then +		result="$(git --git-dir="$(__gitdir)" config "$config_key")" +	fi + +	echo "$result" +} +  __git_has_doubledash ()  {  	local c=1 @@ -1103,6 +1142,8 @@ _git_clone ()  	esac  } +__git_untracked_file_modes="all no normal" +  _git_commit ()  {  	case "$prev" in @@ -1124,7 +1165,7 @@ _git_commit ()  		return  		;;  	--untracked-files=*) -		__gitcomp "all no normal" "" "${cur##--untracked-files=}" +		__gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"  		return  		;;  	--*) @@ -1174,7 +1215,7 @@ __git_diff_common_options="--stat --numstat --shortstat --summary  			--no-prefix --src-prefix= --dst-prefix=  			--inter-hunk-context=  			--patience --histogram --minimal -			--raw --word-diff +			--raw --word-diff --word-diff-regex=  			--dirstat --dirstat= --dirstat-by-file  			--dirstat-by-file= --cumulative  			--diff-algorithm= @@ -1317,6 +1358,7 @@ _git_grep ()  			--full-name --line-number  			--extended-regexp --basic-regexp --fixed-strings  			--perl-regexp +			--threads  			--files-with-matches --name-only  			--files-without-match  			--max-depth @@ -1343,15 +1385,15 @@ _git_help ()  {  	case "$cur" in  	--*) -		__gitcomp "--all --info --man --web" +		__gitcomp "--all --guides --info --man --web"  		return  		;;  	esac  	__git_compute_all_commands  	__gitcomp "$__git_all_commands $(__git_aliases)  		attributes cli core-tutorial cvs-migration -		diffcore gitk glossary hooks ignore modules -		namespaces repository-layout tutorial tutorial-2 +		diffcore everyday gitk glossary hooks ignore modules +		namespaces repository-layout revisions tutorial tutorial-2  		workflows  		"  } @@ -1462,6 +1504,7 @@ _git_log ()  			--relative-date --date=  			--pretty= --format= --oneline  			--show-signature +			--cherry-mark  			--cherry-pick  			--graph  			--decorate --decorate= @@ -1673,7 +1716,10 @@ _git_push ()  _git_rebase ()  {  	local dir="$(__gitdir)" -	if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then +	if [ -f "$dir"/rebase-merge/interactive ]; then +		__gitcomp "--continue --skip --abort --edit-todo" +		return +	elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then  		__gitcomp "--continue --skip --abort"  		return  	fi @@ -1689,8 +1735,12 @@ _git_rebase ()  			--preserve-merges --stat --no-stat  			--committer-date-is-author-date --ignore-date  			--ignore-whitespace --whitespace= -			--autosquash --fork-point --no-fork-point -			--autostash +			--autosquash --no-autosquash +			--fork-point --no-fork-point +			--autostash --no-autostash +			--verify --no-verify +			--keep-empty --root --force-rebase --no-ff +			--exec  			"  		return @@ -1715,6 +1765,15 @@ __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"  _git_send_email ()  { +	case "$prev" in +	--to|--cc|--bcc|--from) +		__gitcomp " +		$(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null) +		" +		return +		;; +	esac +  	case "$cur" in  	--confirm=*)  		__gitcomp " @@ -1739,6 +1798,12 @@ _git_send_email ()  			" "" "${cur##--thread=}"  		return  		;; +	--to=*|--cc=*|--bcc=*|--from=*) +		__gitcomp " +		$(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null) +		" "" "${cur#--*=}" +		return +		;;  	--*)  		__gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to  			--compose --confirm= --dry-run --envelope-sender @@ -1761,6 +1826,56 @@ _git_stage ()  	_git_add  } +_git_status () +{ +	local complete_opt +	local untracked_state + +	case "$cur" in +	--ignore-submodules=*) +		__gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}" +		return +		;; +	--untracked-files=*) +		__gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}" +		return +		;; +	--column=*) +		__gitcomp " +			always never auto column row plain dense nodense +			" "" "${cur##--column=}" +		return +		;; +	--*) +		__gitcomp " +			--short --branch --porcelain --long --verbose +			--untracked-files= --ignore-submodules= --ignored +			--column= --no-column +			" +		return +		;; +	esac + +	untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \ +		"$__git_untracked_file_modes" "status.showUntrackedFiles")" + +	case "$untracked_state" in +	no) +		# --ignored option does not matter +		complete_opt= +		;; +	all|normal|*) +		complete_opt="--cached --directory --no-empty-directory --others" + +		if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then +			complete_opt="$complete_opt --ignored --exclude=*" +		fi +		;; +	esac + +	__git_complete_index_file "$complete_opt" +} +  __git_config_get_set_variables ()  {  	local prevword word config_file= c=$cword @@ -1780,15 +1895,7 @@ __git_config_get_set_variables ()  		c=$((--c))  	done -	git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null | -	while read -r line -	do -		case "$line" in -		*.*=*) -			echo "${line/=*/}" -			;; -		esac -	done +	git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null  }  _git_config () @@ -1803,7 +1910,7 @@ _git_config ()  		return  		;;  	branch.*.rebase) -		__gitcomp "false true" +		__gitcomp "false true preserve interactive"  		return  		;;  	remote.pushdefault) @@ -1893,6 +2000,7 @@ _git_config ()  			--get --get-all --get-regexp  			--add --unset --unset-all  			--remove-section --rename-section +			--name-only  			"  		return  		;; @@ -2049,6 +2157,7 @@ _git_config ()  		core.sparseCheckout  		core.symlinks  		core.trustctime +		core.untrackedCache  		core.warnAmbiguousRefs  		core.whitespace  		core.worktree @@ -2123,6 +2232,8 @@ _git_config ()  		http.noEPSV  		http.postBuffer  		http.proxy +		http.sslCipherList +		http.sslVersion  		http.sslCAInfo  		http.sslCAPath  		http.sslCert @@ -2260,12 +2371,7 @@ _git_remote ()  		__git_complete_remote_or_refspec  		;;  	update) -		local i c='' IFS=$'\n' -		for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do -			i="${i#remotes.}" -			c="$c ${i/ */}" -		done -		__gitcomp "$c" +		__gitcomp "$(__git_get_config_variables "remotes")"  		;;  	*)  		;; @@ -2292,6 +2398,11 @@ _git_reset ()  _git_revert ()  { +	local dir="$(__gitdir)" +	if [ -f "$dir"/REVERT_HEAD ]; then +		__gitcomp "--continue --quit --abort" +		return +	fi  	case "$cur" in  	--*)  		__gitcomp "--edit --mainline --no-edit --no-commit --signoff" @@ -2360,7 +2471,7 @@ _git_show_branch ()  	case "$cur" in  	--*)  		__gitcomp " -			--all --remotes --topo-order --current --more= +			--all --remotes --topo-order --date-order --current --more=  			--list --independent --merge-base --no-name  			--color --no-color  			--sha1-name --sparse --topics --reflog @@ -2373,7 +2484,7 @@ _git_show_branch ()  _git_stash ()  { -	local save_opts='--keep-index --no-keep-index --quiet --patch' +	local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'  	local subcommands='save list show apply clear drop pop create branch'  	local subcommand="$(__git_find_on_cmdline "$subcommands")"  	if [ -z "$subcommand" ]; then @@ -2395,9 +2506,20 @@ _git_stash ()  		apply,--*|pop,--*)  			__gitcomp "--index --quiet"  			;; -		show,--*|drop,--*|branch,--*) +		drop,--*) +			__gitcomp "--quiet" +			;; +		show,--*|branch,--*)  			;; -		show,*|apply,*|drop,*|pop,*|branch,*) +		branch,*) +			if [ $cword -eq 3 ]; then +				__gitcomp_nl "$(__git_refs)"; +			else +				__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ +						| sed -n -e 's/:.*//p')" +			fi +			;; +		show,*|apply,*|drop,*|pop,*)  			__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \  					| sed -n -e 's/:.*//p')"  			;; @@ -2569,6 +2691,29 @@ _git_whatchanged ()  	_git_log  } +_git_worktree () +{ +	local subcommands="add list prune" +	local subcommand="$(__git_find_on_cmdline "$subcommands")" +	if [ -z "$subcommand" ]; then +		__gitcomp "$subcommands" +	else +		case "$subcommand,$cur" in +		add,--*) +			__gitcomp "--detach" +			;; +		list,--*) +			__gitcomp "--porcelain" +			;; +		prune,--*) +			__gitcomp "--dry-run --expire --verbose" +			;; +		*) +			;; +		esac +	fi +} +  __git_main ()  {  	local i c=1 command __git_dir  | 
