#!/bin/bash
SYNOPSYS=$(cat <<"__TLDR__"
Opens [g]vim with a 3-way diff (plus optionally the original file)
__TLDR__
)
usage () {
    echo "$SYNOPSYS"
    echo
    echo "Usage: $prog MERGED OLD [ORIG] NEW"
    echo "       $prog FILENAME"
    echo
    echo "You can specify the file names individually (ORIG is the optional"
    echo "original file) or with a single FILENAME, which is equivalent to"
    echo "  $prog FILENAME FILENAME.old FILENAME.orig FILENAME.new"
    echo "(skipping FILENAME.orig if it doesn't exist)"
    exit $1
}

prog=${0##*/}
progdir=$(dirname "$0")

fail () {
    echo "$prog:" "$@" >&2
    exit 1
}

is_true () {
    case "${1-}" in
        [yY]*|[tT]*|1|*true) return 0 ;;
        [nN]*|[fF]*|0|*false) return 1 ;;
    esac
    return 2  # unknown
}

if [[ $1 == -h || $1 == --help ]]; then
    usage 0
fi

set -o nounset
IFS=$'\n\t'
is_true "${DEBUG-}" && export PS4='${LINENO}: ' && set -x  # https://stackoverflow.com/a/17805088

merged=
old=
orig=
new=

case $# in
    1)
        merged=$1
        old=$1.old
        orig=$1.orig
        new=$1.new
        [[ -f $orig ]] || orig=
        ;;
    3)
        merged=$1
        old=$2
        new=$3
        ;;
    4)
        merged=$1
        old=$2
        orig=$3
        new=$4
        ;;
    *)
        echo "Error: invalid number of arguments"
        usage 2
        ;;
esac

if [[ -n ${DISPLAY-} ]]; then
    vim=gvim
else
    vim=vim
fi


if [[ -n ${orig-} ]]
then
    $vim -f -d -c 'wincmd J' \
        "$merged" "$old" "$orig" "$new"
else
    $vim -f -d -c 'wincmd l' \
         "$old" "$merged" "$new"
fi

# vim:et:sw=4:sts=4:ts=8
