#!/usr/bin/env bash
# This script packages rpm, deb, and pacman packages of mgmt with fpm. The
# first argument is the distro type, and the second argument is the version. All
# subsequent arguments are the dependencies.
# Example usage: `./fpm-pack.sh fedora-29 0.1.2 dependency1 dependency2`

# the binary to package
BINARY="mgmt"
# git tag pointing to the current commit
TAG=$(git tag -l --points-at HEAD)
# maintainer email
MAINTAINER="mgmtconfig@purpleidea.com"
# project url
URL="https://github.com/purpleidea/mgmt/"
# project description
DESCRIPTION="Next generation distributed, event-driven, parallel config management!"
# project license
LICENSE="GPLv3"
# location to install the binary
PREFIX="/usr/bin"
# release directory
DIR="releases"

# placeholder for dependencies to be read from arguments
DEPS=
# placeholder for changelog argument parsed from the package type
CHANGELOG=

# make sure we're on a tagged commit
if [ "$TAG" == "" ]; then
	echo "cannot release an untagged commit"
	exit 1
fi

DISTRO="$1"
if [ "$1" == "" ]; then
	echo "distro was not specified"
	exit 1
fi
VERSION="$2"
if [ "$VERSION" == "" ]; then
	echo "version was not specified"
	exit 1
fi
OUTPUT="$3"
if [ "$OUTPUT" == "" ]; then
	echo "output file was not specified"
	exit 1
fi

if [ "$VERSION" != "$TAG" ]; then
	echo "you must checkout the correct version before building (${VERSION} != ${TAG})"
	exit 1
fi

# make sure the distro is a known valid one
if [[ "$DISTRO" == fedora-* ]]; then
	typ="rpm"
elif [[ "$DISTRO" == centos-* ]]; then
	typ="rpm"
elif [[ "$DISTRO" == debian-* ]]; then
	typ="deb"
elif [[ "$DISTRO" == ubuntu-* ]]; then
	typ="deb"
elif [[ "$DISTRO" == archlinux ]]; then
	typ="pacman"
else
	echo "unknown distro: ${DISTRO}."
	exit 1
fi

if [ "$typ" != "rpm" ] && [ "$typ" != "deb" ] && [ "$typ" != "pacman" ]; then
	echo "invalid package type"
	exit 1
fi

# assume the file extension
ext="$typ"
if [ "$typ" = "pacman" ]; then	# archlinux is an exception
	ext="pkg.tar.xz"
fi

# don't run if the file already exists (bad idempotent implementation)
if [ -d "${DIR}/${VERSION}/${DISTRO}/" ]; then
	if ls "${DIR}/${VERSION}/${DISTRO}/"*."${ext}" &>/dev/null; then
		# update timestamp so the Makefile is happy =D
		touch "${DIR}/${VERSION}/${DISTRO}/"*."${ext}"
		echo "a .${ext} already exists"
		exit 0	# don't error, we want to be idempotent
	fi
fi

# there are no changelogs for pacman packages
if [ "$typ" != "pacman" ]; then
	CHANGELOG="--${typ}-changelog=${DIR}/${VERSION}/${DISTRO}/changelog"
fi

# arguments after the first three are deps
for i in "${@:4}"; do
	DEPS="$DEPS --depends $i"
done

# in case the `fpm` gem bin isn't in the $PATH
if command -v ruby >/dev/null && command -v gem >/dev/null && ! command -v fpm 2>/dev/null; then
	PATH="$(ruby -r rubygems -e 'puts Gem.user_dir')/bin:$PATH"
fi

# build the package
fpm \
	--log error \
	--name "$BINARY" \
	--version "$TAG" \
	--maintainer "$MAINTAINER" \
	--url "$URL" \
	--description "$DESCRIPTION" \
	--license "$LICENSE" \
	--input-type dir \
	--output-type "$typ" \
	--package "${DIR}/${VERSION}/${DISTRO}/${OUTPUT}" \
	${CHANGELOG} \
	${DEPS} \
	"misc/mgmt.service"="/usr/lib/systemd/system/mgmt.service" \
	"$BINARY"="$PREFIX/mgmt"
