1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 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
}
|