summaryrefslogtreecommitdiffstats
path: root/scripts/nmudiff.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/nmudiff.sh')
-rwxr-xr-xscripts/nmudiff.sh464
1 files changed, 464 insertions, 0 deletions
diff --git a/scripts/nmudiff.sh b/scripts/nmudiff.sh
new file mode 100755
index 0000000..7b53777
--- /dev/null
+++ b/scripts/nmudiff.sh
@@ -0,0 +1,464 @@
+#!/bin/bash
+# Copyright 2006 by Steinar H. Gunderson
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of version 2 (only) of the GNU General Public License
+# as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+set -e
+
+PROGNAME=${0##*/}
+MODIFIED_CONF_MSG='Default settings modified by devscripts configuration files:'
+
+usage() {
+ echo \
+"Usage: $PROGNAME
+ Generate a diff for an NMU and mail it to the BTS.
+ $PROGNAME options:
+ --new Submit a new bug report rather than sending messages
+ to the fixed bugs (default if more than one bug being
+ closed or no bugs being closed)
+ --old Send reports to the bugs which are being closed rather
+ than submit a new bug (default if only one bug being
+ closed)
+ --sendmail=SENDMAILCMD
+ Use SENDMAILCMD instead of \"/usr/sbin/sendmail -t\"
+ --mutt Use mutt to mail the message (default)
+ --no-mutt Mail the message directly, don't use mutt
+ --from=EMAIL Use EMAIL address for message to BTS; defaults to
+ value of DEBEMAIL or EMAIL
+ --delay=DELAY Indicate that the NMU has been uploaded to the
+ DELAYED queue, with a delay of DELAY days; defaults
+ to a placeholder value of "XX". If DELAY is 0 then
+ no reference is made to the DELAYED queue.
+ --no-delay Equivalent to \"--delay=0\"
+ --no-conf, --noconf
+ Don't read devscripts config files;
+ must be the first option given
+ --no-pending, --nopending
+ Don't add the 'pending' tag
+ --non-dd, --nondd
+ Mention in the email that you require sponsorship.
+ --template=TEMPLATEFILE
+ Use content of TEMPLATEFILE for message.
+ --help, -h Show this help information.
+ --version Show version and copyright information.
+
+$MODIFIED_CONF_MSG"
+}
+
+version() {
+ cat <<EOF
+This is $PROGNAME, from the Debian devscripts package, version ###VERSION###
+This code is copyright 2006 by Steinar H. Gunderson, with modifications
+copyright 2006 by Julian Gilbey <jdg@debian.org>.
+The software may be freely redistributed under the terms and conditions
+of the GNU General Public License, version 2.
+EOF
+}
+
+# Boilerplate: set config variables
+DEFAULT_NMUDIFF_DELAY="XX"
+DEFAULT_NMUDIFF_MUTT="yes"
+DEFAULT_NMUDIFF_NEWREPORT="maybe"
+DEFAULT_BTS_SENDMAIL_COMMAND="/usr/sbin/sendmail"
+DEFAULT_NMUDIFF_PENDING=" pending"
+DEFAULT_MUTT_PRG="mutt"
+VARS="NMUDIFF_DELAY NMUDIFF_MUTT NMUDIFF_NEWREPORT BTS_SENDMAIL_COMMAND NMUDIFF_PENDING MUTT_PRG"
+# Don't think it's worth including this stuff
+# DEFAULT_DEVSCRIPTS_CHECK_DIRNAME_LEVEL=1
+# DEFAULT_DEVSCRIPTS_CHECK_DIRNAME_REGEX='PACKAGE(-.+)?'
+# VARS="BTS_SENDMAIL_COMMAND DEVSCRIPTS_CHECK_DIRNAME_LEVEL DEVSCRIPTS_CHECK_DIRNAME_REGEX"
+
+if [ "$1" = "--no-conf" -o "$1" = "--noconf" ]; then
+ shift
+ MODIFIED_CONF_MSG="$MODIFIED_CONF_MSG
+ (no configuration files read)"
+
+ # set defaults
+ for var in $VARS; do
+ eval "$var=\$DEFAULT_$var"
+ done
+else
+ # Run in a subshell for protection against accidental errors
+ # in the config files
+ eval $(
+ set +e
+ for var in $VARS; do
+ eval "$var=\$DEFAULT_$var"
+ done
+
+ for file in /etc/devscripts.conf ~/.devscripts
+ do
+ [ -r $file ] && . $file
+ done
+
+ set | grep -E '^(NMUDIFF|BTS|DEVSCRIPTS)_')
+
+ # check sanity
+ case "$BTS_SENDMAIL_COMMAND" in
+ "") BTS_SENDMAIL_COMMAND=/usr/sbin/sendmail ;;
+ *) ;;
+ esac
+ if [ "$NMUDIFF_DELAY" = "XX" ]; then
+ # Fine
+ :
+ else
+ if ! [ "$NMUDIFF_DELAY" -ge 0 ] 2>/dev/null; then
+ NMUDIFF_DELAY=XX
+ fi
+ fi
+ case "$NMUDIFF_MUTT" in
+ yes|no) ;;
+ *) NMUDIFF_MUTT=yes ;;
+ esac
+ case "$NMUDIFF_NEWREPORT" in
+ yes|no|maybe) ;;
+ *) NMUDIFF_NEWREPORT=maybe ;;
+ esac
+# case "$DEVSCRIPTS_CHECK_DIRNAME_LEVEL" in
+# 0|1|2) ;;
+# *) DEVSCRIPTS_CHECK_DIRNAME_LEVEL=1 ;;
+# esac
+
+ # set config message
+ MODIFIED_CONF=''
+ for var in $VARS; do
+ eval "if [ \"\$$var\" != \"\$DEFAULT_$var\" ]; then
+ MODIFIED_CONF_MSG=\"\$MODIFIED_CONF_MSG
+ $var=\$$var\";
+ MODIFIED_CONF=yes;
+ fi"
+ done
+
+ if [ -z "$MODIFIED_CONF" ]; then
+ MODIFIED_CONF_MSG="$MODIFIED_CONF_MSG
+ (none)"
+ fi
+fi
+
+# # synonyms
+# CHECK_DIRNAME_LEVEL="$DEVSCRIPTS_CHECK_DIRNAME_LEVEL"
+# CHECK_DIRNAME_REGEX="$DEVSCRIPTS_CHECK_DIRNAME_REGEX"
+
+# Need -o option to getopt or else it doesn't work
+# Removed: --long check-dirname-level:,check-dirname-regex: \
+TEMP=$(getopt -s bash -o "h" \
+ --long sendmail:,from:,new,old,mutt,no-mutt,nomutt \
+ --long delay:,no-delay,nodelay \
+ --long no-conf,noconf \
+ --long no-pending,nopending \
+ --long non-dd,nondd \
+ --long template: \
+ --long help,version -n "$PROGNAME" -- "$@") || (usage >&2; exit 1)
+
+eval set -- $TEMP
+
+# Process Parameters
+while [ "$1" ]; do
+ case $1 in
+# --check-dirname-level)
+# shift
+# case "$1" in
+# 0|1|2) CHECK_DIRNAME_LEVEL=$1 ;;
+# *) echo "$PROGNAME: unrecognised --check-dirname-level value (allowed are 0,1,2)" >&2
+# exit 1 ;;
+# esac
+# ;;
+# --check-dirname-regex)
+# shift; CHECK_DIRNAME_REGEX="$1" ;;
+ --delay)
+ shift
+ if [ "$1" = "XX" ]; then
+ # Fine
+ NMUDIFF_DELAY="$1"
+ else
+ if ! [ "$1" -ge 0 ] 2>/dev/null; then
+ NMUDIFF_DELAY=XX
+ else
+ NMUDIFF_DELAY="$1"
+ fi
+ fi
+ ;;
+ --nodelay|--no-delay)
+ NMUDIFF_DELAY=0 ;;
+ --nopending|--no-pending)
+ NMUDIFF_PENDING="" ;;
+ --nondd|--non-dd)
+ NMUDIFF_NONDD=yes ;;
+ --mutt)
+ NMUDIFF_MUTT=yes ;;
+ --nomutt|--no-mutt)
+ NMUDIFF_MUTT=no ;;
+ --new)
+ NMUDIFF_NEWREPORT=yes ;;
+ --old)
+ NMUDIFF_NEWREPORT=no ;;
+ --sendmail)
+ shift
+ case "$1" in
+ "") echo "$PROGNAME: SENDMAIL command cannot be empty, using default" >&2
+ ;;
+ *) BTS_SENDMAIL_COMMAND="$1" ;;
+ esac
+ ;;
+ --from)
+ shift
+ FROM="$1"
+ ;;
+ --no-conf|--noconf)
+ echo "$PROGNAME: $1 is only acceptable as the first command-line option!" >&2
+ exit 1 ;;
+ --template)
+ shift
+ case "$1" in
+ "") echo "$PROGNAME: TEMPLATEFILE cannot be empty, using default" >&2
+ ;;
+ *) if [ -f "$1" ]; then
+ NMUDIFF_TEMPLATE="$1"
+ else
+ echo "$PROGNAME: TEMPLATEFILE must exist, using default" >&2
+ fi
+ ;;
+ esac
+ ;;
+ --help|-h) usage; exit 0 ;;
+ --version) version; exit 0 ;;
+ --) shift; break ;;
+ *) echo "$PROGNAME: bug in option parser, sorry!" >&2 ; exit 1 ;;
+ esac
+ shift
+done
+
+# Still going?
+if [ $# -gt 0 ]; then
+ echo "$PROGNAME takes no non-option arguments;" >&2
+ echo "try $PROGNAME --help for usage information" >&2
+ exit 1
+fi
+
+if [ "$NMUDIFF_MUTT" = yes ]; then
+ if command -v mutt > /dev/null; then
+ MUTT_PRG=mutt
+ elif command -v neomutt > /dev/null; then
+ MUTT_PRG=neomutt
+ else
+ echo "$PROGNAME: can't find mutt, falling back to sendmail instead" >&2
+ NMUDIFF_MUTT=no
+ fi
+fi
+
+if [ "$NMUDIFF_MUTT" = no ]; then
+ if [ -z "$FROM" ]; then
+ : ${FROMNAME:="$DEBFULLNAME"}
+ : ${FROMNAME:="$NAME"}
+ fi
+ : ${FROM:="$DEBEMAIL"}
+ : ${FROM:="$EMAIL"}
+ if [ -z "$FROM" ]; then
+ echo "$PROGNAME: must set email address either with DEBEMAIL environment variable" >&2
+ echo "or EMAIL environment variable or using --from command line option." >&2
+ exit 1
+ fi
+ if [ -n "$FROMNAME" ]; then
+ # If $FROM looks like "Name <email@address>" then extract just the address
+ if [ "$FROM" = "$(echo "$FROM" | sed -ne '/^\(.*\) *<\(.*\)> *$/p')" ]; then
+ FROM="$(echo "$FROM" | sed -ne 's/^\(.*\) *<\(.*\)> *$/\2/p')"
+ fi
+ FROM="$FROMNAME <$FROM>"
+ fi
+fi
+
+if ! [ -f debian/changelog ]; then
+ echo "nmudiff: must be run from top of NMU build tree!" >&2
+ exit 1
+fi
+
+SOURCE=$(dpkg-parsechangelog -SSource)
+if [ -z "$SOURCE" ]; then
+ echo "nmudiff: could not determine source package name from changelog!" >&2
+ exit 1
+fi
+
+VERSION=$(dpkg-parsechangelog -SVersion)
+if [ -z "$VERSION" ]; then
+ echo "nmudiff: could not determine source package version from changelog!" >&2
+ exit 1
+fi
+
+CLOSES=$(dpkg-parsechangelog -SCloses)
+
+if [ -z "$CLOSES" ]; then
+ # no bug reports, so make a new report in any event
+ NMUDIFF_NEWREPORT=yes
+fi
+
+if [ "$NMUDIFF_NEWREPORT" = "maybe" ]; then
+ if $(expr match "$CLOSES" ".* " > /dev/null); then
+ # multiple bug reports, so make a new report
+ NMUDIFF_NEWREPORT=yes
+ else
+ NMUDIFF_NEWREPORT=no
+ fi
+fi
+
+OLDVERSION=$(dpkg-parsechangelog -o1 -c1 -SVersion)
+if [ -z "$OLDVERSION" ]; then
+ echo "nmudiff: could not determine previous package version from changelog!" >&2
+ exit 1
+fi
+
+VERSION_NO_EPOCH=$(echo "$VERSION" | sed "s/^[0-9]\+://")
+OLDVERSION_NO_EPOCH=$(echo "$OLDVERSION" | sed "s/^[0-9]\+://")
+
+if [ ! -r ../${SOURCE}_${OLDVERSION_NO_EPOCH}.dsc ]; then
+ echo "nmudiff: could not read ../${SOURCE}_${OLDVERSION_NO_EPOCH}.dsc" >&2
+ exit 1
+fi
+if [ ! -r ../${SOURCE}_${VERSION_NO_EPOCH}.dsc ]; then
+ echo "nmudiff: could not read ../${SOURCE}_${VERSION_NO_EPOCH}.dsc" >&2
+ exit 1
+fi
+
+ret=0
+debdiff ../${SOURCE}_${OLDVERSION_NO_EPOCH}.dsc \
+ ../${SOURCE}_${VERSION_NO_EPOCH}.dsc \
+ > ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff || ret=$?
+if [ $ret -ne 0 ] && [ $ret -ne 1 ]; then
+ echo "nmudiff: debdiff failed, aborting." >&2
+ rm -f ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff
+ exit 1
+fi
+
+TO_ADDRESSES_SENDMAIL=""
+TO_ADDRESSES_MUTT=""
+BCC_ADDRESS_SENDMAIL=""
+BCC_ADDRESS_MUTT=""
+TAGS=""
+if [ "$NMUDIFF_NEWREPORT" = "yes" ]; then
+ TO_ADDRESSES_SENDMAIL="submit@bugs.debian.org"
+ TO_ADDRESSES_MUTT="submit@bugs.debian.org"
+ TAGS="Package: $SOURCE
+Version: $OLDVERSION
+Severity: normal
+Tags: patch ${NMUDIFF_PENDING}"
+else
+ for b in $CLOSES; do
+ TO_ADDRESSES_SENDMAIL="$TO_ADDRESSES_SENDMAIL,
+ $b@bugs.debian.org"
+ TO_ADDRESSES_MUTT="$TO_ADDRESSES_MUTT $b@bugs.debian.org"
+ if [ "$(bts select bugs:$b tag:patch)" != "$b" ]; then
+ TAGS="$TAGS
+Control: tags $b + patch"
+ fi
+ if [ "$NMUDIFF_DELAY" != "0" ] && [ "$(bts select bugs:$b tag:pending)" != "$b" ] && [ $NMUDIFF_PENDING ]; then
+ TAGS="$TAGS
+Control: tags $b + pending"
+ fi
+ done
+ TO_ADDRESSES_SENDMAIL=$(echo "$TO_ADDRESSES_SENDMAIL" | tail -n +2)
+ if [ "$TAGS" != "" ]; then
+ TAGS=$(echo "$TAGS" | tail -n +2)
+ fi
+fi
+
+TMPNAM="$(mktemp -t "$(basename "$1").XXXXXXXXX")"
+
+if [ "$NMUDIFF_DELAY" = "XX" ] && [ "$NMUDIFF_TEMPLATE" = "" ] && [ "$NMUDIFF_NONDD" != "yes" ]; then
+ DELAY_HEADER="
+[Replace XX with correct value]"
+fi
+
+if [ "$NMUDIFF_TEMPLATE" != "" ]; then
+ BODY=$(cat "$NMUDIFF_TEMPLATE")
+elif [ "$NMUDIFF_NONDD" = "yes" ]; then
+ BODY="$(printf "%s\n\n%s\n%s\n\n%s\n\n%s" \
+"Dear maintainer," \
+"I've prepared an NMU for $SOURCE (versioned as $VERSION). The diff" \
+"is attached to this message." \
+"I require a sponsor to have it uploaded." \
+"Regards.")"
+elif [ "$NMUDIFF_DELAY" = "0" ]; then
+ BODY="$(printf "%s\n\n%s\n%s\n\n%s" \
+"Dear maintainer," \
+"I've prepared an NMU for $SOURCE (versioned as $VERSION). The diff" \
+"is attached to this message." \
+"Regards.")"
+else
+ BODY="$(printf "%s\n\n%s\n%s\n%s\n\n%s" \
+"Dear maintainer," \
+"I've prepared an NMU for $SOURCE (versioned as $VERSION) and" \
+"uploaded it to DELAYED/$NMUDIFF_DELAY. Please feel free to tell me if I" \
+"should delay it longer." \
+"Regards.")"
+fi
+
+if [ "$NMUDIFF_MUTT" = no ]; then
+ cat <<EOF > "$TMPNAM"
+From: $FROM
+To: $TO_ADDRESSES_SENDMAIL
+Cc:
+Bcc: $BCC_ADDRESS_SENDMAIL
+Subject: $SOURCE: diff for NMU version $VERSION
+Date: $(date -R)
+X-NMUDIFF-Version: ###VERSION###
+
+$TAGS
+$DELAY_HEADER
+
+$BODY
+
+EOF
+
+ cat ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff >> "$TMPNAM"
+ sensible-editor "$TMPNAM"
+ if [ $? -ne 0 ]; then
+ echo "nmudiff: sensible-editor exited with error, aborting." >&2
+ rm -f ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff "$TMPNAM"
+ exit 1
+ fi
+
+ while : ; do
+ echo -n "Do you want to go ahead and submit the bug report now? (y/n) "
+ read response
+ case "$response" in
+ y*) break;;
+ n*) echo "OK, then, aborting." >&2
+ rm -f ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff "$TMPNAM"
+ exit 1
+ ;;
+ esac
+ done
+
+ case "$BTS_SENDMAIL_COMMAND" in
+ /usr/sbin/sendmail*|/usr/sbin/exim*)
+ BTS_SENDMAIL_COMMAND="$BTS_SENDMAIL_COMMAND -t" ;;
+ *) ;;
+ esac
+
+ $BTS_SENDMAIL_COMMAND < "$TMPNAM"
+
+else # NMUDIFF_MUTT=yes
+ cat <<EOF > "$TMPNAM"
+$TAGS
+$DELAY_HEADER
+
+$BODY
+
+EOF
+
+ $MUTT_PRG -s "$SOURCE: diff for NMU version $VERSION" -i "$TMPNAM" \
+ -e "my_hdr X-NMUDIFF-Version: ###VERSION###" \
+ -a ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff $BCC_ADDRESS_MUTT \
+ -- $TO_ADDRESSES_MUTT
+
+fi
+
+rm -f ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff "$TMPNAM"