Send-pr, so people can send us bug reports.
This commit is contained in:
parent
acc61782fb
commit
9b6021c69f
339
gnu/usr.bin/send-pr/COPYING
Normal file
339
gnu/usr.bin/send-pr/COPYING
Normal file
@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
675 Mass Ave, Cambridge, MA 02139, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
he GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) 19yy <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
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, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
42
gnu/usr.bin/send-pr/Makefile
Normal file
42
gnu/usr.bin/send-pr/Makefile
Normal file
@ -0,0 +1,42 @@
|
||||
#
|
||||
# Makefile for building a standalone send-pr.
|
||||
#
|
||||
|
||||
VERSION=3.01.6
|
||||
RELEASE=NetBSD-current
|
||||
GNATS_HOST=sun-lamp
|
||||
|
||||
BINDIR= /usr/bin
|
||||
LIBDIR= /usr/lib
|
||||
|
||||
NOPROG=
|
||||
MAN1= send-pr.0
|
||||
|
||||
CLEANFILES= send-pr install-sid
|
||||
|
||||
all: send-pr install-sid send-pr.1
|
||||
|
||||
send-pr: send-pr.sh
|
||||
sed -e 's/@VERSION@/$(VERSION)/g' \
|
||||
-e 's/@DEFAULT_RELEASE@/$(RELEASE)/g' \
|
||||
${.CURDIR}/send-pr.sh > send-pr
|
||||
|
||||
send-pr.1: send-pr.man
|
||||
sed -e 's/@VERSION@/$((VERSION)/g' \
|
||||
${.CURDIR}/send-pr.man > send-pr.1
|
||||
|
||||
install-sid: install-sid.sh
|
||||
sed -e 's/@VERSION@/$(VERSION)/g' \
|
||||
${.CURDIR}/install-sid.sh > install-sid
|
||||
|
||||
beforeinstall:
|
||||
install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} send-pr \
|
||||
${DESTDIR}${BINDIR}
|
||||
install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} install-sid \
|
||||
${DESTDIR}${BINDIR}
|
||||
|
||||
install -d -o root -g wheel -m 755 ${DESTDIR}${LIBDIR}/gnats
|
||||
install -o ${BINOWN} -g ${BINGRP} -m 444 categories \
|
||||
${DESTDIR}${LIBDIR}/gnats/${GNATS_HOST}
|
||||
|
||||
.include <bsd.prog.mk>
|
4
gnu/usr.bin/send-pr/categories
Normal file
4
gnu/usr.bin/send-pr/categories
Normal file
@ -0,0 +1,4 @@
|
||||
kern
|
||||
lib
|
||||
bin
|
||||
misc
|
82
gnu/usr.bin/send-pr/install-sid.sh
Normal file
82
gnu/usr.bin/send-pr/install-sid.sh
Normal file
@ -0,0 +1,82 @@
|
||||
#!/bin/sh
|
||||
# Drop in the SUBMITTER id into a site's installed send-pr script.
|
||||
# Copyright (C) 1993 Free Software Foundation, Inc.
|
||||
# Contributed by Brendan Kehoe (brendan@cygnus.com), based on a
|
||||
# version written by Heinz G. Seidl (hgs@ide.com).
|
||||
#
|
||||
# This file is part of GNU GNATS.
|
||||
#
|
||||
# GNU GNATS is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU GNATS 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 GNU GNATS; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
COMMAND=`echo $0 | sed -e 's,.*/,,g'`
|
||||
USAGE="Usage: $COMMAND [--install-dir=prefix] [--help] [--version] submitter-id"
|
||||
|
||||
VERSION=3.01.6
|
||||
|
||||
BINDIR=/usr/bin
|
||||
|
||||
SUBMITTER=
|
||||
TEMP=/tmp/sp$$
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "$USAGE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
-install-dir=*|--install-dir=*|--install-di=*|--install-d=*|--install-=*|--install=*|--instal=*|--insta=*|--inst=*|--ins=*|--in=*|--i=*)
|
||||
I=`echo "$1" | sed 's/-*i[a-z\-]*=//'`
|
||||
BINDIR=$I/bin ;;
|
||||
--version) echo $COMMAND version $VERSION ; exit 1 ;;
|
||||
-*) echo "$USAGE" ; exit 1 ;;
|
||||
*) SUBMITTER=$1 ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
path=`echo $0 | sed -e "s;${COMMAND};;"`
|
||||
|
||||
[ -z "$path" ] && path=.
|
||||
|
||||
if [ -f $BINDIR/send-pr ]; then
|
||||
SPPATH=$BINDIR/send-pr
|
||||
elif [ -f $path/send-pr ]; then
|
||||
SPPATH=$path/send-pr
|
||||
else
|
||||
echo "$COMMAND: cannot find \`$BINDIR/send-pr' or \`$path/send-pr'" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
trap 'rm -f $TEMP ; exit 0' 0
|
||||
trap 'echo "$COM: Aborting ..."; rm -f $TEMP ; exit 1' 1 2 3 13 15
|
||||
|
||||
sed -e "s/^SUBMITTER=.*/SUBMITTER=${SUBMITTER}/" $SPPATH > $TEMP
|
||||
|
||||
if grep $SUBMITTER $TEMP > /dev/null; then
|
||||
cp $SPPATH $SPPATH.orig &&
|
||||
rm -f $SPPATH &&
|
||||
cp $TEMP $SPPATH &&
|
||||
chmod a+rx $SPPATH &&
|
||||
rm -f $TEMP $SPPATH.orig ||
|
||||
{ echo "$COMMAND: unable to replace send-pr" >&2 ; exit 1; }
|
||||
else
|
||||
echo "$COMMAND: something went wrong when sed-ing the submitter into send-pr" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$COMMAND: \`$SUBMITTER' is now the default submitter ID for send-pr"
|
||||
|
||||
exit 0
|
739
gnu/usr.bin/send-pr/send-pr-el.in
Normal file
739
gnu/usr.bin/send-pr/send-pr-el.in
Normal file
@ -0,0 +1,739 @@
|
||||
;;;; -*-emacs-lisp-*-
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;; EMACS interface for send-pr (by Heinz G. Seidl, hgs@cygnus.com)
|
||||
;;;; Slightly hacked by Brendan Kehoe (brendan@cygnus.com).
|
||||
;;;;
|
||||
;;;; This file is part of the Problem Report Management System (GNATS)
|
||||
;;;; Copyright 1992, 1993 Cygnus Support
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public
|
||||
;;;; License as published by the Free Software Foundation; either
|
||||
;;;; version 2 of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; 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 Library General Public
|
||||
;;;; License along with this program; if not, write to the Free
|
||||
;;;; Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
;;;;
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;;
|
||||
;;;; This file contains the EMACS interface to the Problem Report Management
|
||||
;;;; System (GNATS):
|
||||
;;;;
|
||||
;;;; - The `send-pr' command and the `send-pr-mode' for sending
|
||||
;;;; Problem Reports (PRs).
|
||||
;;;;
|
||||
;;;; For more information about how to send a PR see send-pr(1).
|
||||
;;;;
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;;
|
||||
;;;; Configuration: the symbol `DEFAULT-RELEASE' can be replaced by
|
||||
;;;; site/release specific strings during the configuration/installation
|
||||
;;;; process.
|
||||
;;;;
|
||||
;;;; Install this file in your EMACS library directory.
|
||||
;;;;
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
(provide 'send-pr)
|
||||
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;; Customization: put the following forms into your default.el file
|
||||
;;;; (or into your .emacs)
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
;(autoload 'send-pr-mode "send-pr"
|
||||
; "Major mode for sending problem reports." t)
|
||||
|
||||
;(autoload 'send-pr "send-pr"
|
||||
; "Command to create and send a problem report." t)
|
||||
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;; End of Customization Section
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
(autoload 'server-buffer-done "server")
|
||||
(defvar server-buffer-clients nil)
|
||||
(defvar mail-self-blind nil)
|
||||
(defvar mail-default-reply-to nil)
|
||||
|
||||
(defconst send-pr::version "3.01.6")
|
||||
|
||||
(defvar gnats:root "/b/gnats"
|
||||
"*The top of the tree containing the GNATS database.")
|
||||
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;; hooks
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
(defvar text-mode-hook nil) ; we define it here in case it's not defined
|
||||
(defvar send-pr-mode-hook text-mode-hook "Called when send-pr is invoked.")
|
||||
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;; Domains and default values for (some of) the Problem Report fields;
|
||||
;;;; constants and definitions.
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
(defconst gnats::emacs-19p (not (string-lessp emacs-version "19"))
|
||||
"Is this emacs v19?")
|
||||
|
||||
;;; These may be changed during configuration/installation or by the individual
|
||||
;;; user in his/her .emacs file.
|
||||
;;;
|
||||
(defun gnats::get-config (var)
|
||||
(let ((shell-file-name "/bin/sh")
|
||||
(buf (generate-new-buffer " *GNATS config*"))
|
||||
ret)
|
||||
(save-excursion
|
||||
(set-buffer buf)
|
||||
(shell-command (concat ". " gnats:root "/gnats-adm/config; echo $" var )
|
||||
t)
|
||||
(if (looking-at "/bin/sh:\\|\n")
|
||||
(setq ret nil)
|
||||
(setq ret (buffer-substring (point-min) (- (point-max) 1)))))
|
||||
(kill-buffer buf)
|
||||
ret))
|
||||
|
||||
;; const because it must match the script's value
|
||||
(defconst send-pr:datadir (or (gnats::get-config "DATADIR") "/usr/local/lib")
|
||||
"*Where the `gnats' subdirectory containing category lists lives.")
|
||||
|
||||
(defvar send-pr::sites nil
|
||||
"List of GNATS support sites; computed at runtime.")
|
||||
(defvar send-pr:default-site
|
||||
(or (gnats::get-config "GNATS_SITE") "sun-lamp")
|
||||
"Default site to send bugs to.")
|
||||
(defvar send-pr:::site send-pr:default-site
|
||||
"The site to which a problem report is currently being submitted, or NIL
|
||||
if using the default site (buffer local).")
|
||||
|
||||
(defvar send-pr:::categories nil
|
||||
"Buffer local list of available categories, derived at runtime from
|
||||
send-pr:::site and send-pr::category-alist.")
|
||||
(defvar send-pr::category-alist nil
|
||||
"Alist of GNATS support sites and the categories supported at each; computed
|
||||
at runtime.")
|
||||
|
||||
;;; Ideally we would get all the following values from a central database
|
||||
;;; during runtime instead of having them here in the code.
|
||||
;;;
|
||||
(defconst send-pr::fields
|
||||
(` (("Category" send-pr::set-categories
|
||||
(, (or (gnats::get-config "DEFAULT_CATEGORY") nil)) enum)
|
||||
("Class" (("sw-bug") ("doc-bug") ("change-request") ("support"))
|
||||
(, (or (gnats::get-config "DEFAULT_CONFIDENTIAL") 0)) enum)
|
||||
("Confidential" (("yes") ("no"))
|
||||
(, (or (gnats::get-config "DEFAULT_CONFIDENTIAL") 1)) enum)
|
||||
("Severity" (("non-critical") ("serious") ("critical"))
|
||||
(, (or (gnats::get-config "DEFAULT_SEVERITY") 1)) enum)
|
||||
("Priority" (("low") ("medium") ("high"))
|
||||
(, (or (gnats::get-config "DEFAULT_PRIORITY") 1)) enum)
|
||||
("Release" nil
|
||||
(, (or (gnats::get-config "DEFAULT_RELEASE") "@DEFAULT_RELEASE@"))
|
||||
text)
|
||||
("Submitter-Id" nil
|
||||
(, (or (gnats::get-config "DEFAULT_SUBMITTER") "@DEFAULT_SUBMITTER@"))
|
||||
text)
|
||||
("Synopsis" nil nil text
|
||||
(lambda (a b c) (gnats::set-mail-field "Subject" c)))))
|
||||
"AList, keyed on the name of the field, of:
|
||||
1) The field name.
|
||||
2) The list of completions. This can be a list, a function to call, or nil.
|
||||
3) The default value.
|
||||
4) The type of the field.
|
||||
5) A sub-function to call when changed.")
|
||||
|
||||
(defvar gnats::fields nil)
|
||||
|
||||
(defmacro gnats::push (i l)
|
||||
(` (setq (, l) (cons (,@ (list i l))))))
|
||||
|
||||
(defun send-pr::set-categories (&optional arg)
|
||||
"Get the list of categories for the current site out of
|
||||
send-pr::category-alist if there or from send-pr if not. With arg, force
|
||||
update."
|
||||
;;
|
||||
(let ((entry (assoc send-pr:::site send-pr::category-alist)))
|
||||
(or (and entry (null arg))
|
||||
(let ((oldpr (getenv "GNATS_ROOT")) cats)
|
||||
(send-pr::set-sites arg)
|
||||
(setenv "GNATS_ROOT" gnats:root)
|
||||
(setq cats (gnats::get-value-from-shell
|
||||
"send-pr" "-CL" send-pr:::site))
|
||||
(setenv "GNATS_ROOT" oldpr)
|
||||
(if entry (setcdr entry cats)
|
||||
(setq entry (cons send-pr:::site cats))
|
||||
(gnats::push entry send-pr::category-alist))))
|
||||
(setq send-pr:::categories (cdr entry))))
|
||||
|
||||
(defun send-pr::set-sites (&optional arg)
|
||||
"Get the list of sites (by listing the contents of DATADIR/gnats) and assign
|
||||
it to send-pr::sites. With arg, force update."
|
||||
(or (and (null arg) send-pr::sites)
|
||||
(progn
|
||||
(setq send-pr::sites nil)
|
||||
(mapcar
|
||||
(function
|
||||
(lambda (file)
|
||||
(or (memq t (mapcar (function (lambda (x) (string= x file)))
|
||||
'("." ".." "pr-edit" "pr-addr")))
|
||||
(not (file-readable-p file))
|
||||
(gnats::push (list (file-name-nondirectory file))
|
||||
send-pr::sites))))
|
||||
(directory-files (format "%s/gnats" send-pr:datadir) t))
|
||||
(setq send-pr::sites (reverse send-pr::sites)))))
|
||||
|
||||
(defconst send-pr::pr-buffer-name "*send-pr*"
|
||||
"Name of the temporary buffer, where the problem report gets composed.")
|
||||
|
||||
(defconst send-pr::err-buffer-name "*send-pr-error*"
|
||||
"Name of the temporary buffer, where send-pr error messages appear.")
|
||||
|
||||
(defvar send-pr:::err-buffer nil
|
||||
"The error buffer used by the current PR buffer.")
|
||||
|
||||
(defconst gnats::indent 17 "Indent for formatting the value.")
|
||||
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;; `send-pr' - command for creating and sending of problem reports
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
(fset 'send-pr 'send-pr:send-pr)
|
||||
(defun send-pr:send-pr (&optional site)
|
||||
"Create a buffer and read in the result of `send-pr -P'.
|
||||
When finished with editing the problem report use \\[send-pr:submit-pr]
|
||||
to send the PR with `send-pr -b -f -'."
|
||||
;;
|
||||
(interactive
|
||||
(if current-prefix-arg
|
||||
(list (completing-read "Site: " (send-pr::set-sites 'recheck) nil t
|
||||
send-pr:default-site))))
|
||||
(or site (setq site send-pr:default-site))
|
||||
(let ((buf (get-buffer send-pr::pr-buffer-name)))
|
||||
(if (or (not buf)
|
||||
(and (switch-to-buffer buf)
|
||||
(or (not (buffer-modified-p buf))
|
||||
(y-or-n-p "Erase previous problem report? "))
|
||||
(or (erase-buffer) t)))
|
||||
(send-pr::start-up site))))
|
||||
|
||||
(defun send-pr::start-up (site)
|
||||
(switch-to-buffer (get-buffer-create send-pr::pr-buffer-name))
|
||||
(setq default-directory (expand-file-name "~/"))
|
||||
(auto-save-mode auto-save-default)
|
||||
(let ((oldpr (getenv "GNATS_ROOT"))
|
||||
(case-fold-search nil))
|
||||
(setenv "GNATS_ROOT" gnats:root)
|
||||
(shell-command (concat "send-pr -P " site) t)
|
||||
(setenv "GNATS_ROOT" oldpr)
|
||||
(if (looking-at "send-pr:")
|
||||
(cond ((looking-at "send-pr: .* does not have a categories list")
|
||||
(setq send-pr::sites nil)
|
||||
(error "send-pr: the GNATS site %s does not have a categories list" site))
|
||||
(t (error (buffer-substring (point-min) (point-max)))))
|
||||
(save-excursion
|
||||
;; Clear cruft inserted by bdamaged .cshrcs
|
||||
(re-search-forward "^SEND-PR:")
|
||||
(delete-region 1 (match-beginning 0)))))
|
||||
(set-buffer-modified-p nil)
|
||||
(send-pr:send-pr-mode)
|
||||
(setq send-pr:::site site)
|
||||
(send-pr::set-categories)
|
||||
(if (null send-pr:::categories)
|
||||
(progn
|
||||
(and send-pr:::err-buffer (kill-buffer send-pr:::err-buffer))
|
||||
(kill-buffer nil)
|
||||
(message "send-pr: no categories found"))
|
||||
(and mail-default-reply-to
|
||||
(gnats::set-mail-field "Reply-To" mail-default-reply-to))
|
||||
(and mail-self-blind
|
||||
(gnats::set-mail-field "BCC" (user-login-name)))
|
||||
(mapcar 'send-pr::maybe-change-field send-pr::fields)
|
||||
(gnats::position-on-field "Description")
|
||||
(message (substitute-command-keys
|
||||
"To send the problem report use: \\[send-pr:submit-pr]"))))
|
||||
|
||||
(fset 'do-send-pr 'send-pr:submit-pr) ;backward compat
|
||||
(defun send-pr:submit-pr ()
|
||||
"Pipe the contents of the buffer *send-pr* to `send-pr -f -.' unless this
|
||||
buffer was loaded with emacsclient, in which case save the buffer and exit."
|
||||
;;
|
||||
(interactive)
|
||||
(cond
|
||||
((and (boundp 'server-buffer-clients)
|
||||
server-buffer-clients)
|
||||
(let ((buffer (current-buffer))
|
||||
(version-control nil) (buffer-backed-up nil))
|
||||
(save-buffer buffer)
|
||||
(kill-buffer buffer)
|
||||
(server-buffer-done buffer)))
|
||||
(t
|
||||
(or (and send-pr:::err-buffer
|
||||
(buffer-name send-pr:::err-buffer))
|
||||
(setq send-pr:::err-buffer
|
||||
(get-buffer-create send-pr::err-buffer-name)))
|
||||
(let ((err-buffer send-pr:::err-buffer) mesg ok)
|
||||
(save-excursion (set-buffer err-buffer) (erase-buffer))
|
||||
(message "running send-pr...")
|
||||
(let ((oldpr (getenv "GNATS_ROOT")))
|
||||
(setenv "GNATS_ROOT" gnats:root)
|
||||
;; FIXME -r flag is obsolete; remove for 3.3 release
|
||||
(call-process-region (point-min) (point-max) "send-pr"
|
||||
nil err-buffer nil "-b" "-r" "-f" "-")
|
||||
(setenv "GNATS_ROOT" oldpr))
|
||||
(message "running send-pr...done")
|
||||
;; stupidly we cannot check the return value in EMACS 18.57, thus we need
|
||||
;; this kluge to find out whether send-pr succeeded.
|
||||
(if (save-excursion
|
||||
(set-buffer err-buffer)
|
||||
(goto-char (point-min))
|
||||
(setq mesg (buffer-substring (point-min) (- (point-max) 1)))
|
||||
(search-forward "problem report sent" nil t))
|
||||
(progn (message mesg)
|
||||
(kill-buffer err-buffer)
|
||||
(delete-auto-save-file-if-necessary)
|
||||
(set-buffer-modified-p nil)
|
||||
(bury-buffer))
|
||||
(pop-to-buffer err-buffer))
|
||||
))))
|
||||
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;; send-pr:send-pr-mode mode
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
(defvar send-pr-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(define-key map "\C-c\C-c" 'send-pr:submit-pr)
|
||||
(define-key map "\C-c\C-f" 'gnats:change-field)
|
||||
(define-key map "\M-n" 'gnats:next-field)
|
||||
(define-key map "\M-p" 'gnats:previous-field)
|
||||
(define-key map "\C-\M-f" 'gnats:forward-field)
|
||||
(define-key map "\C-\M-b" 'gnats:backward-field)
|
||||
map)
|
||||
"Keymap for send-pr mode.")
|
||||
|
||||
(defconst gnats::keyword "^>\\([-a-zA-Z]+\\):")
|
||||
(defconst gnats::before-keyword "[ \t\n\f]*[\n\f]+>\\([-a-zA-Z]+\\):")
|
||||
(defconst gnats::after-keyword "^>\\([-a-zA-Z]+\\):[ \t\n\f]+")
|
||||
|
||||
(fset 'send-pr-mode 'send-pr:send-pr-mode)
|
||||
(defun send-pr:send-pr-mode ()
|
||||
"Major mode for submitting problem reports.
|
||||
For information about the form see gnats(1) and send-pr(1).
|
||||
Special commands: \\{send-pr-mode-map}
|
||||
Turning on send-pr-mode calls the value of the variable send-pr-mode-hook,
|
||||
if it is not nil."
|
||||
(interactive)
|
||||
(gnats::patch-exec-path)
|
||||
(put 'send-pr:send-pr-mode 'mode-class 'special)
|
||||
(kill-all-local-variables)
|
||||
(setq major-mode 'send-pr:send-pr-mode)
|
||||
(setq mode-name "send-pr")
|
||||
(use-local-map send-pr-mode-map)
|
||||
(set-syntax-table text-mode-syntax-table)
|
||||
(setq local-abbrev-table text-mode-abbrev-table)
|
||||
(setq buffer-offer-save t)
|
||||
(make-local-variable 'send-pr:::site)
|
||||
(make-local-variable 'send-pr:::categories)
|
||||
(make-local-variable 'send-pr:::err-buffer)
|
||||
(make-local-variable 'paragraph-separate)
|
||||
(setq paragraph-separate (concat (default-value 'paragraph-separate)
|
||||
"\\|" gnats::keyword "[ \t\n\f]*$"))
|
||||
(make-local-variable 'paragraph-start)
|
||||
(setq paragraph-start (concat (default-value 'paragraph-start)
|
||||
"\\|" gnats::keyword))
|
||||
(run-hooks 'send-pr-mode-hook)
|
||||
t)
|
||||
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;; Functions to read and replace field values.
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
(defun gnats::position-on-field (field)
|
||||
(goto-char (point-min))
|
||||
(if (not (re-search-forward (concat "^>" field ":") nil t))
|
||||
(error "Field `>%s:' not found." field)
|
||||
(re-search-forward "[ \t\n\f]*")
|
||||
(if (looking-at gnats::keyword)
|
||||
(backward-char 1))
|
||||
t))
|
||||
|
||||
(defun gnats::mail-position-on-field (field)
|
||||
(let (end
|
||||
(case-fold-search t))
|
||||
(goto-char (point-min))
|
||||
(re-search-forward "^$")
|
||||
(setq end (match-beginning 0))
|
||||
(goto-char (point-min))
|
||||
(if (not (re-search-forward (concat "^" field ":") end 'go-to-end))
|
||||
(insert field ": \n")
|
||||
(re-search-forward "[ \t\n\f]*"))
|
||||
(skip-chars-backward "\n")
|
||||
t))
|
||||
|
||||
(defun gnats::field-contents (field &optional elem move)
|
||||
(let (pos)
|
||||
(unwind-protect
|
||||
(save-excursion
|
||||
(if (not (gnats::position-on-field field))
|
||||
nil
|
||||
(setq pos (point-marker))
|
||||
(if (or (looking-at "<.*>$") (eolp))
|
||||
t
|
||||
(looking-at ".*$") ; to set match-{beginning,end}
|
||||
(gnats::nth-word
|
||||
(buffer-substring (match-beginning 0) (match-end 0))
|
||||
elem))))
|
||||
(and move pos (goto-char pos)))))
|
||||
|
||||
(defun gnats::functionp (thing)
|
||||
(or (and (symbolp thing) (fboundp thing))
|
||||
(and (listp thing) (eq (car thing) 'lambda))))
|
||||
|
||||
(defun gnats::field-values (field)
|
||||
"Return the possible (known) values for field FIELD."
|
||||
(let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields
|
||||
send-pr::fields))
|
||||
(thing (elt (assoc field fields) 1)))
|
||||
(cond ((gnats::functionp thing) (funcall thing))
|
||||
((listp thing) thing)
|
||||
(t (error "ACK")))))
|
||||
|
||||
(defun gnats::field-default (field)
|
||||
"Return the default value for field FIELD."
|
||||
(let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields
|
||||
send-pr::fields))
|
||||
(thing (elt (assoc field fields) 2)))
|
||||
(cond ((stringp thing) thing)
|
||||
((null thing) "")
|
||||
((numberp thing) (car (elt (gnats::field-values field) thing)))
|
||||
((gnats::functionp thing)
|
||||
(funcall thing (gnats::field-contents field)))
|
||||
((eq thing t) (gnats::field-contents field))
|
||||
(t (error "ACK")))))
|
||||
|
||||
(defun gnats::field-type (field)
|
||||
"Return the type of field FIELD."
|
||||
(let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields
|
||||
send-pr::fields))
|
||||
(thing (elt (assoc field fields) 3)))
|
||||
thing))
|
||||
|
||||
(defun gnats::field-action (field)
|
||||
"Return the extra handling function for field FIELD."
|
||||
(let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields
|
||||
send-pr::fields))
|
||||
(thing (elt (assoc field fields) 4)))
|
||||
(cond ((null thing) 'ignore)
|
||||
((gnats::functionp thing) thing)
|
||||
(t (error "ACK")))))
|
||||
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;; Point movement functions
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
(or (fboundp 'defsubst) (fset 'defsubst 'defun))
|
||||
|
||||
(defun send-pr::maybe-change-field (field)
|
||||
(setq field (car field))
|
||||
(let ((thing (gnats::field-contents field)))
|
||||
(and thing (eq t thing)
|
||||
(not (eq 'multi-text (gnats::field-type field)))
|
||||
(gnats:change-field field))))
|
||||
|
||||
(defun gnats:change-field (&optional field default)
|
||||
"Change the value of the field containing the cursor. With arg, ask the
|
||||
user for the field to change. From a program, the function takes optional
|
||||
arguments of the field to change and the default value to use."
|
||||
(interactive
|
||||
(if current-prefix-arg
|
||||
(list (completing-read
|
||||
"Field: " (if (eq major-mode 'gnats:gnats-mode) gnats::fields
|
||||
send-pr::fields)
|
||||
nil t))))
|
||||
(or field
|
||||
(setq field (gnats::current-field)))
|
||||
(gnats::position-on-field field)
|
||||
(sit-for 0)
|
||||
(let* ((old (gnats::field-contents field))
|
||||
new)
|
||||
(if (null old)
|
||||
(error "ACK")
|
||||
(let ((prompt (concat ">" field ": "))
|
||||
(domain (gnats::field-values field))
|
||||
(type (gnats::field-type field))
|
||||
(action (gnats::field-action field)))
|
||||
(or default (setq default (gnats::field-default field)))
|
||||
(setq new (if (eq type 'enum)
|
||||
(completing-read prompt domain nil t
|
||||
(if gnats::emacs-19p (cons default 0)
|
||||
default))
|
||||
(read-string prompt (if gnats::emacs-19p (cons default 1)
|
||||
default))))
|
||||
(gnats::set-field field new)
|
||||
(funcall action field old new)
|
||||
new))))
|
||||
|
||||
(defun gnats::set-field (field value)
|
||||
(gnats::position-on-field field)
|
||||
(delete-horizontal-space)
|
||||
(looking-at ".*$")
|
||||
(replace-match
|
||||
(concat (make-string (- gnats::indent (length field) 2) ?\40 ) value) t))
|
||||
|
||||
(defun gnats::set-mail-field (field value)
|
||||
(gnats::mail-position-on-field field)
|
||||
(delete-horizontal-space)
|
||||
(looking-at ".*$")
|
||||
(replace-match (concat " " value) t))
|
||||
|
||||
(defun gnats::before-keyword (&optional where)
|
||||
"Returns t if point is in some white space before a keyword.
|
||||
If where is nil, then point is not changed; if where is t then point is moved
|
||||
to the beginning of the keyword, otherwise it is moved to the beginning
|
||||
of the white space it was in."
|
||||
;;
|
||||
(if (looking-at gnats::before-keyword)
|
||||
(prog1 t
|
||||
(cond ((eq where t)
|
||||
(re-search-forward "^>") (backward-char))
|
||||
((not (eq where nil))
|
||||
(re-search-backward "[^ \t\n\f]") (forward-char))))
|
||||
nil))
|
||||
|
||||
(defun gnats::after-keyword (&optional where)
|
||||
"Returns t if point is in some white space after a keyword.
|
||||
If where is nil, then point is not changed; if where is t then point is moved
|
||||
to the beginning of the keyword, otherwise it is moved to the end of the white
|
||||
space it was in."
|
||||
;;
|
||||
(if (gnats::looking-after gnats::after-keyword)
|
||||
(prog1 t
|
||||
(cond ((eq where t)
|
||||
(re-search-backward "^>"))
|
||||
((not (eq where nil))
|
||||
(re-search-forward "[^ \t\n\f]") (backward-char))))
|
||||
nil))
|
||||
|
||||
(defun gnats::in-keyword (&optional where)
|
||||
"Returns t if point is within a keyword.
|
||||
If where is nil, then point is not changed; if where is t then point is moved
|
||||
to the beginning of the keyword."
|
||||
;;
|
||||
(let ((old-point (point-marker)))
|
||||
(beginning-of-line)
|
||||
(cond ((and (looking-at gnats::keyword)
|
||||
(< old-point (match-end 0)))
|
||||
(prog1 t
|
||||
(if (eq where t)
|
||||
t
|
||||
(goto-char old-point))))
|
||||
(t (goto-char old-point)
|
||||
nil))))
|
||||
|
||||
(defun gnats::forward-bofield ()
|
||||
"Moves point to the beginning of a field. Assumes that point is in the
|
||||
keyword."
|
||||
;;
|
||||
(if (re-search-forward "[ \t\n\f]+[^ \t\n\f]" (point-max) '-)
|
||||
(backward-char)
|
||||
t))
|
||||
|
||||
(defun gnats::backward-eofield ()
|
||||
"Moves point to the end of a field. Assumes point is in the keyword."
|
||||
;;
|
||||
(if (re-search-backward "[^ \t\n\f][ \t\n\f]+" (point-min) '-)
|
||||
(forward-char)
|
||||
t))
|
||||
|
||||
(defun gnats::forward-eofield ()
|
||||
"Moves point to the end of a field. Assumes that point is in the field."
|
||||
;;
|
||||
;; look for the next field
|
||||
(if (re-search-forward gnats::keyword (point-max) '-)
|
||||
(progn (beginning-of-line) (gnats::backward-eofield))
|
||||
(re-search-backward "[^ \t\n\f][ \t\n\f]*" (point-min) '-)
|
||||
(forward-char)))
|
||||
|
||||
(defun gnats::backward-bofield ()
|
||||
"Moves point to the beginning of a field. Assumes that point is in the
|
||||
field."
|
||||
;;
|
||||
;;look for previous field
|
||||
(if (re-search-backward gnats::keyword (point-min) '-)
|
||||
(gnats::forward-bofield)
|
||||
t))
|
||||
|
||||
|
||||
(defun gnats:forward-field ()
|
||||
"Move point forward to the end of the field or to the beginning of the next
|
||||
field."
|
||||
;;
|
||||
(interactive)
|
||||
(if (or (gnats::before-keyword t) (gnats::in-keyword t)
|
||||
(gnats::after-keyword t))
|
||||
(gnats::forward-bofield)
|
||||
(gnats::forward-eofield)))
|
||||
|
||||
(defun gnats:backward-field ()
|
||||
"Move point backward to the beginning/end of a field."
|
||||
;;
|
||||
(interactive)
|
||||
(backward-char)
|
||||
(if (or (gnats::before-keyword t) (gnats::in-keyword t)
|
||||
(gnats::after-keyword t))
|
||||
(gnats::backward-eofield)
|
||||
(gnats::backward-bofield)))
|
||||
|
||||
(defun gnats:next-field ()
|
||||
"Move point to the beginning of the next field."
|
||||
;;
|
||||
(interactive)
|
||||
(if (or (gnats::before-keyword t) (gnats::in-keyword t)
|
||||
(gnats::after-keyword t))
|
||||
(gnats::forward-bofield)
|
||||
(if (re-search-forward gnats::keyword (point-max) '-)
|
||||
(gnats::forward-bofield)
|
||||
t)))
|
||||
|
||||
(defun gnats:previous-field ()
|
||||
"Move point to the beginning of the previous field."
|
||||
;;
|
||||
(interactive)
|
||||
(backward-char)
|
||||
(if (or (gnats::after-keyword t) (gnats::in-keyword t)
|
||||
(gnats::before-keyword t))
|
||||
(progn (re-search-backward gnats::keyword (point-min) '-)
|
||||
(gnats::forward-bofield))
|
||||
(gnats::backward-bofield)))
|
||||
|
||||
(defun gnats:beginning-of-field ()
|
||||
"Move point to the beginning of the current field."
|
||||
(interactive)
|
||||
(cond ((gnats::in-keyword t)
|
||||
(gnats::forward-bofield))
|
||||
((gnats::after-keyword 0))
|
||||
(t
|
||||
(gnats::backward-bofield))))
|
||||
|
||||
(defun gnats::current-field ()
|
||||
(save-excursion
|
||||
(cond ((or (gnats::in-keyword t) (gnats::after-keyword t))
|
||||
(looking-at gnats::keyword))
|
||||
((re-search-backward gnats::keyword nil t))
|
||||
(t
|
||||
nil))
|
||||
(buffer-substring (match-beginning 1) (match-end 1))))
|
||||
|
||||
;;;;---------------------------------------------------------------------------
|
||||
;;;; Support functions
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
(defun gnats::looking-after (regex)
|
||||
"Returns t if point is after regex."
|
||||
;;
|
||||
(let* ((old-point (point))
|
||||
(start (if (eobp)
|
||||
old-point
|
||||
(forward-char) (point))))
|
||||
(cond ((re-search-backward regex (point-min) t)
|
||||
(goto-char old-point)
|
||||
(cond ((eq (match-end 0) start)
|
||||
t))))))
|
||||
|
||||
(defun gnats::nth-word (string &optional elem)
|
||||
"Returns the elem-th word of the string.
|
||||
If elem is nil, then the first wort is returned, if elem is 0 then
|
||||
the whole string is returned."
|
||||
;;
|
||||
(if (integerp elem)
|
||||
(cond ((eq elem 0) string)
|
||||
((eq elem 1) (gnats::first-word string))
|
||||
((equal string "") "")
|
||||
((>= elem 2)
|
||||
(let ((i 0) (value ""))
|
||||
(setq string ; strip leading blanks
|
||||
(substring string (or (string-match "[^ \t]" string) 0)))
|
||||
(while (< i elem)
|
||||
(setq value
|
||||
(substring string 0
|
||||
(string-match "[ \t]*$\\|[ \t]+" string)))
|
||||
(setq string
|
||||
(substring string (match-end 0)))
|
||||
(setq i (+ i 1)))
|
||||
value)))
|
||||
(gnats::first-word string)))
|
||||
|
||||
(defun gnats::first-word (string)
|
||||
(setq string
|
||||
(substring string (or (string-match "[^ \t]" string) 0)))
|
||||
(substring string 0 (string-match "[ \t]*$\\|[ \t]+" string)))
|
||||
|
||||
;;;;---------------------------------------------------------------------------
|
||||
|
||||
(defun gnats::patch-exec-path ()
|
||||
;;
|
||||
"Replaces `//' by `/' in `exec-path'."
|
||||
;;
|
||||
;(make-local-variable 'exec-path)
|
||||
(let ((err-buffer (get-buffer-create " *gnats::patch-exec-path*"))
|
||||
(ret))
|
||||
(setq exec-path (save-excursion (set-buffer err-buffer)
|
||||
(prin1 exec-path err-buffer)
|
||||
(goto-char (point-min))
|
||||
(replace-string "//" "/")
|
||||
(goto-char (point-min))
|
||||
(setq ret (read err-buffer))
|
||||
(kill-buffer err-buffer)
|
||||
ret
|
||||
))))
|
||||
|
||||
(defun gnats::get-value-from-shell (&rest command)
|
||||
"Execute shell command to get a list of valid values for `variable'."
|
||||
;;
|
||||
(let ((err-buffer (get-buffer-create " *gnats::get-value-from-shell*")))
|
||||
(save-excursion
|
||||
(set-buffer err-buffer)
|
||||
(unwind-protect
|
||||
(condition-case var
|
||||
(progn
|
||||
(apply 'call-process
|
||||
(car command) nil err-buffer nil (cdr command))
|
||||
(goto-char (point-min))
|
||||
(if (looking-at "[-a-z]+: ")
|
||||
(error (buffer-substring (point-min) (point-max))))
|
||||
(read err-buffer))
|
||||
(error nil))
|
||||
(kill-buffer err-buffer)))))
|
||||
|
||||
(or (fboundp 'setenv)
|
||||
(defun setenv (variable &optional value)
|
||||
"Set the value of the environment variable named VARIABLE to VALUE.
|
||||
VARIABLE should be a string. VALUE is optional; if not provided or is
|
||||
`nil', the environment variable VARIABLE will be removed.
|
||||
This function works by modifying `process-environment'."
|
||||
(interactive "sSet environment variable: \nsSet %s to value: ")
|
||||
(if (string-match "=" variable)
|
||||
(error "Environment variable name `%s' contains `='" variable)
|
||||
(let ((pattern (concat "\\`" (regexp-quote (concat variable "="))))
|
||||
(case-fold-search nil)
|
||||
(scan process-environment))
|
||||
(while scan
|
||||
(cond
|
||||
((string-match pattern (car scan))
|
||||
(if (eq nil value)
|
||||
(setq process-environment (delq (car scan)
|
||||
process-environment))
|
||||
(setcar scan (concat variable "=" value)))
|
||||
(setq scan nil))
|
||||
((null (setq scan (cdr scan)))
|
||||
(setq process-environment
|
||||
(cons (concat variable "=" value)
|
||||
process-environment)))))))))
|
||||
|
||||
;;;; end of send-pr.el
|
312
gnu/usr.bin/send-pr/send-pr.man
Normal file
312
gnu/usr.bin/send-pr/send-pr.man
Normal file
@ -0,0 +1,312 @@
|
||||
.\" -*- nroff -*-
|
||||
.\" ---------------------------------------------------------------------------
|
||||
.\" man page for send-pr (by Heinz G. Seidl, hgs@cygnus.com)
|
||||
.\" updated Feb 1993 for GNATS 3.00 by Jeffrey Osier, jeffrey@cygnus.com
|
||||
.\"
|
||||
.\" This file is part of the Problem Report Management System (GNATS)
|
||||
.\" Copyright 1992 Cygnus Support
|
||||
.\"
|
||||
.\" This program is free software; you can redistribute it and/or
|
||||
.\" modify it under the terms of the GNU General Public
|
||||
.\" License as published by the Free Software Foundation; either
|
||||
.\" version 2 of the License, or (at your option) any later version.
|
||||
.\"
|
||||
.\" 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 Library General Public
|
||||
.\" License along with this program; if not, write to the Free
|
||||
.\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA
|
||||
.\"
|
||||
.\" ---------------------------------------------------------------------------
|
||||
.nh
|
||||
.TH SEND-PR 1 @VERSION@ "February 1993"
|
||||
.SH NAME
|
||||
send-pr \- send problem report (PR) to a central support site
|
||||
.SH SYNOPSIS
|
||||
.B send-pr
|
||||
[
|
||||
.I site
|
||||
]
|
||||
[
|
||||
.B \-f
|
||||
.I problem-report
|
||||
]
|
||||
[
|
||||
.B \-t
|
||||
.I mail-address
|
||||
]
|
||||
.br
|
||||
.in +0.8i
|
||||
[
|
||||
.B \-p
|
||||
]
|
||||
[
|
||||
.B \-P
|
||||
]
|
||||
[
|
||||
.B \-L
|
||||
]
|
||||
[
|
||||
.B \-\-request-id
|
||||
]
|
||||
[
|
||||
.B \-v
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
.B send-pr
|
||||
is a tool used to submit
|
||||
.I problem reports
|
||||
.\" SITE ADMINISTRATORS - change this if you use a local default
|
||||
(PRs) to a central support site. In most cases the correct
|
||||
.I site
|
||||
will be the default. This argument indicates the support site which
|
||||
is responsible for the category of problem involved. Some sites may
|
||||
use a local address as a default.
|
||||
.I site
|
||||
values are defined by using the
|
||||
.BR aliases (5).
|
||||
.LP
|
||||
.B send-pr
|
||||
invokes an editor on a problem report template (after trying to fill
|
||||
in some fields with reasonable default values). When you exit the
|
||||
editor,
|
||||
.B send-pr
|
||||
sends the completed form to the
|
||||
.I Problem Report Management System
|
||||
(\fBGNATS\fR) at a central support site. At the support site, the PR
|
||||
is assigned a unique number and is stored in the \fBGNATS\fR database
|
||||
according to its category and submitter-id. \fBGNATS\fR automatically
|
||||
replies with an acknowledgement, citing the category and the PR
|
||||
number.
|
||||
.LP
|
||||
To ensure that a PR is handled promptly, it should contain your (unique)
|
||||
\fIsubmitter-id\fR and one of the available \fIcategories\fR to identify the
|
||||
problem area. (Use
|
||||
.B `send-pr -L'
|
||||
to see a list of categories.)
|
||||
.LP
|
||||
The
|
||||
.B send-pr
|
||||
template at your site should already be customized with your
|
||||
submitter-id (running `\|\fBinstall-sid\fP \fIsubmitter-id\fP\|' to
|
||||
accomplish this is part of the installation procedures for
|
||||
.BR send-pr ).
|
||||
If this hasn't been done, see your system administrator for your
|
||||
submitter-id, or request one from your support site by invoking
|
||||
.B `send-pr \-\-request\-id'.
|
||||
If your site does not distinguish between different user sites, or if
|
||||
you are not affiliated with the support site, use
|
||||
.B `net'
|
||||
for this field.
|
||||
.LP
|
||||
The more precise your problem description and the more complete your
|
||||
information, the faster your support team can solve your problems.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.BI \-f " problem-report"
|
||||
specify a file (\fIproblem-report\fR) which already contains a
|
||||
complete problem report.
|
||||
.B send-pr
|
||||
sends the contents of the file without invoking the editor. If
|
||||
the value for
|
||||
.I problem-report
|
||||
is
|
||||
.BR `\|\-\|' ,
|
||||
then
|
||||
.B send-pr
|
||||
reads from standard input.
|
||||
.TP
|
||||
.BI \-t " mail-address"
|
||||
Change mail address at the support site for problem reports. The
|
||||
default
|
||||
.I mail-address
|
||||
is the address used for the default
|
||||
.IR site .
|
||||
Use the
|
||||
.I site
|
||||
argument rather than this option in nearly all cases.
|
||||
.TP
|
||||
.B \-p
|
||||
Print the standard blank template on standard output. No mail is sent.
|
||||
.TP
|
||||
.B \-P
|
||||
print the form specified by the environment variable
|
||||
.B PR_FORM
|
||||
on standard output. No mail is sent.
|
||||
.TP
|
||||
.BI \-s " mail-agent"
|
||||
Use
|
||||
.I mail-agent
|
||||
instead of the default mailer,
|
||||
.BR sendmail (8).
|
||||
.TP
|
||||
.B -L
|
||||
print the list of available categories. No mail is sent.
|
||||
.TP
|
||||
.B \-\-request\-id
|
||||
sends mail to the default support site, or
|
||||
.I site
|
||||
if specified, with a request for your
|
||||
.IR submitter-id .
|
||||
If you are
|
||||
not affiliated with
|
||||
.IR site ,
|
||||
use a
|
||||
.I submitter-id
|
||||
of
|
||||
.BR net \|'.
|
||||
.TP
|
||||
.B \-v
|
||||
Display the
|
||||
.B send-pr
|
||||
version number.
|
||||
.LP
|
||||
Note: use
|
||||
.B send-pr
|
||||
to submit problem reports rather than mailing them directly. Using
|
||||
both the template and
|
||||
.B send-pr
|
||||
itself will help ensure all necessary information will reach the
|
||||
support site.
|
||||
.SH ENVIRONMENT
|
||||
The environment variable
|
||||
.B EDITOR
|
||||
specifies the editor to invoke on the template.
|
||||
.br
|
||||
default:
|
||||
.B vi
|
||||
.sp
|
||||
If the environment variable
|
||||
.B PR_FORM
|
||||
is set, then its value is used as the file name of the template for
|
||||
your problem-report editing session. You can use this to start with a
|
||||
partially completed form (for example, a form with the identification
|
||||
fields already completed).
|
||||
.SH "HOW TO FILL OUT A PROBLEM REPORT"
|
||||
Problem reports have to be in a particular form so that a program can
|
||||
easily manage them. Please remember the following guidelines:
|
||||
.IP \(bu 3m
|
||||
describe only
|
||||
.B one problem
|
||||
with each problem report.
|
||||
.IP \(bu 3m
|
||||
For follow-up mail, use the same subject line as the one in the automatic
|
||||
acknowledgent. It consists of category, PR number and the original synopsis
|
||||
line. This allows the support site to relate several mail messages to a
|
||||
particular PR and to record them automatically.
|
||||
.IP \(bu 3m
|
||||
Please try to be as accurate as possible in the subject and/or synopsis line.
|
||||
.IP \(bu 3m
|
||||
The subject and the synopsis line are not confidential. This is
|
||||
because open-bugs lists are compiled from them. Avoid confidential
|
||||
information there.
|
||||
.LP
|
||||
See the GNU
|
||||
.B Info
|
||||
file
|
||||
.B send-pr.info
|
||||
or the document \fIReporting Problems With send-pr\fR\ for detailed
|
||||
information on reporting problems
|
||||
.SH "HOW TO SUBMIT TEST CASES, CODE, ETC."
|
||||
Submit small code samples with the PR. Contact the support site for
|
||||
instructions on submitting larger test cases and problematic source
|
||||
code.
|
||||
.SH FILES
|
||||
.ta \w'/tmp/pbad$$ 'u
|
||||
/tmp/p$$ copy of PR used in editing session
|
||||
.br
|
||||
/tmp/pf$$ copy of empty PR form, for testing purposes
|
||||
.br
|
||||
/tmp/pbad$$ file for rejected PRs
|
||||
.if !\n(PR==1 \{.
|
||||
.SH SEE ALSO
|
||||
.BR gnats.texi
|
||||
and
|
||||
.BR send-pr.texi,
|
||||
which are also installed as GNU
|
||||
.B Info
|
||||
files
|
||||
.BR gnats.info
|
||||
and
|
||||
.BR send-pr.info;
|
||||
.LP
|
||||
.BR gnats (l),
|
||||
.BR query-pr (1),
|
||||
.BR edit-pr (1),
|
||||
.BR gnats (8),
|
||||
.BR queue-pr (8),
|
||||
.BR at-pr (8),
|
||||
.BR mkcat (8),
|
||||
.BR mkdist (8).
|
||||
.SH EMACS USER INTERFACE
|
||||
An Emacs user interface for
|
||||
.B send-pr
|
||||
with completion of field values is part of the
|
||||
.B send-pr
|
||||
distribution (invoked with
|
||||
.BR "M-x send-pr" ).
|
||||
See the file
|
||||
.B send-pr.info
|
||||
or the ASCII file
|
||||
.B INSTALL
|
||||
in the top level directory of the distribution for configuration and
|
||||
installation information. The Emacs LISP template file is
|
||||
.B send-pr-el.in
|
||||
and is installed as
|
||||
.BR send-pr.el .
|
||||
|
||||
.SH INSTALLATION AND CONFIGURATION
|
||||
See
|
||||
.B send-pr.info
|
||||
or
|
||||
.B INSTALL
|
||||
for installation instructions.
|
||||
.LP
|
||||
There are many ways in which
|
||||
.B send-pr
|
||||
can be customized to meet specific needs. As mentioned above, at
|
||||
least the
|
||||
.I submitter-id
|
||||
should be set before using
|
||||
.BR send-pr .
|
||||
You can change the
|
||||
.I submitter-id
|
||||
used by an already installed
|
||||
.B send-pr
|
||||
script, by running an auxiliary script: `\|\c
|
||||
.B install_sid
|
||||
.IR submitter-id \|'.
|
||||
.LP
|
||||
The file
|
||||
.B send-pr.el
|
||||
is automatically installed when the distribution is built. It is not,
|
||||
however, automatically loaded every time Emacs starts up. See
|
||||
.B send-pr.info
|
||||
or
|
||||
.B INSTALL
|
||||
for instructions on how to load
|
||||
.B send-pr
|
||||
automatically into Emacs.
|
||||
.SH AUTHORS
|
||||
Jeffrey Osier, Brendan Kehoe, Heinz G. Seidl (Cygnus Support)
|
||||
.SH COPYING
|
||||
Copyright (c) 1992, 1993 Free Software Foundation, Inc.
|
||||
.PP
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
are preserved on all copies.
|
||||
.PP
|
||||
Permission is granted to copy and distribute modified versions of this
|
||||
manual under the conditions for verbatim copying, provided that the
|
||||
entire resulting derived work is distributed under the terms of a
|
||||
permission notice identical to this one.
|
||||
.PP
|
||||
Permission is granted to copy and distribute translations of this
|
||||
manual into another language, under the above conditions for modified
|
||||
versions, except that this permission notice may be included in
|
||||
translations approved by the Free Software Foundation instead of in
|
||||
the original English.
|
||||
|
510
gnu/usr.bin/send-pr/send-pr.sh
Normal file
510
gnu/usr.bin/send-pr/send-pr.sh
Normal file
@ -0,0 +1,510 @@
|
||||
#!/bin/sh
|
||||
# Submit a problem report to a GNATS site.
|
||||
# Copyright (C) 1993 Free Software Foundation, Inc.
|
||||
# Contributed by Brendan Kehoe (brendan@cygnus.com), based on a
|
||||
# version written by Heinz G. Seidl (hgs@ide.com).
|
||||
#
|
||||
# This file is part of GNU GNATS.
|
||||
#
|
||||
# GNU GNATS is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# GNU GNATS 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 GNU GNATS; see the file COPYING. If not, write to
|
||||
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
# The version of this send-pr.
|
||||
VERSION=3.01.6
|
||||
|
||||
# The submitter-id for your site.
|
||||
SUBMITTER=net
|
||||
|
||||
# Where the GNATS directory lives, if at all.
|
||||
[ -z "$GNATS_ROOT" ] &&
|
||||
GNATS_ROOT=/b/gnats
|
||||
|
||||
# The default mail address for PR submissions.
|
||||
GNATS_ADDR=gnats-bugs@sun-lamp.cs.berkeley.edu
|
||||
|
||||
# Where the gnats category tree lives.
|
||||
DATADIR=/usr/lib/gnats
|
||||
|
||||
# If we've been moved around, try using GCC_EXEC_PREFIX.
|
||||
[ ! -d $DATADIR/gnats -a -d "$GCC_EXEC_PREFIX" ] && DATADIR=${GCC_EXEC_PREFIX}..
|
||||
|
||||
# The default release for this host.
|
||||
DEFAULT_RELEASE=""
|
||||
|
||||
# The default organization.
|
||||
DEFAULT_ORGANIZATION=""
|
||||
|
||||
# The default site to look for.
|
||||
GNATS_SITE=sun-lamp
|
||||
|
||||
# Newer config information?
|
||||
[ -f ${GNATS_ROOT}/gnats-adm/config ] && . ${GNATS_ROOT}/gnats-adm/config
|
||||
|
||||
# What mailer to use. This must come after the config file, since it is
|
||||
# host-dependent.
|
||||
MAIL_AGENT="/usr/sbin/sendmail -oi -t"
|
||||
|
||||
#
|
||||
|
||||
[ -z "$TMPDIR" ] && TMPDIR=/tmp
|
||||
|
||||
TEMP=$TMPDIR/p$$
|
||||
BAD=$TMPDIR/pbad$$
|
||||
REF=$TMPDIR/pf$$
|
||||
|
||||
if [ -z "$HOSTNAME" ]; then
|
||||
if [ -f /bin/hostname ] ; then HOSTNAME=`/bin/hostname`
|
||||
elif [ -f /usr/bin/hostname ] ; then HOSTNAME=`/usr/bin/hostname`
|
||||
# Solaris et al.
|
||||
elif [ -f /usr/ucb/hostname ] ; then HOSTNAME=`/usr/ucb/hostname`
|
||||
# Irix
|
||||
elif [ -f /usr/bsd/hostname ] ; then HOSTNAME=`/usr/bsd/hostname`
|
||||
else echo "$COMMAND: HOSTNAME not set and hostname not found"; exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$LOGNAME" -a -n "$USER" ]; then
|
||||
LOGNAME=$USER
|
||||
fi
|
||||
if [ -z "$LOGNAME" ]; then
|
||||
FROM=
|
||||
REPLY_TO=
|
||||
else
|
||||
FROM="$LOGNAME@$HOSTNAME"
|
||||
REPLY_TO="$LOGNAME@$HOSTNAME"
|
||||
fi
|
||||
|
||||
# Find out the name of the originator of this PR.
|
||||
if [ -n "$NAME" ]; then
|
||||
ORIGINATOR="$NAME"
|
||||
elif [ -f $HOME/.fullname ]; then
|
||||
ORIGINATOR="`sed -e '1q' $HOME/.fullname`"
|
||||
elif [ -f /bin/domainname ]; then
|
||||
if [ "`/bin/domainname`" != "" -a -f /usr/bin/ypcat ]; then
|
||||
# Must use temp file due to incompatibilities in quoting behavior
|
||||
# and to protect shell metacharacters in the expansion of $LOGNAME
|
||||
/usr/bin/ypcat passwd 2>/dev/null | cat - /etc/passwd | grep "^$LOGNAME:" |
|
||||
cut -f5 -d':' | sed -e 's/,.*//' > $TEMP
|
||||
ORIGINATOR="`cat $TEMP`"
|
||||
rm -f $TEMP
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$ORIGINATOR" = "" ]; then
|
||||
grep "^$LOGNAME:" /etc/passwd | cut -f5 -d':' | sed -e 's/,.*//' > $TEMP
|
||||
ORIGINATOR="`cat $TEMP`"
|
||||
rm -f $TEMP
|
||||
fi
|
||||
|
||||
if [ -n "$ORGANIZATION" ]; then
|
||||
if [ -f "$ORGANIZATION" ]; then
|
||||
ORGANIZATION="`cat $ORGANIZATION`"
|
||||
fi
|
||||
else
|
||||
if [ -n "$DEFAULT_ORGANIZATION" ]; then
|
||||
ORGANIZATION="$DEFAULT_ORGANIZATION"
|
||||
elif [ -f $HOME/.organization ]; then
|
||||
ORGANIZATION="`cat $HOME/.organization`"
|
||||
elif [ -f $HOME/.signature ]; then
|
||||
ORGANIZATION="`cat $HOME/.signature`"
|
||||
fi
|
||||
fi
|
||||
|
||||
# If they don't have a preferred editor set, then use
|
||||
if [ -z "$VISUAL" ]; then
|
||||
if [ -z "$EDITOR" ]; then
|
||||
EDIT=vi
|
||||
else
|
||||
EDIT="$EDITOR"
|
||||
fi
|
||||
else
|
||||
EDIT="$VISUAL"
|
||||
fi
|
||||
|
||||
# Find out some information.
|
||||
SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \
|
||||
( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo ""`
|
||||
ARCH=`[ -f /bin/arch ] && /bin/arch`
|
||||
MACHINE=`[ -f /bin/machine ] && /bin/machine`
|
||||
|
||||
COMMAND=`echo $0 | sed -e 's,.*/,,'`
|
||||
USAGE="Usage: $COMMAND [-PVL] [-t address] [-f filename] [--request-id]
|
||||
[--version]"
|
||||
REMOVE=
|
||||
BATCH=
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
-r | -p) ;; # Ignore for backward compat.
|
||||
-t | --to) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
|
||||
shift ; GNATS_ADDR="$1"
|
||||
EXPLICIT_GNATS_ADDR=true
|
||||
;;
|
||||
-f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
|
||||
shift ; IN_FILE="$1"
|
||||
if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then
|
||||
echo "$COMMAND: cannot read $IN_FILE"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
-b | --batch) BATCH=true ;;
|
||||
-P | --print) PRINT=true ;;
|
||||
-L | --list) FORMAT=norm ;;
|
||||
-l | -CL | --lisp) FORMAT=lisp ;;
|
||||
--request-id) REQUEST_ID=true ;;
|
||||
-h | --help) echo "$USAGE"; exit 0 ;;
|
||||
-V | --version) echo "$VERSION"; exit 0 ;;
|
||||
-*) echo "$USAGE" ; exit 1 ;;
|
||||
*) if [ -z "$USER_GNATS_SITE" ]; then
|
||||
if [ ! -r "$DATADIR/gnats/$1" ]; then
|
||||
echo "$COMMAND: the GNATS site $1 does not have a categories list."
|
||||
exit 1
|
||||
else
|
||||
# The site name is the alias they'll have to have created.
|
||||
USER_GNATS_SITE=$1
|
||||
fi
|
||||
else
|
||||
echo "$USAGE" ; exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [ -n "$USER_GNATS_SITE" ]; then
|
||||
GNATS_SITE=$USER_GNATS_SITE
|
||||
GNATS_ADDR=$USER_GNATS_SITE-gnats
|
||||
fi
|
||||
|
||||
if [ "$SUBMITTER" = "unknown" -a -z "$REQUEST_ID" -a -z "$IN_FILE" ]; then
|
||||
cat << '__EOF__'
|
||||
It seems that send-pr is not installed with your unique submitter-id.
|
||||
You need to run
|
||||
|
||||
install-sid YOUR-SID
|
||||
|
||||
where YOUR-SID is the identification code you received with `send-pr'.
|
||||
`send-pr' will automatically insert this value into the template field
|
||||
`>Submitter-Id'. If you've downloaded `send-pr' from the Net, use `net'
|
||||
for this value. If you do not know your id, run `send-pr --request-id' to
|
||||
get one from your support site.
|
||||
__EOF__
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -r "$DATADIR/gnats/$GNATS_SITE" ]; then
|
||||
CATEGORIES=`grep -v '^#' $DATADIR/gnats/$GNATS_SITE | sort`
|
||||
else
|
||||
echo "$COMMAND: could not read $DATADIR/gnats/$GNATS_SITE for categories list."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$CATEGORIES" ]; then
|
||||
echo "$COMMAND: the categories list for $GNATS_SITE was empty!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case "$FORMAT" in
|
||||
lisp) echo "$CATEGORIES" | \
|
||||
awk 'BEGIN {printf "( "} {printf "(\"%s\") ",$0} END {printf ")\n"}'
|
||||
exit 0
|
||||
;;
|
||||
norm) echo "$CATEGORIES" | \
|
||||
awk 'BEGIN {print "Known categories:"; i = 1 }
|
||||
{ printf ("%-12.12s", $0); if ((++i % 5) == 0) { print "" } }
|
||||
END { print ""; }'
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
ORIGINATOR_C='<name of the PR author (one line)>'
|
||||
ORGANIZATION_C='<organization of PR author (multiple lines)>'
|
||||
CONFIDENTIAL_C='<[ yes | no ] (one line)>'
|
||||
SYNOPSIS_C='<synopsis of the problem (one line)>'
|
||||
SEVERITY_C='<[ non-critical | serious | critical ] (one line)>'
|
||||
PRIORITY_C='<[ low | medium | high ] (one line)>'
|
||||
CATEGORY_C='<name of the product (one line)>'
|
||||
CLASS_C='<[ sw-bug | doc-bug | change-request | support ] (one line)>'
|
||||
RELEASE_C='<release number or tag (one line)>'
|
||||
ENVIRONMENT_C='<machine, os, target, libraries (multiple lines)>'
|
||||
DESCRIPTION_C='<precise description of the problem (multiple lines)>'
|
||||
HOW_TO_REPEAT_C='<code/input/activities to reproduce the problem (multiple lines)>'
|
||||
FIX_C='<how to correct or work around the problem, if known (multiple lines)>'
|
||||
|
||||
# Catch some signals. ($xs kludge needed by Sun /bin/sh)
|
||||
xs=0
|
||||
trap 'rm -f $REF $TEMP; exit $xs' 0
|
||||
trap 'echo "$COMMAND: Aborting ..."; rm -f $REF $TEMP; xs=1; exit' 1 2 3 13 15
|
||||
|
||||
# If they told us to use a specific file, then do so.
|
||||
if [ -n "$IN_FILE" ]; then
|
||||
if [ "$IN_FILE" = "-" ]; then
|
||||
# The PR is coming from the standard input.
|
||||
if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
|
||||
sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" > $TEMP
|
||||
else
|
||||
cat > $TEMP
|
||||
fi
|
||||
else
|
||||
# Use the file they named.
|
||||
if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
|
||||
sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" $IN_FILE > $TEMP
|
||||
else
|
||||
cat $IN_FILE > $TEMP
|
||||
fi
|
||||
fi
|
||||
else
|
||||
|
||||
if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
|
||||
# If their PR_FORM points to a bogus entry, then bail.
|
||||
if [ ! -f "$PR_FORM" -o ! -r "$PR_FORM" -o ! -s "$PR_FORM" ]; then
|
||||
echo "$COMMAND: can't seem to read your template file (\`$PR_FORM'), ignoring PR_FORM"
|
||||
sleep 1
|
||||
PRINT_INTERN=bad_prform
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
|
||||
cp $PR_FORM $TEMP ||
|
||||
( echo "$COMMAND: could not copy $PR_FORM" ; xs=1; exit )
|
||||
else
|
||||
for file in $TEMP $REF ; do
|
||||
cat > $file << '__EOF__'
|
||||
SEND-PR: -*- send-pr -*-
|
||||
SEND-PR: Lines starting with `SEND-PR' will be removed automatically, as
|
||||
SEND-PR: will all comments (text enclosed in `<' and `>').
|
||||
SEND-PR:
|
||||
SEND-PR: Please consult the send-pr man page `send-pr(1)' or the Texinfo
|
||||
SEND-PR: manual if you are not sure how to fill out a problem report.
|
||||
SEND-PR:
|
||||
SEND-PR: Choose from the following categories:
|
||||
SEND-PR:
|
||||
__EOF__
|
||||
|
||||
# Format the categories so they fit onto lines.
|
||||
echo "$CATEGORIES" | awk '
|
||||
BEGIN { printf "SEND-PR: "; i = 1 }
|
||||
{ printf ("%-12.12s", $0) ;
|
||||
if ((++i % 5) == 0) { printf "\nSEND-PR: "}}
|
||||
END { printf "\nSEND-PR:\n" }' >> $file
|
||||
|
||||
cat >> $file << __EOF__
|
||||
To: $GNATS_ADDR
|
||||
Subject:
|
||||
From: $FROM
|
||||
Reply-To: $REPLY_TO
|
||||
X-send-pr-version: $VERSION
|
||||
|
||||
>Submitter-Id: $SUBMITTER
|
||||
>Originator: $ORIGINATOR
|
||||
>Organization:
|
||||
`
|
||||
if [ -n "$ORGANIZATION" ]; then
|
||||
echo "$ORGANIZATION"
|
||||
else
|
||||
echo " $ORGANIZATION_C" ;
|
||||
fi ;
|
||||
`
|
||||
>Confidential: $CONFIDENTIAL_C
|
||||
>Synopsis: $SYNOPSIS_C
|
||||
>Severity: $SEVERITY_C
|
||||
>Priority: $PRIORITY_C
|
||||
>Category: $CATEGORY_C
|
||||
>Class: $CLASS_C
|
||||
>Release: `if [ -n "$DEFAULT_RELEASE" ]; then
|
||||
echo "$DEFAULT_RELEASE"
|
||||
else
|
||||
echo " $RELEASE_C"
|
||||
fi; `
|
||||
>Environment:
|
||||
$ENVIRONMENT_C
|
||||
`[ -n "$SYSTEM" ] && echo System: $SYSTEM`
|
||||
`[ -n "$ARCH" ] && echo Architecture: $ARCH`
|
||||
`[ -n "$MACHINE" ] && echo Machine: $MACHINE`
|
||||
>Description:
|
||||
$DESCRIPTION_C
|
||||
>How-To-Repeat:
|
||||
$HOW_TO_REPEAT_C
|
||||
>Fix:
|
||||
$FIX_C
|
||||
__EOF__
|
||||
done
|
||||
fi
|
||||
|
||||
if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then
|
||||
cat $TEMP
|
||||
xs=0; exit
|
||||
fi
|
||||
|
||||
chmod u+w $TEMP
|
||||
if [ -z "$REQUEST_ID" ]; then
|
||||
eval $EDIT $TEMP
|
||||
else
|
||||
ed -s $TEMP << '__EOF__'
|
||||
/^Subject/s/^Subject:.*/Subject: request for a customer id/
|
||||
/^>Category/s/^>Category:.*/>Category: send-pr/
|
||||
w
|
||||
q
|
||||
__EOF__
|
||||
fi
|
||||
|
||||
if cmp -s $REF $TEMP ; then
|
||||
echo "$COMMAND: problem report not filled out, therefore not sent"
|
||||
xs=1; exit
|
||||
fi
|
||||
fi
|
||||
|
||||
#
|
||||
# Check the enumeration fields
|
||||
|
||||
# This is a "sed-subroutine" with one keyword parameter
|
||||
# (with workaround for Sun sed bug)
|
||||
#
|
||||
SED_CMD='
|
||||
/$PATTERN/{
|
||||
s|||
|
||||
s|<.*>||
|
||||
s|^[ ]*||
|
||||
s|[ ]*$||
|
||||
p
|
||||
q
|
||||
}'
|
||||
|
||||
|
||||
while [ -z "$REQUEST_ID" ]; do
|
||||
CNT=0
|
||||
|
||||
# 1) Confidential
|
||||
#
|
||||
PATTERN=">Confidential:"
|
||||
CONFIDENTIAL=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
|
||||
case "$CONFIDENTIAL" in
|
||||
""|yes|no) CNT=`expr $CNT + 1` ;;
|
||||
*) echo "$COMMAND: \`$CONFIDENTIAL' is not a valid value for \`Confidential'." ;;
|
||||
esac
|
||||
#
|
||||
# 2) Severity
|
||||
#
|
||||
PATTERN=">Severity:"
|
||||
SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
|
||||
case "$SEVERITY" in
|
||||
""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;;
|
||||
*) echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'."
|
||||
esac
|
||||
#
|
||||
# 3) Priority
|
||||
#
|
||||
PATTERN=">Priority:"
|
||||
PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
|
||||
case "$PRIORITY" in
|
||||
""|low|medium|high) CNT=`expr $CNT + 1` ;;
|
||||
*) echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'."
|
||||
esac
|
||||
#
|
||||
# 4) Category
|
||||
#
|
||||
PATTERN=">Category:"
|
||||
CATEGORY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
|
||||
FOUND=
|
||||
for C in $CATEGORIES
|
||||
do
|
||||
if [ "$C" = "$CATEGORY" ]; then FOUND=true ; break ; fi
|
||||
done
|
||||
if [ -n "$FOUND" ]; then
|
||||
CNT=`expr $CNT + 1`
|
||||
else
|
||||
if [ -z "$CATEGORY" ]; then
|
||||
echo "$COMMAND: you must include a Category: field in your report."
|
||||
else
|
||||
echo "$COMMAND: \`$CATEGORY' is not a known category."
|
||||
fi
|
||||
fi
|
||||
#
|
||||
# 5) Class
|
||||
#
|
||||
PATTERN=">Class:"
|
||||
CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
|
||||
case "$CLASS" in
|
||||
""|sw-bug|doc-bug|change-request|support) CNT=`expr $CNT + 1` ;;
|
||||
*) echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'."
|
||||
esac
|
||||
|
||||
[ $CNT -lt 5 -a -z "$BATCH" ] &&
|
||||
echo "Errors were found with the problem report."
|
||||
|
||||
while true; do
|
||||
if [ -z "$BATCH" ]; then
|
||||
echo -n "a)bort, e)dit or s)end? "
|
||||
read input
|
||||
else
|
||||
if [ $CNT -eq 5 ]; then
|
||||
input=s
|
||||
else
|
||||
input=a
|
||||
fi
|
||||
fi
|
||||
case "$input" in
|
||||
a*)
|
||||
if [ -z "$BATCH" ]; then
|
||||
echo "$COMMAND: the problem report remains in $BAD and is not sent."
|
||||
mv $TEMP $BAD
|
||||
else
|
||||
echo "$COMMAND: the problem report is not sent."
|
||||
fi
|
||||
xs=1; exit
|
||||
;;
|
||||
e*)
|
||||
eval $EDIT $TEMP
|
||||
continue 2
|
||||
;;
|
||||
s*)
|
||||
break 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
done
|
||||
#
|
||||
# Remove comments and send the problem report
|
||||
# (we have to use patterns, where the comment contains regex chars)
|
||||
#
|
||||
# /^>Originator:/s;$ORIGINATOR;;
|
||||
sed -e "
|
||||
/^SEND-PR:/d
|
||||
/^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;;
|
||||
/^>Confidential:/s;<.*>;;
|
||||
/^>Synopsis:/s;$SYNOPSIS_C;;
|
||||
/^>Severity:/s;<.*>;;
|
||||
/^>Priority:/s;<.*>;;
|
||||
/^>Category:/s;$CATEGORY_C;;
|
||||
/^>Class:/s;<.*>;;
|
||||
/^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;;
|
||||
/^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;;
|
||||
/^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;;
|
||||
/^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;;
|
||||
/^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;;
|
||||
" $TEMP > $REF
|
||||
|
||||
if $MAIL_AGENT < $REF; then
|
||||
echo "$COMMAND: problem report sent"
|
||||
xs=0; exit
|
||||
else
|
||||
echo "$COMMAND: mysterious mail failure."
|
||||
if [ -z "$BATCH" ]; then
|
||||
echo "$COMMAND: the problem report remains in $BAD and is not sent."
|
||||
mv $REF $BAD
|
||||
else
|
||||
echo "$COMMAND: the problem report is not sent."
|
||||
fi
|
||||
xs=1; exit
|
||||
fi
|
Loading…
Reference in New Issue
Block a user