#!/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 }