#!/bin/sh
#
# svn-sync-slave.sh - syncronise a local Subversion repository with a remote master.
# Written by Thomas Pircher <teheh@gmx.net>
#
set -e

user=$USER
repo_base=
master_server=
svn=svn
svnsync=svnsync
svnadmin=svnadmin


function usage {
        echo >&2 "usage: $0 [-i|-p] [-u user] [-r repo] [-m master-server] [-v]"
        echo >&2 "  -i      initialise the repository"
        echo >&2 "  -p      purge pending locks (DANGEROUS!)"
        echo >&2 "  -u      perform the operations as different user"
        echo >&2 "  -r      path to the local repository"
        echo >&2 "  -m      URL to the master server (needed only at initialisation)"
        echo >&2 "  -v      be more verbose"
}

function out {
        if [ "$1" == "on" ]; then
                cat
        else
                cat > /dev/null
        fi
}

op=sync
verbose=off
while getopts hipm:r:u:v opt; do
        case "$opt" in
                h)  usage
                    exit 0;;
                i)  op=init;;
                m)  master_server="$OPTARG";;
                p)  op=purgelock;;
                r)  repo_base="$OPTARG";;
                u)  user="$OPTARG";;
                v)  verbose=on;;
                \?)     # unknown flag
                        usage
                        exit 1;;
        esac
done
shift `expr $OPTIND - 1`

if [ "$op" == "init" -a -z "$master_server" ]; then
    echo >&2 "Master server not defined. Use -m"
    exit 1
fi
if [ -z "$repo_base" ]; then
    echo >&2 "Repository not defined. Use -r"
    exit 1
fi


if [ "$op" == "init" ]; then
    if [ -x "$repo_base" ]; then
        echo >&2 "repository $repo_base does already exist"
        exit 1
    fi
    mkdir -p "$repo_base"
    $svnadmin create "$repo_base" | out "$verbose"
#    chown -R "$user": "$repo_base"

    cat <<EOF > "$repo_base/hooks/pre-revprop-change"
#!/bin/sh
USER="\$3"

#if [ "\$USER" != "$user" ]; then
#    echo >&2 "only the user $user can change revprops"
#    exit 1
#fi

exit 0
EOF
    chmod +x "$repo_base/hooks/pre-revprop-change"
    $svnsync init --username "$user" "file://$repo_base" "$master_server" | out "$verbose"
    $svnsync sync "file://$repo_base" | out "$verbose"

elif [ "$op" == "sync" ]; then

    $svnsync sync "file://$repo_base" | out "$verbose"

elif [ "$op" == "purgelock" ]; then

    $svn pdel --revprop -r 0 svn:sync-lock "file://$repo_base" | out "$verbose"

fi
