#!/bin/bash
set -e

# This script creates the apt repos for the .deb files generated by hack/make/build-deb
#
# The following can then be used as apt sources:
# 	deb http://apt.dockerproject.org/repo $distro-$release $version
#
# For example:
#	deb http://apt.dockerproject.org/repo ubuntu-trusty main
#	deb http://apt.dockerproject.org/repo ubuntu-trusty testing
#	deb http://apt.dockerproject.org/repo debian-wheezy experimental
#	deb http://apt.dockerproject.org/repo debian-jessie main
#
# ... and so on and so forth for the builds created by hack/make/build-deb

: ${DOCKER_RELEASE_DIR:=$DEST}
: ${GPG_KEYID:=releasedocker}
APTDIR=$DOCKER_RELEASE_DIR/apt/repo

# setup the apt repo (if it does not exist)
mkdir -p "$APTDIR/conf" "$APTDIR/db"

# supported arches/sections
arches=( amd64 i386 )

# Preserve existing components but don't add any non-existing ones
for component in main testing experimental ; do
	if ls "$APTDIR/dists/*/$component" >/dev/null 2>&1 ; then
		components+=( $component )
	fi
done

# set the component for the version being released
component="main"

if [[ "$VERSION" == *-rc* ]]; then
	component="testing"
fi

if [ "$DOCKER_EXPERIMENTAL" ] || [[ "$VERSION" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then
	component="experimental"
fi

# Make sure our component is in the list of components
if [[ ! "${components[*]}" =~ $component ]] ; then
	components+=( $component )
fi

# create/update apt-ftparchive file
if [ ! -f "$APTDIR/conf/apt-ftparchive.conf" ]; then
	cat <<-EOF > "$APTDIR/conf/apt-ftparchive.conf"
	Dir {
		ArchiveDir "${APTDIR}";
		CacheDir "${APTDIR}/db";
	};

	Default {
		Packages::Compress ". gzip bzip2";
		Sources::Compress ". gzip bzip2";
		Contents::Compress ". gzip bzip2";
	};

	TreeDefault {
		BinCacheDB "packages-\$(SECTION)-\$(ARCH).db";
		Directory "pool/\$(SECTION)";
		Packages "\$(DIST)/\$(SECTION)/binary-\$(ARCH)/Packages";
		SrcDirectory "pool/\$(SECTION)";
		Sources "\$(DIST)/\$(SECTION)/source/Sources";
		Contents "\$(DIST)/\$(SECTION)/Contents-\$(ARCH)";
		FileList "$APTDIR/\$(DIST)/\$(SECTION)/filelist";
	};
	EOF

	for suite in $(exec contrib/reprepro/suites.sh); do
		cat <<-EOF
		Tree "dists/${suite}" {
			Sections "${components[*]}";
			Architectures "${arches[*]}";
		}

		EOF
	done >> "$APTDIR/conf/apt-ftparchive.conf"
fi

if [ ! -f "$APTDIR/conf/docker-engine-release.conf" ]; then
	cat <<-EOF > "$APTDIR/conf/docker-engine-release.conf"
	APT::FTPArchive::Release::Origin "Docker";
	APT::FTPArchive::Release::Components "${components[*]}";
	APT::FTPArchive::Release::Label "Docker APT Repository";
	APT::FTPArchive::Release::Architectures "${arches[*]}";
	EOF
fi

# release the debs
for dir in contrib/builder/deb/*/; do
	version="$(basename "$dir")"
	codename="${version//debootstrap-}"

	DEBFILE=( "bundles/$VERSION/build-deb/$version/docker-engine"*.deb )

	# if we have a $GPG_PASSPHRASE we may as well
	# dpkg-sign before copying the deb into the pool
	if [ ! -z "$GPG_PASSPHRASE" ]; then
		dpkg-sig -g "--no-tty --passphrase '$GPG_PASSPHRASE'" \
			-k "$GPG_KEYID" --sign builder "${DEBFILE[@]}"
	fi

	# add the deb for each component for the distro version into the pool
	mkdir -p "$APTDIR/pool/$component/d/docker-engine/"
	cp "${DEBFILE[@]}" "$APTDIR/pool/$component/d/docker-engine/"

	# update the filelist for this codename/component
	mkdir -p "$APTDIR/dists/$codename/$component"
	find "$APTDIR/pool/$component" \
		-name *~${codename#*-}*.deb > "$APTDIR/dists/$codename/$component/filelist"
done

# clean the databases
apt-ftparchive clean "$APTDIR/conf/apt-ftparchive.conf"

# run the apt-ftparchive commands so we can have pinning
apt-ftparchive generate "$APTDIR/conf/apt-ftparchive.conf"

for dir in contrib/builder/deb/*/; do
	version="$(basename "$dir")"
	codename="${version//debootstrap-}"

	apt-ftparchive \
		-o "APT::FTPArchive::Release::Codename=$codename" \
		-o "APT::FTPArchive::Release::Suite=$codename" \
		-c "$APTDIR/conf/docker-engine-release.conf" \
		release \
		"$APTDIR/dists/$codename" > "$APTDIR/dists/$codename/Release"

	for arch in "${arches[@]}"; do
		mkdir -p "$APTDIR/dists/$codename/$component/binary-$arch"
		apt-ftparchive \
			-o "APT::FTPArchive::Release::Codename=$codename" \
			-o "APT::FTPArchive::Release::Suite=$codename" \
			-o "APT::FTPArchive::Release::Component=$component" \
			-o "APT::FTPArchive::Release::Architecture=$arch" \
			-c "$APTDIR/conf/docker-engine-release.conf" \
			release \
			"$APTDIR/dists/$codename/$component/binary-$arch" > "$APTDIR/dists/$codename/$component/binary-$arch/Release"
	done
done
