summaryrefslogtreecommitdiff
path: root/etc/completions/__git_files
blob: 6b8c1dd4c0d1c115188361dfcc96a509c22d6cb7 (plain)
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
#autoload +X
local expl files ls_opts opts gitdir dirdiff i tmp

zparseopts -D -E -a opts -- -cached -deleted -modified -others -ignored -unmerged -killed

gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
__git_command_successful || return

ls_opts=("--exclude-per-directory=.gitignore")
[[ -f "$gitdir/info/exclude" ]] && ls_opts+="--exclude-from=$gitdir/info/exclude"

files=(${(ps:\0:)"$(cd $gitdir/..; _call_program files git ls-files -z $ls_opts $opts 2>/dev/null)"})
__git_command_successful || return

if [[ ! -d .git ]] {
	dirdiff=${PWD#${gitdir%/.git}}
	repeat ${#${(s:/:)dirdiff}}; do
		tmp+='../'
	done
	dirdiff=${dirdiff#/}
	for (( i=1; i <= $#files; i++)) {
		if [[ $files[$i] == $dirdiff/* ]] {
			files[$i]=${files[$i]#$dirdiff/}
		} else {
			files[$i]=$tmp${files[$i]#$dirdiff/}
		}
	}
}

_wanted files expl 'index file' _multi_parts $@ - / files