#!/bin/bash
usage="$(basename "$0") <left dir> <right dir>"

left=${1?$usage}
right=${2?$usage}

error () {
    echo >&2 "$@"
}

fail () {
    ret=$1; shift
    error "$@"
    exit "$ret"
}

if ! command -v vimdiff &>/dev/null; then
    fail 127 "vimdiff not found"
fi

if [[ ! -d $left ]]; then
    fail 2 "$left is not a directory"
fi

if [[ ! -d $right ]]; then
    fail 2 "$right is not a directory"
fi

# "find | while read" doesn't let me read the y/n input
# shellcheck disable=SC2044
for leftfile in $(find -H "$left" \
                    -name .git -prune -o \
                    -name .svn -prune -o \
                    -name _darcs -prune -o \
                    -name CVS -prune -o \
                    -name _build_results -prune -o \
                    -name _quilt -prune -o \
                    -name _upstream_srpm_contents -prune -o \
                    -name _final_srpm_contents -prune -o \
                    -type f -print); do
    rightfile=${right}${leftfile#"${left}"}
    if [[ ! -e $rightfile ]]; then
        echo "$rightfile doesn't exist"
        continue
    fi
    if ! diff -cZ "$leftfile" "$rightfile"; then
        echo -n "$leftfile and $rightfile differ. Edit? (Yes/No/Exit) "
        read -r
        if [[ $REPLY = [Yy]* ]]; then
            vimdiff "$leftfile" "$rightfile"
        elif [[ $REPLY = [Ee]* ]]; then
            fail 3 "Exiting as requested"
        fi
    else
        echo "$rightfile is identical"
    fi
done
