summaryrefslogtreecommitdiffstats
path: root/scripts/who-uploads.sh
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xscripts/who-uploads.sh278
1 files changed, 278 insertions, 0 deletions
diff --git a/scripts/who-uploads.sh b/scripts/who-uploads.sh
new file mode 100755
index 0000000..17edd16
--- /dev/null
+++ b/scripts/who-uploads.sh
@@ -0,0 +1,278 @@
+#!/bin/bash
+
+# who-uploads sourcepkg [ sourcepkg ... ]
+# Tells you who made the latest uploads of a source package.
+# NB: I'm encoded in UTF-8!!
+
+# Written and copyright 2006 by Julian Gilbey <jdg@debian.org>
+# Based on an original script
+# copyright 2006 Adeodato Simó <dato@net.com.org.es>
+#
+# 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, see <https://www.gnu.org/licenses/>.
+
+set -e
+
+PROGNAME=${0##*/}
+MODIFIED_CONF_MSG='Default settings modified by devscripts configuration files:'
+
+usage() {
+ echo \
+"Usage: $PROGNAME [options] package ...
+ Display the most recent three uploaders of each package.
+ Packages should be source packages, not binary packages.
+
+ Options:
+ -M, --max-uploads=N
+ Display at most the N most recent uploads (default: 3)
+ --keyring KEYRING Add KEYRING as a GPG keyring for Debian Developers'
+ keys in addition to /usr/share/keyrings/debian-keyring.*,
+ /usr/share/keyrings/debian-maintainers.gpg and
+ /usr/share/keyrings/debian-nonupload.gpg;
+ this option may be given multiple times
+ --no-default-keyrings
+ Do not use the default keyrings
+ --no-conf, --noconf
+ Don't read devscripts config files;
+ must be the first option given
+ --date Display the date of the upload
+ --no-date, --nodate
+ Don't display the date of the upload (default)
+ --help Show this message
+ --version Show version and copyright information
+
+$MODIFIED_CONF_MSG"
+}
+
+version() {
+ echo \
+"This is $PROGNAME, from the Debian devscripts package, version ###VERSION###
+This code is copyright 2006 by Julian Gilbey <jdg@debian.org>,
+all rights reserved.
+Based on original code copyright 2006 Adeodato Simó <dato@net.com.org.es>
+This program comes with ABSOLUTELY NO WARRANTY.
+You are free to redistribute this code under the terms of the
+GNU General Public License, version 2 or later."
+}
+
+
+# Boilerplate: set config variables
+DEFAULT_WHOUPLOADS_KEYRINGS=/usr/share/keyrings/debian-keyring.gpg:/usr/share/keyrings/debian-maintainers.gpg:/usr/share/keyrings/debian-nonupload.gpg
+DEFAULT_WHOUPLOADS_MAXUPLOADS=3
+DEFAULT_WHOUPLOADS_DATE=no
+VARS="WHOUPLOADS_KEYRINGS WHOUPLOADS_MAXUPLOADS WHOUPLOADS_DATE"
+
+GPG=gpg
+if ! command -v $GPG > /dev/null; then
+ echo "$GPG missing"
+ GPG=gpg2
+ if ! command -v $GPG > /dev/null; then
+ echo "$GPG missing"
+ exit 1
+ fi
+fi
+
+if [ "$1" = "--no-conf" -o "$1" = "--noconf" ]; then
+ shift
+ MODIFIED_CONF_MSG="$MODIFIED_CONF_MSG
+ (no configuration files read)"
+
+ # set defaults
+ for var in $VARS; do
+ eval "$var=\$DEFAULT_$var"
+ done
+else
+ # Run in a subshell for protection against accidental errors
+ # in the config files
+ eval $(
+ set +e
+ for var in $VARS; do
+ eval "$var=\$DEFAULT_$var"
+ done
+
+ for file in /etc/devscripts.conf ~/.devscripts
+ do
+ [ -r $file ] && . $file
+ done
+
+ set | grep "^WHOUPLOADS_")
+
+ # check sanity
+ if [ "$WHOUPLOADS_MAXUPLOADS" != \
+ "$(echo \"$WHOUPLOADS_MAXUPLOADS\" | tr -cd 0-9)" ]; then
+ WHOUPLOADS_MAXUPLOADS=3
+ fi
+
+ WHOUPLOADS_DATE="$(echo "$WHOUPLOADS_DATE" | tr A-Z a-z)"
+ if [ "$WHOUPLOADS_DATE" != "yes" ] && [ "$WHOUPLOADS_DATE" != "no" ]; then
+ WHOUPLOADS_DATE=no
+ fi
+
+ # don't check WHOUPLOADS_KEYRINGS here
+
+ # set config message
+ MODIFIED_CONF=''
+ for var in $VARS; do
+ eval "if [ \"\$$var\" != \"\$DEFAULT_$var\" ]; then
+ MODIFIED_CONF_MSG=\"\$MODIFIED_CONF_MSG
+ $var=\$$var\";
+ MODIFIED_CONF=yes;
+ fi"
+ done
+
+ if [ -z "$MODIFIED_CONF" ]; then
+ MODIFIED_CONF_MSG="$MODIFIED_CONF_MSG
+ (none)"
+ fi
+fi
+
+MAXUPLOADS=$WHOUPLOADS_MAXUPLOADS
+WANT_DATE=$WHOUPLOADS_DATE
+
+declare -a GPG_DEFAULT_KEYRINGS
+declare -a GPG_KEYRINGS
+
+# Command-line options
+TEMP=$(getopt -s bash -o 'h' \
+ --long max-uploads:,keyring:,no-default-keyrings \
+ --long no-conf,noconf \
+ --long date,nodate,no-date \
+ --long help,version \
+ --options M: \
+ -n "$PROGNAME" -- "$@") || (usage >&2; exit 1)
+
+eval set -- $TEMP
+
+# Process Parameters
+while [ "$1" ]; do
+ case $1 in
+ --max-uploads|-M)
+ shift
+ if [ "$1" = "$(echo \"$1\" | tr -cd 0-9)" ]; then
+ MAXUPLOADS=$1
+ fi
+ ;;
+ --keyring)
+ shift
+ if [ -f "$1" ]; then
+ GPG_KEYRINGS=("${GPG_KEYRINGS[@]}" "--keyring" "$1")
+ else
+ echo "Could not find keyring $1, skipping" >&2
+ fi
+ ;;
+ --no-default-keyrings)
+ WHOUPLOADS_KEYRINGS=
+ ;;
+ --no-conf|--noconf)
+ echo "$PROGNAME: $1 is only acceptable as the first command-line option!" >&2
+ exit 1 ;;
+ --date) WANT_DATE=yes ;;
+ --no-date|--nodate) WANT_DATE=no ;;
+ --help|-h) usage; exit 0 ;;
+ --version) version; exit 0 ;;
+ --) shift; break ;;
+ *) echo "$PROGNAME: bug in option parser, sorry!" >&2 ; exit 1 ;;
+ esac
+ shift
+done
+
+OIFS="$IFS"
+IFS=:
+
+for keyring in $WHOUPLOADS_KEYRINGS; do
+ if [ -f "$keyring" ]; then
+ GPG_DEFAULT_KEYRINGS=("${GPG_DEFAULT_KEYRINGS[@]}" "--keyring" "$keyring")
+ elif [ -n "$keyring" ]; then
+ echo "Could not find keyring $keyring, skipping it" >&2
+ fi
+done
+
+IFS="${OIFS:- }"
+
+GNUPGHOME=$(mktemp -d)
+exit_with_error() {
+ [ ! -d "$GNUPGHOME" ] || rm -r "$GNUPGHOME"
+ exit 1
+}
+trap exit_with_error HUP INT QUIT PIPE ALRM TERM
+export GNUPGHOME
+
+# Some useful abbreviations for gpg options
+GPG_OPTIONS="--no-options --no-auto-check-trustdb --no-default-keyring"
+GPG_NO_KEYRING="$GPG_OPTIONS --keyring /dev/null"
+
+if [ $# -eq 0 ]; then
+ usage;
+ exit 1
+fi
+
+# Now actually get the reports :)
+
+for package; do
+ echo "Uploads for $package:"
+
+ prefix=$(echo $package | sed -re 's/^((lib)?.).*$/\1/')
+ pkgurl="https://packages.qa.debian.org/${prefix}/${package}.html"
+ baseurl="https://packages.qa.debian.org/${prefix}/"
+
+ # only grab the actual "Accepted" news announcements; hopefully this
+ # won't pick up many false positives
+ WGETOPTS="-q -O - --timeout=30 "
+ count=0
+ for news in $(wget $WGETOPTS $pkgurl |
+ sed -ne 's%^.*<a href="\('$package'/news/[0-9A-Z]*\.html\)">Accepted .*%\1%p'); do
+ HTML_TEXT=$(wget $WGETOPTS "$baseurl$news")
+ GPG_TEXT=$(echo "$HTML_TEXT" |
+ sed -ne 's/^<pre>//; /-----BEGIN PGP SIGNED MESSAGE-----/,/-----END PGP SIGNATURE-----/p')
+
+ test -n "$GPG_TEXT" || continue
+
+ VERSION=$(echo "$GPG_TEXT" | awk '/^Version/ { print $2; exit }')
+ DISTRO=$(echo "$GPG_TEXT" | awk '/^Distribution/ { print $2; exit }')
+ if [ "$WANT_DATE" = "yes" ]; then
+ DATE=$(echo "$HTML_TEXT" | sed -ne 's%<li><em>Date</em>: \(.*\)</li>%\1%p')
+ fi
+
+ GPG_ID=$(echo "$GPG_TEXT" | LC_ALL=C $GPG $GPG_NO_KEYRING --keyid-format long --verify 2>&1 |
+ sed -rne 's/.*using [^ ]* key ([0-9A-Z]+).*/\1/p')
+
+ # First try to get the uid@debian.org email
+ UPLOADER=$($GPG $GPG_OPTIONS \
+ "${GPG_DEFAULT_KEYRINGS[@]}" "${GPG_KEYRINGS[@]}" \
+ --list-key --with-colons --fixed-list-mode $GPG_ID 2>/dev/null |
+ awk -F: '/@debian\.org/ { a = $10; exit} END { print a }' )
+
+ # If $UPLOADER is still null (no @debian.org email found), pull the next email uid
+ if [ -z "$UPLOADER" ]; then
+ UPLOADER=$($GPG $GPG_OPTIONS \
+ "${GPG_DEFAULT_KEYRINGS[@]}" "${GPG_KEYRINGS[@]}" \
+ --list-key --with-colons --fixed-list-mode $GPG_ID 2>/dev/null |
+ awk -F: '/^uid/ { a = $10; exit} END { print a }' )
+
+ fi
+
+ # If $UPLOADER is still null (no email found on the key) print the <unrecognized public key> message
+ if [ -z "$UPLOADER" ]; then UPLOADER="<unrecognised public key ($GPG_ID)>"; fi
+
+ output="$VERSION to $DISTRO: $UPLOADER"
+ [ "$WANT_DATE" = "yes" ] && output="$output on $DATE"
+ echo $output | iconv -c -f UTF-8
+
+ count=$(($count + 1))
+ [ $count -eq $MAXUPLOADS ] && break
+ done
+ test $# -eq 1 || echo
+done
+
+[ ! -d "$GNUPGHOME" ] || rm -r "$GNUPGHOME"
+exit 0