aboutsummaryrefslogtreecommitdiffstats
path: root/git/git-cdiff
blob: 15d91e9848c1b9c89fc2e77b1e0f4765e1ce0d3b (plain) (blame)
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
#!/bin/dash
if test -z "${GIT_CDIFF_CONTEXT}"; then
	git difftool -y -x "diff -c --color=always" "$@"
elif printf '%s' "${GIT_CDIFF_CONTEXT}" | grep -q '^-'; then
	git difftool -y -x "diff ${GIT_CDIFF_CONTEXT} --color=always" "$@"
else
	git difftool -y -x "diff -C${GIT_CDIFF_CONTEXT} --color=always" "$@"
fi | {
	# this part of the pipeline is optional, it just makes GNU diff colouring bit nicer
	if test "$TERM" = linux; then
		sed '/^\(\x1b\[[0-9;]*m\)* /s/\x1b\[[0-9;]*m//g'
	else
		sed '/^\(\x1b\[[0-9;]*m\)* /s/^/\x1b\[2m/g'
	fi
} | {
	# this part of the pipeline is optional (and breaks diff format), it adds line number to the margin
	if printf '%s' "${GIT_CDIFF_CONTEXT}" | grep -q '^-'; then
		exec cat
	fi
	if test "$TERM" = linux; then
		linecolour="35"
	else
		linecolour="2;35"
	fi
	lineno=x
	while IFS= read -r line; do
		if printf '%s\n' "$line" | sed 's/\x1b\[[0-9;]*m//g' | grep -q '^\(\*\*\* \|--- \)[0-9]*,[0-9]* \(\*\*\*\*\|----\)$'; then
			lineno="$(printf '%s' "$line" | sed 's/\x1b\[[0-9;]*m//g' | sed 's/^\(\*\*\* \|--- \)\([0-9]*\),.*$/\2/')"
			printf '%s\n' "$line"
		elif test ! "$lineno" = x && printf '%s\n' "$line" | sed 's/\x1b\[[0-9;]*m//g' | grep -q '^\(!\|+\|-\| \) '; then
			printf '\e[%sm%5i \e[m%s\n' "$linecolour" "$lineno" "$line"
			lineno=$(( $lineno + 1 ))
		else
			lineno=x
			printf '%s\n' "$line"
		fi
	done
} | {
	if test -t 1; then
		less -FRX
	else
		cat
	fi
}