#!/bin/bash -e

# install deb file/s using apt
# syntax: apt-deb foo.deb bar.deb ...

OPTS=()
I=0
while true; do
	case "$1" in
	--) shift; break ;;
	-*) OPTS[$I]="$1"; shift; I=$[$I + 1] ;;
	*) break ;;
	esac
done

ARCH=`dpkg-architecture -qDEB_HOST_ARCH`

PKGS=`perl -e '
	for $p (@ARGV) {
		$p =~ s,.*/,,;
		$p =~ s,(.*)\..*,$1,;
		$v = $p;
		$v =~ s,.*?_([^_]*).*,$1,;
		$p =~ s,_.*,,;
		$v =~ s/%([A-Fa-f0-9]{2})/chr(hex($1))/ges;
		print "$p=$v ";
	}
	print "\n";
' "$@"`

DIR=/var/lib/apt-deb
mkdir -p "$DIR"
lockfile -r0 "$DIR"/.lock
trap "rm -rf $DIR/.lock $DIR/*; exit 1" 0 2 15
rm -rf "$DIR"/*
mkdir -p "$DIR/lists/partial"
for A; do ln -s "`readlink -f -- "$A"`" "$DIR"; done
cd "$DIR"
for A in dists apt-deb main binary-$ARCH; do
	ln -s . $A
done

dpkg-scanpackages . /dev/null >Packages 2>errors || { cat errors >&2; exit 1; }
echo "deb file:$DIR" apt-deb main > sources.list
cp sources.list sources.list.both
cat /etc/apt/sources.list >> sources.list.both

echo <<End >Release
Archive: apt-deb
Component: main
Origin: apt-deb
Label: apt-deb
Architecture: $ARCH
End

apt-get -o Dir::Etc::SourceList="$DIR/sources.list" -o Dir::State::Lists="$DIR/lists" update

cd "$DIR/lists"
rmdir partial
LISTS=`ls`
mv $LISTS /var/lib/apt/lists
cd /var/lib/apt/lists

apt-get "${OPTS[@]}" --reinstall -o Dir::Etc::SourceList="$DIR/sources.list.both" install $PKGS || {
	rm $LISTS
	false
}

rm $LISTS
