#!/bin/bash

which rsync >&/dev/null || {
    echo "rsync not found!"
    exit 1
}

usage () {
    echo "Usage:"
    echo "  $(basename $0) [options] srcdir destdir"
    echo "Options:"
    echo "  -q  Quiet: Do not display verbose output (default)"
    echo "  -v  Verbose: Display verbose output"
}

verbose=false

while getopts "hqv" OPT; do
    case $OPT in
        q) verbose=false ;;
        v) verbose=true ;;
        h) usage; exit 0 ;;
    esac
done

shift $(( OPTIND - 1 ))
OPTIND=1

if [[ $# -ne 2 ]]; then
    usage
    exit 2
fi

rsync_opts=(--archive --partial --partial-dir=.rsync-partial)
rsync_version=$(rsync --version)
if [[ $rsync_version =~ version\ v?([0-9]+)\.[0-9]+\.[0-9]+ ]]; then
    rsync_version_major=${BASH_REMATCH[1]}
else
    echo "Unable to parse rsync version"
    echo "$rsync_version"
    exit 1
fi

if [[ $rsync_version_major -lt 3 ]]; then
    rsync_opts+=(--delete-after)
else
    rsync_opts+=(--delete-delay)
fi
[[ $OSTYPE = *darwin* ]]        && rsync_opts+=(--extended-attributes)
[[ $rsync_version = *ACLs* ]]   && rsync_opts+=(--acls)
[[ $rsync_version = *xattrs* ]] && rsync_opts+=(--xattrs)
$verbose                        && rsync_opts+=(--verbose --itemize-changes --progress)

# Fix trailing /  (rsync is very particular about these)
srcdir=$(dirname "$1")/$(basename "$1")
destdir=$(dirname "$2")/$(basename "$2")
mkdir -p "$(dirname "$2")" && \
    exec rsync ${rsync_opts[*]} "$srcdir/" "$destdir"

