#!/bin/sh
set -e

# Usage: daupload-release [-A] [-S] CHANGESFILE
#        daupload-beta [-A] [-S] CHANGESFILE

# After a package has been built for all Debian/Ubuntu versions and
# platforms (typically using "da sbuildhack DSCFILE"), this script
# uploads the package into the release or beta apt repository.  If -A
# is specified, only one architecture per Debian/Ubuntu version is
# uploaded.  If -S is specified, only the source package is uploaded.

# Upon completion, moves all of the generated files into the "built"
# subdirectory.

: ${DEBATHENA_APT=/mit/debathena/apt}

case "$(basename "$0")" in
    daupload-release)
	repo=$DEBATHENA_APT
	;;
    daupload-beta)
	repo=${DEBATHENA_APT}-beta
	;;
    *)
	echo "Unknown repo." >&2
	exit 1
	;;
esac

v () {
    echo "$@"
    "$@"
}

A=0
if [ "$1" = "-A" ]; then A=1; shift; fi
S=0
if [ "$1" = "-S" ]; then S=1; shift; fi

change=$1
cd "$(dirname "$change")"
change=$(basename "$change")
base=${change%_source.changes}

check () {
    [ -s "$1" ] || missing="$missing$1 "
}
uncheck () {
    ! [ -s "$1" ] || missing="$missing-$1 "
}

missing=
[ -s "$change" ]
if [ $S -ne 1 ]; then
    check "$base~debian3.1_i386.changes"
    check "$base~debian4.0_amd64.changes"
    check "$base~debian4.1~0.1_amd64.changes"
    check "$base~ubuntu6.06_amd64.changes"
    check "$base~ubuntu6.10_amd64.changes"
    check "$base~ubuntu7.04_amd64.changes"
    check "$base~ubuntu7.10_amd64.changes"
    if [ $A -eq 1 ]; then
	uncheck "$base~debian4.0_i386.changes"
	uncheck "$base~debian4.1~0.1_i386.changes"
	uncheck "$base~ubuntu6.06_i386.changes"
	uncheck "$base~ubuntu6.10_i386.changes"
	uncheck "$base~ubuntu7.04_i386.changes"
	uncheck "$base~ubuntu7.10_i386.changes"
    else
	check "$base~debian4.0_i386.changes"
	check "$base~debian4.1~0.1_i386.changes"
	check "$base~ubuntu6.06_i386.changes"
	check "$base~ubuntu6.10_i386.changes"
	check "$base~ubuntu7.04_i386.changes"
	check "$base~ubuntu7.10_i386.changes"
    fi
fi

if [ -n "$missing" ]; then
    echo "Missing $missing" >&2
    echo -n "Continue? [y/N]"
    read a
    [ "$a" = "y" ]
fi

REPREPRO="v reprepro -Vb $repo"
REPREPROI="$REPREPRO --ignore=wrongdistribution"

$REPREPROI include sarge "$change"
$REPREPROI include etch "$change"
$REPREPROI include lenny "$change"
$REPREPROI include dapper "$change"
$REPREPROI include edgy "$change"
$REPREPROI include feisty "$change"
$REPREPROI include gutsy "$change"

if [ $S -ne 1 ]; then
    $REPREPRO include sarge "$base~debian3.1_i386.changes"
    [ $A -eq 1 ] || $REPREPRO include etch "$base~debian4.0_i386.changes"
    $REPREPRO include etch "$base~debian4.0_amd64.changes"
    [ $A -eq 1 ] || $REPREPRO include lenny "$base~debian4.1~0.1_i386.changes"
    $REPREPRO include lenny "$base~debian4.1~0.1_amd64.changes"
    [ $A -eq 1 ] || $REPREPRO include dapper "$base~ubuntu6.06_i386.changes"
    $REPREPRO include dapper "$base~ubuntu6.06_amd64.changes"
    [ $A -eq 1 ] || $REPREPRO include edgy "$base~ubuntu6.10_i386.changes"
    $REPREPRO include edgy "$base~ubuntu6.10_amd64.changes"
    [ $A -eq 1 ] || $REPREPRO include feisty "$base~ubuntu7.04_i386.changes"
    $REPREPRO include feisty "$base~ubuntu7.04_amd64.changes"
    [ $A -eq 1 ] || $REPREPRO include gutsy "$base~ubuntu7.10_i386.changes"
    $REPREPRO include gutsy "$base~ubuntu7.10_amd64.changes"
fi


changes=$change
changes=$changes\ $base~debian3.1_i386.changes
[ $A -eq 1 ] || changes=$changes\ $base~debian4.0_i386.changes
changes=$changes\ $base~debian4.0_amd64.changes
[ $A -eq 1 ] || changes=$changes\ $base~debian4.1~0.1_i386.changes
changes=$changes\ $base~debian4.1~0.1_amd64.changes
[ $A -eq 1 ] || changes=$changes\ $base~ubuntu6.06_i386.changes
changes=$changes\ $base~ubuntu6.06_amd64.changes
[ $A -eq 1 ] || changes=$changes\ $base~ubuntu6.10_i386.changes
changes=$changes\ $base~ubuntu6.10_amd64.changes
[ $A -eq 1 ] || changes=$changes\ $base~ubuntu7.04_i386.changes
changes=$changes\ $base~ubuntu7.04_amd64.changes
[ $A -eq 1 ] || changes=$changes\ $base~ubuntu7.10_i386.changes
changes=$changes\ $base~ubuntu7.10_amd64.changes

files=${change%.changes}.build\ $changes
origfiles=
for change in $changes; do
    files=$files\ $(perl -0ne '$_ =~ /\nFiles: *\n(( [^\n]*\n)*)/; print $1;' "$change" | awk '{print $5}' | grep -v '\.orig\.tar\.gz$' || :)
    origfiles=$origfiles\ $(perl -0ne '$_ =~ /\nFiles: *\n(( [^\n]*\n)*)/; print $1;' "$change" | awk '{print $5}' | grep '\.orig\.tar\.gz$' || :)
done

built=built/
[ -d "$built" ] || mkdir "$built"
mv -i $files "$built"
if [ -n "$origfiles" ]; then
    for orig in $origfiles; do
        [ -e "$built/$orig" ] || cp -ai "$orig" "$built/"
    done
fi
