chiark / gitweb /
devscripts (2.10.69+squeeze4) stable-security; urgency=high
[devscripts.git] / scripts / nmudiff.sh
1 #! /bin/bash -e
2 # Copyright 2006 by Steinar H. Gunderson
3
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of version 2 (only) of the GNU General Public License
6 # as published by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16 PROGNAME=`basename $0`
17 MODIFIED_CONF_MSG='Default settings modified by devscripts configuration files:'
18
19 usage () {
20     echo \
21 "Usage: $PROGNAME
22   Generate a diff for an NMU and mail it to the BTS.
23   $PROGNAME options:
24     --new             Submit a new bug report rather than sending messages
25                       to the fixed bugs (default if more than one bug being
26                       closed or no bugs being closed)
27     --old             Send reports to the bugs which are being closed rather
28                       than submit a new bug (default if only one bug being
29                       closed)
30     --sendmail=SENDMAILCMD
31                       Use SENDMAILCMD instead of \"/usr/sbin/sendmail -t\"
32     --mutt            Use mutt to mail the message (default)
33     --no-mutt         Mail the message directly, don't use mutt
34     --from=EMAIL      Use EMAIL address for message to BTS; defaults to
35                       value of DEBEMAIL or EMAIL
36     --delay=DELAY     Indicate that the NMU has been uploaded to the
37                       DELAYED queue, with a delay of DELAY days; defaults
38                       to a placeholder value of "XX". If DELAY is 0 then
39                       no reference is made to the DELAYED queue.
40     --no-delay        Equivalent to \"--delay=0\"
41     --no-conf, --noconf
42                       Don't read devscripts config files;
43                       must be the first option given
44     --help, -h        Show this help information.
45     --version         Show version and copyright information.
46
47 $MODIFIED_CONF_MSG"
48 }
49
50 version () {
51         cat <<EOF
52 This is $PROGNAME, from the Debian devscripts package, version ###VERSION###
53 This code is copyright 2006 by Steinar H. Gunderson, with modifications
54 copyright 2006 by Julian Gilbey <jdg@debian.org>.
55 The software may be freely redistributed under the terms and conditions
56 of the GNU General Public License, version 2.
57 EOF
58 }
59
60 # Boilerplate: set config variables
61 DEFAULT_NMUDIFF_DELAY="XX"
62 DEFAULT_NMUDIFF_MUTT="yes"
63 DEFAULT_NMUDIFF_NEWREPORT="maybe"
64 DEFAULT_BTS_SENDMAIL_COMMAND="/usr/sbin/sendmail"
65 VARS="NMUDIFF_DELAY NMUDIFF_MUTT NMUDIFF_NEWREPORT BTS_SENDMAIL_COMMAND"
66 # Don't think it's worth including this stuff
67 # DEFAULT_DEVSCRIPTS_CHECK_DIRNAME_LEVEL=1
68 # DEFAULT_DEVSCRIPTS_CHECK_DIRNAME_REGEX='PACKAGE(-.+)?'
69 # VARS="BTS_SENDMAIL_COMMAND DEVSCRIPTS_CHECK_DIRNAME_LEVEL DEVSCRIPTS_CHECK_DIRNAME_REGEX"
70
71 if [ "$1" = "--no-conf" -o "$1" = "--noconf" ]; then
72     shift
73     MODIFIED_CONF_MSG="$MODIFIED_CONF_MSG
74   (no configuration files read)"
75
76     # set defaults
77     for var in $VARS; do
78         eval "$var=\$DEFAULT_$var"
79     done
80 else
81     # Run in a subshell for protection against accidental errors
82     # in the config files
83     eval $(
84         set +e
85         for var in $VARS; do
86             eval "$var=\$DEFAULT_$var"
87         done
88
89         for file in /etc/devscripts.conf ~/.devscripts
90           do
91           [ -r $file ] && . $file
92         done
93
94         set | egrep '^(NMUDIFF|BTS|DEVSCRIPTS)_')
95
96     # check sanity
97     case "$BTS_SENDMAIL_COMMAND" in
98         "") BTS_SENDMAIL_COMMAND=/usr/sbin/sendmail ;;
99         *) ;;
100     esac
101     if [ "$NMUDIFF_DELAY" = "XX" ]; then
102         # Fine
103         :
104     else
105         if ! [ "$NMUDIFF_DELAY" -ge 0 ] 2>/dev/null; then
106             NMUDIFF_DELAY=XX
107         fi
108     fi
109     case "$NMUDIFF_MUTT" in
110         yes|no) ;;
111         *) NMUDIFF_MUTT=yes ;;
112     esac
113     case "$NMUDIFF_NEWREPORT" in
114         yes|no|maybe) ;;
115         *) NMUDIFF_NEWREPORT=maybe ;;
116     esac
117 #    case "$DEVSCRIPTS_CHECK_DIRNAME_LEVEL" in
118 #       0|1|2) ;;
119 #       *) DEVSCRIPTS_CHECK_DIRNAME_LEVEL=1 ;;
120 #    esac
121
122     # set config message
123     MODIFIED_CONF=''
124     for var in $VARS; do
125         eval "if [ \"\$$var\" != \"\$DEFAULT_$var\" ]; then
126             MODIFIED_CONF_MSG=\"\$MODIFIED_CONF_MSG
127   $var=\$$var\";
128         MODIFIED_CONF=yes;
129         fi"
130     done
131
132     if [ -z "$MODIFIED_CONF" ]; then
133         MODIFIED_CONF_MSG="$MODIFIED_CONF_MSG
134   (none)"
135     fi
136 fi
137
138 # # synonyms
139 # CHECK_DIRNAME_LEVEL="$DEVSCRIPTS_CHECK_DIRNAME_LEVEL"
140 # CHECK_DIRNAME_REGEX="$DEVSCRIPTS_CHECK_DIRNAME_REGEX"
141
142 # Need -o option to getopt or else it doesn't work
143 # Removed: --long check-dirname-level:,check-dirname-regex: \
144 TEMP=$(getopt -s bash -o "h" \
145         --long sendmail:,from:,new,old,mutt,no-mutt,nomutt \
146         --long delay:,no-delay,nodelay \
147         --long no-conf,noconf \
148         --long help,version -n "$PROGNAME" -- "$@")
149 if [ $? != 0 ] ; then exit 1 ; fi
150
151 eval set -- $TEMP
152
153 # Process Parameters
154 while [ "$1" ]; do
155     case $1 in
156 #     --check-dirname-level)
157 #       shift
158 #         case "$1" in
159 #       0|1|2) CHECK_DIRNAME_LEVEL=$1 ;;
160 #       *) echo "$PROGNAME: unrecognised --check-dirname-level value (allowed are 0,1,2)" >&2
161 #          exit 1 ;;
162 #         esac
163 #       ;;
164 #     --check-dirname-regex)
165 #       shift;  CHECK_DIRNAME_REGEX="$1" ;;
166     --delay)
167         shift
168         if [ "$1" = "XX" ]; then
169             # Fine
170             NMUDIFF_DELAY="$1"
171         else
172             if ! [ "$1" -ge 0 ] 2>/dev/null; then
173                 NMUDIFF_DELAY=XX
174             else
175                 NMUDIFF_DELAY="$1"
176             fi
177         fi
178         ;;
179     --nodelay|--no-delay)
180         NMUDIFF_DELAY=0 ;;
181     --mutt)
182         NMUDIFF_MUTT=yes ;;
183     --nomutt|--no-mutt)
184         NMUDIFF_MUTT=no ;;
185     --new)
186         NMUDIFF_NEWREPORT=yes ;;
187     --old)
188         NMUDIFF_NEWREPORT=no ;;
189     --sendmail)
190         shift
191         case "$1" in
192             "") echo "$PROGNAME: SENDMAIL command cannot be empty, using default" >&2
193                 ;;
194             *) BTS_SENDMAIL_COMMAND="$1" ;;
195         esac
196         ;;
197     --from)
198         shift
199         FROM="$1"
200         ;;
201     --no-conf|--noconf)
202         echo "$PROGNAME: $1 is only acceptable as the first command-line option!" >&2
203         exit 1 ;;
204     --help|-h) usage; exit 0 ;;
205     --version) version; exit 0 ;;
206     --) shift; break ;;
207     *) echo "$PROGNAME: bug in option parser, sorry!" >&2 ; exit 1 ;;
208     esac
209     shift
210 done
211
212 # Still going?
213 if [ $# -gt 0 ]; then
214     echo "$PROGNAME takes no non-option arguments;" >&2
215     echo "try $PROGNAME --help for usage information" >&2
216     exit 1
217 fi
218
219 if [ "$NMUDIFF_MUTT" = yes ] && ! command -v mutt > /dev/null 2>&1; then
220     echo "$PROGNAME: can't find mutt, falling back to sendmail instead" >&2
221     NMUDIFF_MUTT=no
222 fi
223
224 if [ "$NMUDIFF_MUTT" = no ]; then
225     if [ -z "$FROM" ]; then
226         : ${FROMNAME:="$DEBFULLNAME"}
227         : ${FROMNAME:="$NAME"}
228     fi
229     : ${FROM:="$DEBEMAIL"}
230     : ${FROM:="$EMAIL"}
231     if [ -z "$FROM" ]; then
232         echo "$PROGNAME: must set email address either with DEBEMAIL environment variable" >&2
233         echo "or EMAIL environment variable or using --from command line option." >&2
234         exit 1
235     fi
236     if [ -n "$FROMNAME" ]; then
237         # If $FROM looks like "Name <email@address>" then extract just the address
238         if [ "$FROM" = "$(echo "$FROM" | sed -ne '/^\(.*\) *<\(.*\)> *$/p')" ]; then
239             FROM="$(echo "$FROM" | sed -ne 's/^\(.*\) *<\(.*\)> *$/\2/p')"
240         fi
241         FROM="$FROMNAME <$FROM>"
242     fi
243 fi
244
245 if ! [ -f debian/changelog ]; then
246     echo "nmudiff: must be run from top of NMU build tree!" >&2
247     exit 1
248 fi
249
250 SOURCE=$( dpkg-parsechangelog | grep ^Source: | cut -d" " -f2 )
251 if [ -z "$SOURCE" ]; then
252     echo "nmudiff: could not determine source package name from changelog!" >&2
253     exit 1
254 fi
255
256 VERSION=$( dpkg-parsechangelog | grep ^Version: | cut -d" " -f2 )
257 if [ -z "$VERSION" ]; then
258     echo "nmudiff: could not determine source package version from changelog!" >&2
259     exit 1
260 fi
261
262 CLOSES=$( dpkg-parsechangelog | grep ^Closes: | cut -d" " -f2- )
263
264 if [ -z "$CLOSES" ]; then
265     # no bug reports, so make a new report in any event
266     NMUDIFF_NEWREPORT=yes
267 fi
268
269 if [ "$NMUDIFF_NEWREPORT" = "maybe" ]; then
270     if $(expr match "$CLOSES" ".* " > /dev/null); then
271         # multiple bug reports, so make a new report
272         NMUDIFF_NEWREPORT=yes
273     else
274         NMUDIFF_NEWREPORT=no
275     fi
276 fi
277
278 OLDVERSION=$( sed -n "s/^[^ .][^ ]* (\(.*\)).*$/\1/p" debian/changelog | \
279   head -2 | tail -1 )
280 if [ -z "$OLDVERSION" ]; then
281     echo "nmudiff: could not determine previous package version from changelog!" >&2
282     exit 1
283 fi
284
285 VERSION_NO_EPOCH=$( echo "$VERSION" | sed "s/^[0-9]\+://" )
286 OLDVERSION_NO_EPOCH=$( echo "$OLDVERSION" | sed "s/^[0-9]\+://" )
287
288 if [ ! -r ../${SOURCE}_${OLDVERSION_NO_EPOCH}.dsc ]; then
289     echo "nmudiff: could not read ../${SOURCE}_${OLDVERSION_NO_EPOCH}.dsc" >&2
290     exit 1
291 fi
292 if [ ! -r ../${SOURCE}_${VERSION_NO_EPOCH}.dsc ]; then
293     echo "nmudiff: could not read ../${SOURCE}_${VERSION_NO_EPOCH}.dsc" >&2
294     exit 1
295 fi
296
297 ret=0
298 debdiff ../${SOURCE}_${OLDVERSION_NO_EPOCH}.dsc \
299   ../${SOURCE}_${VERSION_NO_EPOCH}.dsc \
300   > ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff || ret=$?
301 if [ $ret -ne 0 ] && [ $ret -ne 1 ]; then
302     echo "nmudiff: debdiff failed, aborting." >&2
303     rm -f ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff
304     exit 1
305 fi
306
307 TO_ADDRESSES_SENDMAIL=""
308 TO_ADDRESSES_MUTT=""
309 BCC_ADDRESS_SENDMAIL=""
310 BCC_ADDRESS_MUTT=""
311 TAGS=""
312 if [ "$NMUDIFF_NEWREPORT" = "yes" ]; then
313     TO_ADDRESSES_SENDMAIL="submit@bugs.debian.org"
314     TO_ADDRESSES_MUTT="submit@bugs.debian.org"
315     TAGS="Package: $SOURCE
316 Version: $OLDVERSION
317 Severity: normal
318 Tags: patch pending"
319 else
320     for b in $CLOSES; do
321         TO_ADDRESSES_SENDMAIL="$TO_ADDRESSES_SENDMAIL,
322   $b@bugs.debian.org"
323         TO_ADDRESSES_MUTT="$TO_ADDRESSES_MUTT $b@bugs.debian.org"
324         if [ "`bts select bugs:$b tag:patch`" != "$b" ]; then
325             TAGS="$TAGS
326 tags $b + patch"
327         fi
328         if [ "$NMUDIFF_DELAY" != "0" ] && [ "`bts select bugs:$b tag:pending`" != "$b" ]; then
329             TAGS="$TAGS
330 tags $b + pending"
331         fi
332     done
333     TO_ADDRESSES_SENDMAIL=$(echo "$TO_ADDRESSES_SENDMAIL" | tail -n +2)
334     if [ "$TAGS" != "" ]; then
335         TAGS=$(echo "$TAGS" | tail -n +2)
336         TAGS="$TAGS
337 thanks"
338         BCC_ADDRESS_SENDMAIL="control@bugs.debian.org"
339         BCC_ADDRESS_MUTT="-b control@bugs.debian.org"
340     fi
341 fi
342
343 TMPNAM="$( tempfile )"
344
345 if [ "$NMUDIFF_DELAY" = "XX" ]; then
346     DELAY_HEADER="
347 [Replace XX with correct value]"
348 fi
349
350 if [ "$NMUDIFF_DELAY" = "0" ]; then
351     BODY="$(printf "%s\n%s\n" \
352 "I've prepared an NMU for $SOURCE (versioned as $VERSION). The diff" \
353 "is attached to this message.")"
354 else
355     BODY="$(printf "%s\n%s\n%s\n" \
356 "I've prepared an NMU for $SOURCE (versioned as $VERSION) and" \
357 "uploaded it to DELAYED/$NMUDIFF_DELAY. Please feel free to tell me if I" \
358 "should delay it longer.")"
359 fi
360
361 if [ "$NMUDIFF_MUTT" = no ]; then
362     cat <<EOF > "$TMPNAM"
363 From: $FROM
364 To: $TO_ADDRESSES_SENDMAIL
365 Cc: 
366 Bcc: $BCC_ADDRESS_SENDMAIL
367 Subject: $SOURCE: diff for NMU version $VERSION
368 Date: `date -R`
369 X-NMUDIFF-Version: ###VERSION###
370
371 $TAGS
372 $DELAY_HEADER
373 Dear maintainer,
374
375 $BODY
376
377 Regards.
378 EOF
379
380     cat ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff >> "$TMPNAM"
381     sensible-editor "$TMPNAM"
382     if [ $? -ne 0 ]; then
383         echo "nmudiff: sensible-editor exited with error, aborting." >&2
384         rm -f ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff "$TMPNAM"
385         exit 1
386     fi
387
388     while : ; do
389         echo -n "Do you want to go ahead and submit the bug report now? (y/n) "
390         read response
391         case "$response" in
392             y*) break;;
393             n*) echo "OK, then, aborting." >&2
394                 rm -f ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff "$TMPNAM"
395                 exit 1
396                 ;;
397         esac
398     done
399
400     case "$BTS_SENDMAIL_COMMAND" in
401         /usr/sbin/sendmail*|/usr/sbin/exim*)
402             BTS_SENDMAIL_COMMAND="$BTS_SENDMAIL_COMMAND -t" ;;
403         *)  ;;
404     esac
405
406     $BTS_SENDMAIL_COMMAND < "$TMPNAM"
407
408 else # NMUDIFF_MUTT=yes
409     cat <<EOF > "$TMPNAM"
410 $TAGS
411 $DELAY_HEADER
412 Dear maintainer,
413
414 $BODY
415
416 Regards.
417 EOF
418
419     mutt -s "$SOURCE: diff for NMU version $VERSION" -i "$TMPNAM" \
420         -e "my_hdr X-NMUDIFF-Version: ###VERSION###" \
421         -a ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff $BCC_ADDRESS_MUTT \
422         -- $TO_ADDRESSES_MUTT
423
424 fi
425
426 rm -f ../${SOURCE}-${VERSION_NO_EPOCH}-nmu.diff "$TMPNAM"