diff options
Diffstat (limited to 'plugins/gitfast')
| -rw-r--r-- | plugins/gitfast/_git | 9 | ||||
| -rw-r--r-- | plugins/gitfast/git-completion.bash | 445 | ||||
| -rw-r--r-- | plugins/gitfast/git-prompt.sh | 149 | ||||
| -rw-r--r-- | plugins/gitfast/gitfast.plugin.zsh | 3 | 
4 files changed, 504 insertions, 102 deletions
| diff --git a/plugins/gitfast/_git b/plugins/gitfast/_git index 45775021f..cf8116d47 100644 --- a/plugins/gitfast/_git +++ b/plugins/gitfast/_git @@ -60,6 +60,15 @@ __gitcomp_nl ()  	compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0  } +__gitcomp_file () +{ +	emulate -L zsh + +	local IFS=$'\n' +	compset -P '*[=:]' +	compadd -Q -p "${2-}" -f -- ${=1} && _ret=0 +} +  _git ()  {  	local _ret=1 diff --git a/plugins/gitfast/git-completion.bash b/plugins/gitfast/git-completion.bash index be800e09b..93eba4675 100644 --- a/plugins/gitfast/git-completion.bash +++ b/plugins/gitfast/git-completion.bash @@ -13,6 +13,7 @@  #    *) .git/remotes file names  #    *) git 'subcommands'  #    *) tree paths within 'ref:path/to/file' expressions +#    *) file paths within current working directory and index  #    *) common --long-options  #  # To use these routines: @@ -23,10 +24,6 @@  #    3) Consider changing your PS1 to also show the current branch,  #       see git-prompt.sh for details. -if [[ -n ${ZSH_VERSION-} ]]; then -	autoload -U +X bashcompinit && bashcompinit -fi -  case "$COMP_WORDBREAKS" in  *:*) : great ;;  *)   COMP_WORDBREAKS="$COMP_WORDBREAKS:" @@ -169,7 +166,6 @@ __git_reassemble_comp_words_by_ref()  }  if ! type _get_comp_words_by_ref >/dev/null 2>&1; then -if [[ -z ${ZSH_VERSION:+set} ]]; then  _get_comp_words_by_ref ()  {  	local exclude cur_ words_ cword_ @@ -197,32 +193,6 @@ _get_comp_words_by_ref ()  		shift  	done  } -else -_get_comp_words_by_ref () -{ -	while [ $# -gt 0 ]; do -		case "$1" in -		cur) -			cur=${COMP_WORDS[COMP_CWORD]} -			;; -		prev) -			prev=${COMP_WORDS[COMP_CWORD-1]} -			;; -		words) -			words=("${COMP_WORDS[@]}") -			;; -		cword) -			cword=$COMP_CWORD -			;; -		-n) -			# assume COMP_WORDBREAKS is already set sanely -			shift -			;; -		esac -		shift -	done -} -fi  fi  # Generates completion reply with compgen, appending a space to possible @@ -264,6 +234,124 @@ __gitcomp_nl ()  	COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))  } +# Generates completion reply with compgen from newline-separated possible +# completion filenames. +# It accepts 1 to 3 arguments: +# 1: List of possible completion filenames, separated by a single newline. +# 2: A directory prefix to be added to each possible completion filename +#    (optional). +# 3: Generate possible completion matches for this word (optional). +__gitcomp_file () +{ +	local IFS=$'\n' + +	# XXX does not work when the directory prefix contains a tilde, +	# since tilde expansion is not applied. +	# This means that COMPREPLY will be empty and Bash default +	# completion will be used. +	COMPREPLY=($(compgen -P "${2-}" -W "$1" -- "${3-$cur}")) + +	# Tell Bash that compspec generates filenames. +	compopt -o filenames 2>/dev/null +} + +__git_index_file_list_filter_compat () +{ +	local path + +	while read -r path; do +		case "$path" in +		?*/*) echo "${path%%/*}/" ;; +		*) echo "$path" ;; +		esac +	done +} + +__git_index_file_list_filter_bash () +{ +	local path + +	while read -r path; do +		case "$path" in +		?*/*) +			# XXX if we append a slash to directory names when using +			# `compopt -o filenames`, Bash will append another slash. +			# This is pretty stupid, and this the reason why we have to +			# define a compatible version for this function. +			echo "${path%%/*}" ;; +		*) +			echo "$path" ;; +		esac +	done +} + +# Process path list returned by "ls-files" and "diff-index --name-only" +# commands, in order to list only file names relative to a specified +# directory, and append a slash to directory names. +__git_index_file_list_filter () +{ +	# Default to Bash >= 4.x +	__git_index_file_list_filter_bash +} + +# Execute git ls-files, returning paths relative to the directory +# specified in the first argument, and using the options specified in +# the second argument. +__git_ls_files_helper () +{ +	( +		test -n "${CDPATH+set}" && unset CDPATH +		# NOTE: $2 is not quoted in order to support multiple options +		cd "$1" && git ls-files --exclude-standard $2 +	) 2>/dev/null +} + + +# Execute git diff-index, returning paths relative to the directory +# specified in the first argument, and using the tree object id +# specified in the second argument. +__git_diff_index_helper () +{ +	( +		test -n "${CDPATH+set}" && unset CDPATH +		cd "$1" && git diff-index --name-only --relative "$2" +	) 2>/dev/null +} + +# __git_index_files accepts 1 or 2 arguments: +# 1: Options to pass to ls-files (required). +#    Supported options are --cached, --modified, --deleted, --others, +#    and --directory. +# 2: A directory path (optional). +#    If provided, only files within the specified directory are listed. +#    Sub directories are never recursed.  Path must have a trailing +#    slash. +__git_index_files () +{ +	local dir="$(__gitdir)" root="${2-.}" + +	if [ -d "$dir" ]; then +		__git_ls_files_helper "$root" "$1" | __git_index_file_list_filter | +			sort | uniq +	fi +} + +# __git_diff_index_files accepts 1 or 2 arguments: +# 1) The id of a tree object. +# 2) A directory path (optional). +#    If provided, only files within the specified directory are listed. +#    Sub directories are never recursed.  Path must have a trailing +#    slash. +__git_diff_index_files () +{ +	local dir="$(__gitdir)" root="${2-.}" + +	if [ -d "$dir" ]; then +		__git_diff_index_helper "$root" "$1" | __git_index_file_list_filter | +			sort | uniq +	fi +} +  __git_heads ()  {  	local dir="$(__gitdir)" @@ -321,7 +409,7 @@ __git_refs ()  				if [[ "$ref" == "$cur"* ]]; then  					echo "$ref"  				fi -			done | uniq -u +			done | sort | uniq -u  		fi  		return  	fi @@ -428,7 +516,7 @@ __git_complete_revlist_file ()  		*)   pfx="$ref:$pfx" ;;  		esac -		__gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \ +		__gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \  				| sed '/^100... blob /{  				           s,^.*	,,  				           s,$, , @@ -461,6 +549,46 @@ __git_complete_revlist_file ()  } +# __git_complete_index_file requires 1 argument: the options to pass to +# ls-file +__git_complete_index_file () +{ +	local pfx cur_="$cur" + +	case "$cur_" in +	?*/*) +		pfx="${cur_%/*}" +		cur_="${cur_##*/}" +		pfx="${pfx}/" + +		__gitcomp_file "$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_" +		;; +	*) +		__gitcomp_file "$(__git_index_files "$1")" "" "$cur_" +		;; +	esac +} + +# __git_complete_diff_index_file requires 1 argument: the id of a tree +# object +__git_complete_diff_index_file () +{ +	local pfx cur_="$cur" + +	case "$cur_" in +	?*/*) +		pfx="${cur_%/*}" +		cur_="${cur_##*/}" +		pfx="${pfx}/" + +		__gitcomp_file "$(__git_diff_index_files "$1" "$pfx")" "$pfx" "$cur_" +		;; +	*) +		__gitcomp_file "$(__git_diff_index_files "$1")" "" "$cur_" +		;; +	esac +} +  __git_complete_file ()  {  	__git_complete_revlist_file @@ -562,10 +690,19 @@ __git_complete_strategy ()  	return 1  } +__git_commands () { +	if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}" +	then +		printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}" +	else +		git help -a|egrep '^  [a-zA-Z0-9]' +	fi +} +  __git_list_all_commands ()  {  	local i IFS=" "$'\n' -	for i in $(git help -a|egrep '^  [a-zA-Z0-9]') +	for i in $(__git_commands)  	do  		case $i in  		*--*)             : helper pattern;; @@ -585,7 +722,7 @@ __git_list_porcelain_commands ()  {  	local i IFS=" "$'\n'  	__git_compute_all_commands -	for i in "help" $__git_all_commands +	for i in $__git_all_commands  	do  		case $i in  		*--*)             : helper pattern;; @@ -594,6 +731,7 @@ __git_list_porcelain_commands ()  		archimport)       : import;;  		cat-file)         : plumbing;;  		check-attr)       : plumbing;; +		check-ignore)     : plumbing;;  		check-ref-format) : plumbing;;  		checkout-index)   : plumbing;;  		commit-tree)      : plumbing;; @@ -753,6 +891,43 @@ __git_has_doubledash ()  	return 1  } +# Try to count non option arguments passed on the command line for the +# specified git command. +# When options are used, it is necessary to use the special -- option to +# tell the implementation were non option arguments begin. +# XXX this can not be improved, since options can appear everywhere, as +# an example: +#	git mv x -n y +# +# __git_count_arguments requires 1 argument: the git command executed. +__git_count_arguments () +{ +	local word i c=0 + +	# Skip "git" (first argument) +	for ((i=1; i < ${#words[@]}; i++)); do +		word="${words[i]}" + +		case "$word" in +			--) +				# Good; we can assume that the following are only non +				# option arguments. +				((c = 0)) +				;; +			"$1") +				# Skip the specified git command and discard git +				# main options +				((c = 0)) +				;; +			?*) +				((c++)) +				;; +		esac +	done + +	printf "%d" $c +} +  __git_whitespacelist="nowarn warn error error-all fix"  _git_am () @@ -801,8 +976,6 @@ _git_apply ()  _git_add ()  { -	__git_has_doubledash && return -  	case "$cur" in  	--*)  		__gitcomp " @@ -811,7 +984,9 @@ _git_add ()  			"  		return  	esac -	COMPREPLY=() + +	# XXX should we check for --update and --all options ? +	__git_complete_index_file "--others --modified"  }  _git_archive () @@ -961,15 +1136,15 @@ _git_cherry_pick ()  _git_clean ()  { -	__git_has_doubledash && return -  	case "$cur" in  	--*)  		__gitcomp "--dry-run --quiet"  		return  		;;  	esac -	COMPREPLY=() + +	# XXX should we check for -x option ? +	__git_complete_index_file "--others"  }  _git_clone () @@ -989,6 +1164,8 @@ _git_clone ()  			--upload-pack  			--template=  			--depth +			--single-branch +			--branch  			"  		return  		;; @@ -998,7 +1175,19 @@ _git_clone ()  _git_commit ()  { -	__git_has_doubledash && return +	case "$prev" in +	-c|-C) +		__gitcomp_nl "$(__git_refs)" "" "${cur}" +		return +		;; +	esac + +	case "$prev" in +	-c|-C) +		__gitcomp_nl "$(__git_refs)" "" "${cur}" +		return +		;; +	esac  	case "$cur" in  	--cleanup=*) @@ -1027,7 +1216,13 @@ _git_commit ()  			"  		return  	esac -	COMPREPLY=() + +	if git rev-parse --verify --quiet HEAD >/dev/null; then +		__git_complete_diff_index_file "HEAD" +	else +		# This is the first commit +		__git_complete_index_file "--cached" +	fi  }  _git_describe () @@ -1043,6 +1238,8 @@ _git_describe ()  	__gitcomp_nl "$(__git_refs)"  } +__git_diff_algorithms="myers minimal patience histogram" +  __git_diff_common_options="--stat --numstat --shortstat --summary  			--patch-with-stat --name-only --name-status --color  			--no-color --color-words --no-renames --check @@ -1053,10 +1250,11 @@ __git_diff_common_options="--stat --numstat --shortstat --summary  			--no-ext-diff  			--no-prefix --src-prefix= --dst-prefix=  			--inter-hunk-context= -			--patience +			--patience --histogram --minimal  			--raw  			--dirstat --dirstat= --dirstat-by-file  			--dirstat-by-file= --cumulative +			--diff-algorithm=  "  _git_diff () @@ -1064,6 +1262,10 @@ _git_diff ()  	__git_has_doubledash && return  	case "$cur" in +	--diff-algorithm=*) +		__gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}" +		return +		;;  	--*)  		__gitcomp "--cached --staged --pickaxe-all --pickaxe-regex  			--base --ours --theirs --no-index @@ -1116,6 +1318,14 @@ _git_fetch ()  	__git_complete_remote_or_refspec  } +__git_format_patch_options=" +	--stdout --attach --no-attach --thread --thread= --output-directory +	--numbered --start-number --numbered-files --keep-subject --signoff +	--signature --no-signature --in-reply-to= --cc= --full-index --binary +	--not --all --cover-letter --no-prefix --src-prefix= --dst-prefix= +	--inline --suffix= --ignore-if-in-upstream --subject-prefix= +" +  _git_format_patch ()  {  	case "$cur" in @@ -1126,21 +1336,7 @@ _git_format_patch ()  		return  		;;  	--*) -		__gitcomp " -			--stdout --attach --no-attach --thread --thread= -			--output-directory -			--numbered --start-number -			--numbered-files -			--keep-subject -			--signoff --signature --no-signature -			--in-reply-to= --cc= -			--full-index --binary -			--not --all -			--cover-letter -			--no-prefix --src-prefix= --dst-prefix= -			--inline --suffix= --ignore-if-in-upstream -			--subject-prefix= -			" +		__gitcomp "$__git_format_patch_options"  		return  		;;  	esac @@ -1251,8 +1447,6 @@ _git_init ()  _git_ls_files ()  { -	__git_has_doubledash && return -  	case "$cur" in  	--*)  		__gitcomp "--cached --deleted --modified --others --ignored @@ -1265,7 +1459,10 @@ _git_ls_files ()  		return  		;;  	esac -	COMPREPLY=() + +	# XXX ignore options like --modified and always suggest all cached +	# files. +	__git_complete_index_file "--cached"  }  _git_ls_remote () @@ -1397,7 +1594,14 @@ _git_mv ()  		return  		;;  	esac -	COMPREPLY=() + +	if [ $(__git_count_arguments "mv") -gt 0 ]; then +		# We need to show both cached and untracked files (including +		# empty directories) since this may not be the last argument. +		__git_complete_index_file "--cached --others --directory" +	else +		__git_complete_index_file "--cached" +	fi  }  _git_name_rev () @@ -1554,6 +1758,12 @@ _git_send_email ()  		__gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"  		return  		;; +	--thread=*) +		__gitcomp " +			deep shallow +			" "" "${cur##--thread=}" +		return +		;;  	--*)  		__gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to  			--compose --confirm= --dry-run --envelope-sender @@ -1563,11 +1773,12 @@ _git_send_email ()  			--signed-off-by-cc --smtp-pass --smtp-server  			--smtp-server-port --smtp-encryption= --smtp-user  			--subject --suppress-cc= --suppress-from --thread --to -			--validate --no-validate" +			--validate --no-validate +			$__git_format_patch_options"  		return  		;;  	esac -	COMPREPLY=() +	__git_complete_revlist  }  _git_stage () @@ -1581,7 +1792,7 @@ __git_config_get_set_variables ()  	while [ $c -gt 1 ]; do  		word="${words[c]}"  		case "$word" in -		--global|--system|--file=*) +		--system|--global|--local|--file=*)  			config_file="$word"  			break  			;; @@ -1687,7 +1898,7 @@ _git_config ()  	case "$cur" in  	--*)  		__gitcomp " -			--global --system --file= +			--system --global --local --file=  			--list --replace-all  			--get --get-all --get-regexp  			--add --unset --unset-all @@ -1860,6 +2071,7 @@ _git_config ()  		diff.suppressBlankEmpty  		diff.tool  		diff.wordRegex +		diff.algorithm  		difftool.  		difftool.prompt  		fetch.recurseSubmodules @@ -2096,15 +2308,14 @@ _git_revert ()  _git_rm ()  { -	__git_has_doubledash && return -  	case "$cur" in  	--*)  		__gitcomp "--cached --dry-run --ignore-unmatch --quiet"  		return  		;;  	esac -	COMPREPLY=() + +	__git_complete_index_file "--cached"  }  _git_shortlog () @@ -2134,6 +2345,10 @@ _git_show ()  			" "" "${cur#*=}"  		return  		;; +	--diff-algorithm=*) +		__gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}" +		return +		;;  	--*)  		__gitcomp "--pretty= --format= --abbrev-commit --oneline  			$__git_diff_common_options @@ -2429,20 +2644,88 @@ __gitk_main ()  	__git_complete_revlist  } -__git_func_wrap () -{ -	if [[ -n ${ZSH_VERSION-} ]]; then -		emulate -L bash -		setopt KSH_TYPESET +if [[ -n ${ZSH_VERSION-} ]]; then +	echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2 -		# workaround zsh's bug that leaves 'words' as a special -		# variable in versions < 4.3.12 -		typeset -h words +	autoload -U +X compinit && compinit -		# workaround zsh's bug that quotes spaces in the COMPREPLY -		# array if IFS doesn't contain spaces. -		typeset -h IFS +	__gitcomp () +	{ +		emulate -L zsh + +		local cur_="${3-$cur}" + +		case "$cur_" in +		--*=) +			;; +		*) +			local c IFS=$' \t\n' +			local -a array +			for c in ${=1}; do +				c="$c${4-}" +				case $c in +				--*=*|*.) ;; +				*) c="$c " ;; +				esac +				array[$#array+1]="$c" +			done +			compset -P '*[=:]' +			compadd -Q -S '' -p "${2-}" -a -- array && _ret=0 +			;; +		esac +	} + +	__gitcomp_nl () +	{ +		emulate -L zsh + +		local IFS=$'\n' +		compset -P '*[=:]' +		compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0 +	} + +	__gitcomp_file () +	{ +		emulate -L zsh + +		local IFS=$'\n' +		compset -P '*[=:]' +		compadd -Q -p "${2-}" -f -- ${=1} && _ret=0 +	} + +	__git_zsh_helper () +	{ +		emulate -L ksh +		local cur cword prev +		cur=${words[CURRENT-1]} +		prev=${words[CURRENT-2]} +		let cword=CURRENT-1 +		__${service}_main +	} + +	_git () +	{ +		emulate -L zsh +		local _ret=1 +		__git_zsh_helper +		let _ret && _default -S '' && _ret=0 +		return _ret +	} + +	compdef _git git gitk +	return +elif [[ -n ${BASH_VERSION-} ]]; then +	if ((${BASH_VERSINFO[0]} < 4)); then +		# compopt is not supported +		__git_index_file_list_filter () +		{ +			__git_index_file_list_filter_compat +		}  	fi +fi + +__git_func_wrap () +{  	local cur words cword prev  	_get_comp_words_by_ref -n =: cur words cword prev  	$1 diff --git a/plugins/gitfast/git-prompt.sh b/plugins/gitfast/git-prompt.sh index afd76e86e..65f8368f1 100644 --- a/plugins/gitfast/git-prompt.sh +++ b/plugins/gitfast/git-prompt.sh @@ -10,9 +10,22 @@  #    1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).  #    2) Add the following line to your .bashrc/.zshrc:  #        source ~/.git-prompt.sh -#    3) Change your PS1 to also show the current branch: -#         Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' -#         ZSH:  PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ ' +#    3a) Change your PS1 to call __git_ps1 as +#        command-substitution: +#        Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' +#        ZSH:  PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ ' +#        the optional argument will be used as format string. +#    3b) Alternatively, if you are using bash, __git_ps1 can be +#        used for PROMPT_COMMAND with two parameters, <pre> and +#        <post>, which are strings you would put in $PS1 before +#        and after the status string generated by the git-prompt +#        machinery.  e.g. +#           PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "' +#        will show username, at-sign, host, colon, cwd, then +#        various status string, followed by dollar and SP, as +#        your prompt. +#        Optionally, you can supply a third argument with a printf +#        format string to finetune the output of the branch status  #  # The argument to __git_ps1 will be displayed only if you are currently  # in a git repository.  The %s token will be the name of the current @@ -30,7 +43,10 @@  #  # If you would like to see if there're untracked files, then you can set  # GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked -# files, then a '%' will be shown next to the branch name. +# files, then a '%' will be shown next to the branch name.  You can +# configure this per-repository with the bash.showUntrackedFiles +# variable, which defaults to true once GIT_PS1_SHOWUNTRACKEDFILES is +# enabled.  #  # If you would like to see the difference between HEAD and its upstream,  # set GIT_PS1_SHOWUPSTREAM="auto".  A "<" indicates you are behind, ">" @@ -49,6 +65,19 @@  # find one, or @{upstream} otherwise.  Once you have set  # GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by  # setting the bash.showUpstream config variable. +# +# If you would like to see more information about the identity of +# commits checked out as a detached HEAD, set GIT_PS1_DESCRIBE_STYLE +# to one of these values: +# +#     contains      relative to newer annotated tag (v1.6.3.2~35) +#     branch        relative to newer tag or branch (master~4) +#     describe      relative to older annotated tag (v1.6.3.1-13-gdd42c2f) +#     default       exactly matching tag +# +# If you would like a colored hint about the current dirty state, set +# GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on +# the colored output of "git status -sb".  # __gitdir accepts 0 or 1 arguments (i.e., location)  # returns location of .git repo @@ -195,11 +224,43 @@ __git_ps1_show_upstream ()  # __git_ps1 accepts 0 or 1 arguments (i.e., format string) -# returns text to add to bash PS1 prompt (includes branch name) +# when called from PS1 using command substitution +# in this mode it prints text to add to bash PS1 prompt (includes branch name) +# +# __git_ps1 requires 2 or 3 arguments when called from PROMPT_COMMAND (pc) +# in that case it _sets_ PS1. The arguments are parts of a PS1 string. +# when two arguments are given, the first is prepended and the second appended +# to the state string when assigned to PS1. +# The optional third parameter will be used as printf format string to further +# customize the output of the git-status string. +# In this mode you can request colored hints using GIT_PS1_SHOWCOLORHINTS=true  __git_ps1 ()  { +	local pcmode=no +	local detached=no +	local ps1pc_start='\u@\h:\w ' +	local ps1pc_end='\$ ' +	local printf_format=' (%s)' + +	case "$#" in +		2|3)	pcmode=yes +			ps1pc_start="$1" +			ps1pc_end="$2" +			printf_format="${3:-$printf_format}" +		;; +		0|1)	printf_format="${1:-$printf_format}" +		;; +		*)	return +		;; +	esac +  	local g="$(__gitdir)" -	if [ -n "$g" ]; then +	if [ -z "$g" ]; then +		if [ $pcmode = yes ]; then +			#In PC mode PS1 always needs to be set +			PS1="$ps1pc_start$ps1pc_end" +		fi +	else  		local r=""  		local b=""  		if [ -f "$g/rebase-merge/interactive" ]; then @@ -226,7 +287,7 @@ __git_ps1 ()  			fi  			b="$(git symbolic-ref HEAD 2>/dev/null)" || { - +				detached=yes  				b="$(  				case "${GIT_PS1_DESCRIBE_STYLE-}" in  				(contains) @@ -259,24 +320,25 @@ __git_ps1 ()  				b="GIT_DIR!"  			fi  		elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then -			if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then -				if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then -					git diff --no-ext-diff --quiet --exit-code || w="*" -					if git rev-parse --quiet --verify HEAD >/dev/null; then -						git diff-index --cached --quiet HEAD -- || i="+" -					else -						i="#" -					fi +			if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] && +			   [ "$(git config --bool bash.showDirtyState)" != "false" ] +			then +				git diff --no-ext-diff --quiet --exit-code || w="*" +				if git rev-parse --quiet --verify HEAD >/dev/null; then +					git diff-index --cached --quiet HEAD -- || i="+" +				else +					i="#"  				fi  			fi  			if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then  				git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"  			fi -			if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then -				if [ -n "$(git ls-files --others --exclude-standard)" ]; then -					u="%%" -				fi +			if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] && +			   [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] && +			   [ -n "$(git ls-files --others --exclude-standard)" ] +			then +				u="%%"  			fi  			if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then @@ -285,6 +347,53 @@ __git_ps1 ()  		fi  		local f="$w$i$s$u" -		printf -- "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p" +		if [ $pcmode = yes ]; then +			local gitstring= +			if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then +				local c_red='\e[31m' +				local c_green='\e[32m' +				local c_lblue='\e[1;34m' +				local c_clear='\e[0m' +				local bad_color=$c_red +				local ok_color=$c_green +				local branch_color="$c_clear" +				local flags_color="$c_lblue" +				local branchstring="$c${b##refs/heads/}" + +				if [ $detached = no ]; then +					branch_color="$ok_color" +				else +					branch_color="$bad_color" +				fi + +				# Setting gitstring directly with \[ and \] around colors +				# is necessary to prevent wrapping issues! +				gitstring="\[$branch_color\]$branchstring\[$c_clear\]" + +				if [ -n "$w$i$s$u$r$p" ]; then +					gitstring="$gitstring " +				fi +				if [ "$w" = "*" ]; then +					gitstring="$gitstring\[$bad_color\]$w" +				fi +				if [ -n "$i" ]; then +					gitstring="$gitstring\[$ok_color\]$i" +				fi +				if [ -n "$s" ]; then +					gitstring="$gitstring\[$flags_color\]$s" +				fi +				if [ -n "$u" ]; then +					gitstring="$gitstring\[$bad_color\]$u" +				fi +				gitstring="$gitstring\[$c_clear\]$r$p" +			else +				gitstring="$c${b##refs/heads/}${f:+ $f}$r$p" +			fi +			gitstring=$(printf -- "$printf_format" "$gitstring") +			PS1="$ps1pc_start$gitstring$ps1pc_end" +		else +			# NO color option unless in PROMPT_COMMAND mode +			printf -- "$printf_format" "$c${b##refs/heads/}${f:+ $f}$r$p" +		fi  	fi  } diff --git a/plugins/gitfast/gitfast.plugin.zsh b/plugins/gitfast/gitfast.plugin.zsh index 7e50cf721..dba1b1315 100644 --- a/plugins/gitfast/gitfast.plugin.zsh +++ b/plugins/gitfast/gitfast.plugin.zsh @@ -3,5 +3,6 @@ source $dir/../git/git.plugin.zsh  source $dir/git-prompt.sh  function git_prompt_info() { -  __git_ps1 "${ZSH_THEME_GIT_PROMPT_PREFIX//\%/%%}%s${ZSH_THEME_GIT_PROMPT_SUFFIX//\%/%%}" +  dirty="$(parse_git_dirty)" +  __git_ps1 "${ZSH_THEME_GIT_PROMPT_PREFIX//\%/%%}%s${dirty//\%/%%}${ZSH_THEME_GIT_PROMPT_SUFFIX//\%/%%}"  } | 
