diff options
Diffstat (limited to 'debian/changelog.upstream.sh')
-rw-r--r-- | debian/changelog.upstream.sh | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/debian/changelog.upstream.sh b/debian/changelog.upstream.sh new file mode 100644 index 0000000..afaec0f --- /dev/null +++ b/debian/changelog.upstream.sh @@ -0,0 +1,133 @@ +#!/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 + + exec >> debian/changelog.upstream + if test "$new" = none + then + echo "Version $last:" + echo "Version $last:" | tr "[:print:]" - + limiter= + elif test "$new" = "$last" + then + return 0 + else + echo "Version $last; changes since $new:" + echo "Version $last; changes since $new:" | tr "[:print:]" - + limiter="$new_cid.." + fi + echo + git rev-list --no-merges "$limiter$last_cid" | + git diff-tree --date=iso --stat --format=medium --stdin + test "$new" = none || echo + + last=$new + last_cid=$new_cid +} + +dpkg-parsechangelog --format rfc822 --all | { +while read line +do + if version=$(version_line "$line") + then + # strip Debian revision + upstream_version=${version%-*} + + if 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 +} |