#!/bin/sh
# Generate debian/changelog.upstream from debian/changelog and
# the git revision log.  Inspired by Gerrit Pape’s
# debian/changelog.upstream.sh, from the git-core Debian package.

set -e

# If argument matches /^Version: /, output remaining text.
# Result is true if and only if argument matches.
version_line() {
	local line result
	line=$1
	result=${line#Version: }

	if test "$result" = "$line"
	then
		return 1
	else
		printf "%s\n" "$result"
		return 0
	fi
}

# If argument matches /^\* New.*snapshot.*commit /,
# output remaining text.
# Result is true if and only if argument matches.
commit_id_line() {
	local line result
	line=$1
	result=${line#\* New*snapshot*commit }

	if test "$result" = "$line"
	then
		return 1
	else
		printf "%s\n" "$result"
		return 0
	fi
}

# Read standard input, scanning for a changelog entry of the
# form “New snapshot, taken from upstream commit <blah>.”
# Output is <blah>.
# Fails and writes a message to standard error if no such entry is
# found before the next Version: line with a different upstream
# version (or EOF).
# $1 is the upstream version sought.
read_commit_id() {
	local upstream_version line version cid
	upstream_version=$1

	while read line
	do
		if
			version=$(version_line "$line") &&
			test "${version%-*}" != "$upstream_version"
		then
			break
		fi

		if cid=$(commit_id_line "$line")
		then
			printf "%s\n" "${cid%.}"
			return 0
		fi
	done

	echo >&2 "No commit id for $upstream_version"
	return 1
}

last=none
last_cid=none
# Add a list of all revisions up to $last to debian/changelog.upstream
# and set last=$2.
# $1 is a user-readable name for the commit $2
add_version() {
	local new new_cid limiter
	new=$1
	new_cid=$2

	if test "$last" = none
	then
		: > debian/changelog.upstream+
		last=$new
		last_cid=$new_cid
		return 0
	fi

	if test "$new" = "$last"
	then
		return 0
	fi

	exec >> debian/changelog.upstream+

	if test "$new" = none
	then
		# pre-history
		git show radeontool-1.6.0:CHANGES
	else
		echo "Version $last"
		echo "Version $last" | tr "[:print:]" -
		echo

		if test "$new" = 1.5
		then
			# beginning of tracked history
			git shortlog --no-merges "$last_cid"
		else
			git shortlog --no-merges "$new_cid".."$last_cid"
		fi
		echo
	fi

	last=$new
	last_cid=$new_cid
}

v="radeontool-"
dpkg-parsechangelog --format rfc822 --all | {
while read line
do
	if version=$(version_line "$line")
	then
		# strip Debian revision
		upstream_version=${version%-*}

		if test "$upstream_version" = "1.5"
		then
			# pre-history
			add_version "$upstream_version" "untracked"
		elif git rev-parse --verify -q "$v$upstream_version" > /dev/null
		then
			# upstream release
			add_version "$upstream_version" "$v$upstream_version"
		else
			# snapshot
			cid=$(read_commit_id "$upstream_version") || exit 1
			add_version "$upstream_version" "$cid"
		fi
	fi
done
add_version none none
}
mv -f debian/changelog.upstream+ debian/changelog.upstream
