File: _vcsh_bash

package info (click to toggle)
vcsh 1.20190621-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 260 kB
  • sloc: sh: 577; perl: 99; makefile: 36
file content (138 lines) | stat: -rw-r--r-- 3,112 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# bash completion for vcsh.

# run git command
#   based on bash_completion:_command_offset()
_vcsh_git_command () {
	local word_offset=$1
	for (( i=0; i < $word_offset; i++ )); do
		for (( j=0; j <= ${#COMP_LINE}; j++ )); do
			[[ "$COMP_LINE" == "${COMP_WORDS[i]}"* ]] && break
			COMP_LINE=${COMP_LINE:1}
			((COMP_POINT--))
		done
		COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"}
		((COMP_POINT-=${#COMP_WORDS[i]}))
	done
	COMP_LINE="git $COMP_LINE"
	((COMP_POINT+=4))

	# shift COMP_WORDS elements and adjust COMP_CWORD
	for (( i=1; i <= COMP_CWORD - $word_offset + 1; i++ )); do
		COMP_WORDS[i]=${COMP_WORDS[i+$word_offset-1]}
	done
	for (( i; i <= COMP_CWORD; i++ )); do
		unset 'COMP_WORDS[i]'
	done
	COMP_WORDS[0]=git
	((COMP_CWORD -= $word_offset - 1))

	local cspec=$( complete -p git 2>/dev/null )
	if [[ -n $cspec ]]; then
		if [[ ${cspec#* -F } != $cspec ]]; then
			local func=${cspec#*-F }
			func=${func%% *}

			if [[ ${#COMP_WORDS[@]} -ge 2 ]]; then
				$func git "${COMP_WORDS[${#COMP_WORDS[@]}-1]}" "${COMP_WORDS[${#COMP_WORDS[@]}-2]}"
			else
				$func git "${COMP_WORDS[${#COMP_WORDS[@]}-1]}"
			fi

			# restore initial compopts
			local opt
			while [[ $cspec == *" -o "* ]]; do
				# FIXME: should we take "+o opt" into account?
				cspec=${cspec#*-o }
				opt=${cspec%% *}
				compopt -o $opt
				cspec=${cspec#$opt}
			done
		fi
	fi
}

_vcsh () {
	local cur prev words cword OPTS
	_init_completion -n = || return

	local repos cmds
	repos=( $(command vcsh list) )
	cmds="clone delete enter foreach help init list list-tracked list-untracked
		  pull push rename run status upgrade version which write-gitignore"

	local subcword cmd subcmd
	for (( subcword=1; subcword < ${#words[@]}-1; subcword++ )); do
		[[ -n $cmd && ${words[subcword]} != -* ]] && subcmd=${words[subcword]} && break
		[[ ${words[subcword]} != -* ]] && cmd=${words[subcword]}
	done

	if [[ -z $cmd ]]; then
		case $prev in
			-c)
				COMPREPLY=( $(compgen -f -- $cur) )
				return
				;;
		esac

		case $cur in
			-*)
				OPTS='-c -d -h -v'
				COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
				return
				;;
		esac
		COMPREPLY=( $(compgen -W "${repos[*]} ${cmds[*]}" -- $cur) )
		return 0
	fi

	case $cmd in
		help|init|list|pull|push|version|which)
			return
			;;

		list-untracked)
			[[ $cur == -* ]] && \
				COMPREPLY=( $(compgen -W '-a -r' -- $cur) ) && return
			;;&

		run)
			if [[ -n $subcmd && -n "${repos[$subcmd]}" ]]; then
				_command_offset $(( $subcword+1 ))
				return
			fi
			;;&

		delete|enter|list-tracked|list-untracked|rename|run|status|upgrade|write-gitignore)
			# return repos
			if [[ -z $subcmd ]]; then
				COMPREPLY=( $(compgen -W "${repos[*]}" -- $cur) )
				return
			fi
			return
			;;

		clone)
			[[ $cur == -* ]] && \
				COMPREPLY=( $(compgen -W '-b' -- $cur) )
			return
			;;

		foreach)
			[[ $cur == -* ]] \
				&& COMPREPLY=( $(compgen -W "-g" -- $cur) ) && return
			_vcsh_git_command $subcword
			return
			;;

	esac

	# git command on repository
	if [[ -n "${repos[$cmd]}" ]]; then
		_vcsh_git_command $subcword
	fi
	return 0
}

complete -F _vcsh vcsh

# vim: ft=sh: