#!/bin/sh

# abump - bump pkgver in APKBUILDs
# Copyright (c) 2012 Natanael Copa <ncopa@alpinelinux.org>
#
# Distributed under GPL-2.0-only
#

program_version=3.15.0
sharedir=${ABUILD_SHAREDIR:-/usr/share/abuild}

if ! [ -f "$sharedir/functions.sh" ]; then
	echo "$sharedir/functions.sh: not found" >&2
	exit 1
fi
. "$sharedir/functions.sh"

: ${ABUILD:="abuild"}


# version bump packages
do_bump() {
	local p rc=0 notbumped="" name ver section message
	local upgrade="${cvelist:+security }upgrade"
	local a
	for p; do
		if [ $rc -gt 0 ]; then
			notbumped="$notbumped $p"
			continue
		fi
		name=${p%-[0-9]*}
		ver=${p#${name}-}
		if [ "$name" = "$ver" ]; then
			die "version missing for $p"
		fi

		(
		set -e

		# calculate APKBUILD's path    #vim syntax highlight '
		if [ "${name#*/}" != "$name" ] && ! [ -d "$APORTSDIR/${name%/*}" ]; then
			die "'$p' should be of form 'foo-1.2.3' or 'main/foo-1.2.3'"
		fi
		a=$(aports_buildscript "$name" ) \
			|| die "can't find APKBUILD for $name"

		# sourcing APKBUILDs should not affect the environment of abump
		# so do that in a subshell, along with any checks that need the
		# information from the APKBUILD.
		(
			# verify APKBUILD
			. "$a" || exit 1
			name=${name#*/}
			[ "$pkgname" = "$name" ] \
				|| die "APKBUILD has different \$pkgname for $name"
			type package | grep -q function \
				|| die "missing package() for $name"
			if [ "$pkgver" = "$ver" ] && git diff-index --quiet HEAD -- "$a"; then
				die "version is already $ver"
			fi
		)

		cd "${a%/*}"
		section=${PWD%/*}
		section=${section##*/}

		message="$section/$name: $upgrade to ${ver}${cvelist}"
		if [ -n "$fixes" ]; then
			message="$message

fixes #${fixes#\#}
"
		fi
		msg "$message"

		sed -i -e "s/^pkgver=[^ ]*/pkgver=$ver/" \
			-e "s/^pkgrel=[^ ]*/pkgrel=0/" \
			APKBUILD

		$ABUILD $abuild_opts checksum all
		checkapk

		git add APKBUILD
		git commit -m"$message"
		)
		rc=$?
		if [ $rc -gt 0 ]; then
			error "Failed to build $p"
		fi
	done
	if [ -n "$notbumped" ]; then
		error "Not bumped: $notbumped"
	fi
	return $rc
}

usage() {
	cat <<-__EOF__
		$program $program_version - bump pkgver in APKBUILDs
		Usage: $program [-s CVE-1,CVE-2,...] [-f ISSUE] [-b|--branch] [-k|--keep] PKGNAME-1.2.3 ...
		Options:
		  -s, --security CVE1,CVE-2,...  Security update
		  -f, --fixes ISSUE              Fixes ISSUE
		  -b, --branch                   Create a git branch from HEAD before normal operation
		  -k, --keep                     Run abuild with -k to keep existing packages
		  -q, --quiet
		  -h, --help                     Show this help

	__EOF__
}

keep=
cvelist=
fixes=
branch=

args=$(getopt -o f:s:bkqh --long fixes:,security:,branch,keep,quiet,help \
	-n "$program" -- "$@")
if [ $? -ne 0 ]; then
	usage >&2
	exit 2
fi
eval set -- "$args"
while true; do
	case $1 in
		-s|--security) cvelist=" ($2)"; shift;;
		-f|--fixes) fixes="$2"; shift;;
		-b|--branch) branch=1;;
		-k|--keep) keep="-k";;
		-q|--quiet) quiet=1;; # suppresses msg
		-h|--help) usage; exit 0;;
		--) shift; break;;
		*) exit 1;; # getopt error
	esac
	shift
done
if [ $# -eq 0 ]; then
	usage >&2
	exit 2
fi

[ -n "$APORTSDIR" ] || error "can't locate \$APORTSDIR"
git rev-parse 2>/dev/null || die "not in a git tree"
if [ "$branch" = 1 ]; then
	git checkout -b "bump-$1"
fi

abuild_opts="${ABUILD_OPTS- -r} $keep"

do_bump "$@"
