#! /bin/sh
export=1
if [ $# -lt 1 ]; then
    base=${PWD}
else
    base=$1
fi

if [ ! -d ${base} ]; then
    echo -e "\nusage: $0 [ dir ]"
    exit 1
fi

echo -e "\nworking in ${base}"
gc=${base}/cust/repos/gc
staging=${base}/cust/repos/staging

clean_user() {
    user=$1
    rm -rf ${base}/${user}
    mkdir -p ${base}/${user}/repos
}

setup_user() {
    user=$1
    lgc=${base}/${user}/repos/mygc
    echo -e "\nsetting up ${user}"
    clean_user ${user}
    hg init ${lgc}
    hg unbundle --repository ${lgc} ${base}/cust/gc.hg
    hg clone ${lgc} ${base}/${user}/repos/myworking
}

work() {
    user=$1
    step=$2
    working=${base}/${user}/repos/myworking
    echo -e "\n${user} working on ${step} step"
    echo "${step} work by ${user}" > ${working}/${step}-${user}
    hg commit --repository ${working} --addremove --message "${step} work by ${user}"
    hg export --repository ${working} \
        `hg outgoing --repository ${working} --quiet --template '{rev} '` \
        > ${base}/${user}/${step}-${user}.patch
}

upload() {
    if [ ! -z "${export}" ]; then
        for rev in `cat ${base}/cust/outgoing`; do
            hg export --repository ${gc} --output ${base}/cust/${rev}.patch ${rev}
        done
        rm -f ${base}/cust/outgoing
    fi
}

accept() {
    user=$1
    step=$2
    echo -e "\nadding ${user}'s ${step} step to the gold copy"
    hg import --repository ${staging} --exact ${base}/${user}/${step}-${user}.patch
    head_count=`hg head --repository ${staging} --template '{rev} ' | wc -w`
    if [ ${head_count} -gt 1 ]; then
        hg merge --repository ${staging}
        hg commit --repository ${staging} --message "merge"
    fi
    if [ -z "${export}" ]; then
        hg bundle --repository ${staging} ${base}/cust/`date '+%H%M%S'`.hg
    else
        for rev in `hg outgoing --repository ${staging} --quiet --template '{rev} '`; do
            echo "${rev} " >> ${base}/cust/outgoing
        done
    fi
    hg push --repository ${staging}
}

update() {
    user=$1
    echo -e "\nupdating ${user}'s repositories from the gold copy"
    if [ -z "${export}" ]; then
        hg unbundle --repository ${base}/${user}/repos/mygc ${base}/cust/*.hg
    else
        hg import --repository ${base}/${user}/repos/mygc --exact ${base}/cust/*.patch
    fi
    hg pull --repository ${base}/${user}/repos/myworking --update
}

echo -e "\nsetting up custodian"
clean_user "cust"
hg init ${gc}
echo "initial contents" > ${gc}/one
hg commit --repository ${gc} --addremove --message "initial content"
hg bundle --all --repository ${gc} ${base}/cust/gc.hg
hg clone ${gc} ${staging}

setup_user "user1"
setup_user "user2"

work "user1" "first"
work "user2" "first"

accept "user1" "first"
accept "user2" "first"
upload

update "user1"
