]> git.ipfire.org Git - thirdparty/bash.git/blame - support/bashbug.sh.in
bash-5.2 distribution sources and documentation
[thirdparty/bash.git] / support / bashbug.sh.in
CommitLineData
d233b485
CR
1#!/bin/sh -
2#
3# bashbug - create a bug report and mail it to the bug address
4#
5# The bug address depends on the release status of the shell. Versions
6# with status `devel', `alpha', `beta', or `rc' mail bug reports to
74091dd4 7# chet.ramey@case.edu and, optionally, to bash-testers@cwru.edu.
d233b485
CR
8# Other versions send mail to bug-bash@gnu.org.
9#
74091dd4 10# Copyright (C) 1996-2021 Free Software Foundation, Inc.
d233b485
CR
11#
12# This program is free software: you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation, either version 3 of the License, or
15# (at your option) any later version.
16#
17# This program is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20# GNU General Public License for more details.
21#
22# You should have received a copy of the GNU General Public License
23# along with this program. If not, see <http://www.gnu.org/licenses/>.
24
25#
26# configuration section:
27# these variables are filled in by the make target in Makefile
28#
29MACHINE="@host_cpu@"
30OS="@host_os@"
31CC="@CC@"
32CFLAGS="@CFLAGS@"
33RELEASE="@BASHVERS@"
34PATCHLEVEL="!PATCHLEVEL!"
35RELSTATUS="@RELSTATUS@"
36MACHTYPE="@host@"
37
38PATH=/bin:/usr/bin:/usr/local/bin:$PATH
39export PATH
40
41# Check if TMPDIR is set, default to /tmp
42: ${TMPDIR:=/tmp}
43
44#Securely create a temporary directory for the temporary files
45TEMPDIR=$TMPDIR/bbug.$$
8868edaf 46(umask 077 && mkdir "$TEMPDIR") || {
d233b485
CR
47 echo "$0: could not create temporary directory" >&2
48 exit 1
49}
50
51TEMPFILE1=$TEMPDIR/bbug1
52TEMPFILE2=$TEMPDIR/bbug2
53
54USAGE="Usage: $0 [--help] [--version] [bug-report-email-address]"
55VERSTR="GNU bashbug, version ${RELEASE}.${PATCHLEVEL}-${RELSTATUS}"
56
57do_help= do_version=
58
59while [ $# -gt 0 ]; do
60 case "$1" in
61 --help) shift ; do_help=y ;;
62 --version) shift ; do_version=y ;;
63 --) shift ; break ;;
64 -*) echo "bashbug: ${1}: invalid option" >&2
65 echo "$USAGE" >&2
66 exit 2 ;;
67 *) break ;;
68 esac
69done
70
71if [ -n "$do_version" ]; then
72 echo "${VERSTR}"
73 exit 0
74fi
75
76if [ -n "$do_help" ]; then
77 echo "${VERSTR}"
78 echo "${USAGE}"
79 echo
80 cat << HERE_EOF
81Bashbug is used to send mail to the Bash maintainers
82for when Bash doesn't behave like you'd like, or expect.
83
84Bashbug will start up your editor (as defined by the shell's
85EDITOR environment variable) with a preformatted bug report
86template for you to fill in. The report will be mailed to the
87bug-bash mailing list by default. See the manual for details.
88
89If you invoke bashbug by accident, just quit your editor without
90saving any changes to the template, and no bug report will be sent.
91HERE_EOF
92 exit 0
93fi
94
95# Figure out how to echo a string without a trailing newline
96N=`echo 'hi there\c'`
97case "$N" in
98*c) n=-n c= ;;
99*) n= c='\c' ;;
100esac
101
102BASHTESTERS="bash-testers@cwru.edu"
103
104case "$RELSTATUS" in
74091dd4 105alpha*|beta*|devel*|rc*) BUGBASH=chet.ramey@case.edu ;;
d233b485
CR
106*) BUGBASH=bug-bash@gnu.org ;;
107esac
108
109case "$RELSTATUS" in
110alpha*|beta*|devel*|rc*)
111 echo "$0: This is a testing release. Would you like your bug report"
112 echo "$0: to be sent to the bash-testers mailing list?"
113 echo $n "$0: Send to bash-testers? $c"
114 read ans
115 case "$ans" in
116 y*|Y*) BUGBASH="${BUGBASH},${BASHTESTERS}" ;;
117 esac ;;
118esac
119
120BUGADDR="${1-$BUGBASH}"
121
122if [ -z "$DEFEDITOR" ] && [ -z "$EDITOR" ]; then
123 if [ -x /usr/bin/editor ]; then
124 DEFEDITOR=editor
125 elif [ -x /usr/local/bin/ce ]; then
126 DEFEDITOR=ce
127 elif [ -x /usr/local/bin/emacs ]; then
128 DEFEDITOR=emacs
129 elif [ -x /usr/contrib/bin/emacs ]; then
130 DEFEDITOR=emacs
131 elif [ -x /usr/bin/emacs ]; then
132 DEFEDITOR=emacs
133 elif [ -x /usr/bin/xemacs ]; then
134 DEFEDITOR=xemacs
74091dd4
CR
135 elif [ -x /usr/bin/vim; then
136 DEFEDITOR=vim
137 elif [ -x /usr/bin/gvim; then
138 DEFEDITOR=gvim
8868edaf
CR
139 elif [ -x /usr/bin/nano ]; then
140 DEFEDITOR=nano
d233b485
CR
141 elif [ -x /usr/contrib/bin/jove ]; then
142 DEFEDITOR=jove
143 elif [ -x /usr/local/bin/jove ]; then
144 DEFEDITOR=jove
145 elif [ -x /usr/bin/vi ]; then
146 DEFEDITOR=vi
147 else
148 echo "$0: No default editor found: attempting to use vi" >&2
149 DEFEDITOR=vi
150 fi
151fi
152
153
154: ${EDITOR=$DEFEDITOR}
155
156: ${USER=${LOGNAME-`whoami`}}
157
158trap 'rm -rf "$TEMPDIR"; exit 1' 1 2 3 13 15
159trap 'rm -rf "$TEMPDIR"' 0
160
161UN=
162if (uname) >/dev/null 2>&1; then
163 UN=`uname -a`
164fi
165
166if [ -f /usr/lib/sendmail ] ; then
167 RMAIL="/usr/lib/sendmail"
168 SMARGS="-i -t"
169elif [ -f /usr/sbin/sendmail ] ; then
170 RMAIL="/usr/sbin/sendmail"
171 SMARGS="-i -t"
172else
173 RMAIL=rmail
174 SMARGS="$BUGADDR"
175fi
176
177INITIAL_SUBJECT='[50 character or so descriptive subject here (for reference)]'
178
179cat > "$TEMPFILE1" <<EOF
180From: ${USER}
181To: ${BUGADDR}
182Subject: ${INITIAL_SUBJECT}
183
184Configuration Information [Automatically generated, do not change]:
185Machine: $MACHINE
186OS: $OS
187Compiler: $CC
188Compilation CFLAGS: $CFLAGS
189uname output: $UN
190Machine Type: $MACHTYPE
191
192Bash Version: $RELEASE
193Patch Level: $PATCHLEVEL
194Release Status: $RELSTATUS
195
196Description:
197 [Detailed description of the problem, suggestion, or complaint.]
198
199Repeat-By:
200 [Describe the sequence of events that causes the problem
201 to occur.]
202
203Fix:
204 [Description of how to fix the problem. If you don't know a
205 fix for the problem, don't include this section.]
206EOF
207
208cp "$TEMPFILE1" "$TEMPFILE2"
209chmod u+w "$TEMPFILE1"
210
211trap '' 2 # ignore interrupts while in editor
212
213edstat=1
214while [ $edstat -ne 0 ]; do
215 $EDITOR "$TEMPFILE1"
216 edstat=$?
217
218 if [ $edstat -ne 0 ]; then
219 echo "$0: editor \`$EDITOR' exited with nonzero status."
220 echo "$0: Perhaps it was interrupted."
221 echo "$0: Type \`y' to give up, and lose your bug report;"
222 echo "$0: type \`n' to re-enter the editor."
223 echo $n "$0: Do you want to give up? $c"
224
225 read ans
226 case "$ans" in
227 [Yy]*) exit 1 ;;
228 esac
229
230 continue
231 fi
232
233 # find the subject from the temp file and see if it's been changed
234 CURR_SUB=`grep '^Subject: ' "$TEMPFILE1" | sed 's|^Subject:[ ]*||' | sed 1q`
235
236 case "$CURR_SUB" in
237 "${INITIAL_SUBJECT}")
238 echo
239 echo "$0: You have not changed the subject from the default."
240 echo "$0: Please use a more descriptive subject header."
241 echo "$0: Type \`y' to give up, and lose your bug report;"
242 echo "$0: type \`n' to re-enter the editor."
243 echo $n "$0: Do you want to give up? $c"
244
245 read ans
246 case "$ans" in
247 [Yy]*) exit 1 ;;
248 esac
249
250 echo "$0: The editor will be restarted in five seconds."
251 sleep 5
252 edstat=1
253 ;;
254 esac
255
256done
257
258trap 'rm -rf "$TEMPDIR"; exit 1' 2 # restore trap on SIGINT
259
260if cmp -s "$TEMPFILE1" "$TEMPFILE2"
261then
262 echo "File not changed, no bug report submitted."
263 exit
264fi
265
266echo $n "Send bug report to ${BUGADDR}? [y/n] $c"
267read ans
268case "$ans" in
269[Nn]*) exit 0 ;;
270esac
271
272${RMAIL} $SMARGS < "$TEMPFILE1" || {
273 cat "$TEMPFILE1" >> $HOME/dead.bashbug
274 echo "$0: mail to ${BUGADDR} failed: report saved in $HOME/dead.bashbug" >&2
275 echo "$0: please send it manually to ${BUGADDR}" >&2
276}
277
278exit 0