#!/bin/sh
# Sign files and upload them.
scriptversion=2008-11-12.21
# Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation
#
# 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 3, 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 .
# Originally written by Alexandre Duret-Lutz .
set -e
GPG='gpg --batch --no-tty'
to=
delete=false
usage="Usage: $0 [OPTIONS]... FILES...
Sign all FILES, and upload them to (or delete them from) selected
destinations, according to
.
Options:
--help print this help text and exit
--to DEST specify one destination for FILES
(multiple --to options are allowed)
--user NAME sign with key NAME
--delete delete FILES from destination instead of uploading
--version output version information and exit
Recognized destinations are:
alpha.gnu.org:DIRECTORY
savannah.gnu.org:DIRECTORY
savannah.nongnu.org:DIRECTORY
ftp.gnu.org:DIRECTORY
build directive files and upload files by FTP
[user@]host:DIRECTORY upload files with scp
Deletion only works for ftp.gnu.org and alpha.gnu.org (using the
archive: directive). Otherwise it is a no-op. Deleting a file foo also
deletes foo.sig; do not specify the .sig explicitly.
Simple single-target single-file examples:
gnupload --to alpha.gnu.org:automake automake-1.8.2b.tar.gz
gnupload --to ftp.gnu.org:automake automake-1.8.3.tar.gz
gnupload --to alpha.gnu.org:automake --delete automake-oops.tar.gz
Multiple-target multiple-file example:
gnupload --to sources.redhat.com:~ftp/pub/automake \\
--to alpha.gnu.org:automake \\
automake-1.8.2b.tar.gz automake-1.8.2b.tar.bz2
Report bugs to .
Send patches to ."
while test -n "$1"; do
case $1 in
--delete)
delete=true
shift
;;
--help)
echo "$usage"
exit $?
;;
--to)
if test -z "$2"; then
echo "$0: Missing argument for --to" 1>&2
exit 1
else
to="$to $2"
shift 2
fi
;;
--user)
if test -z "$2"; then
echo "$0: Missing argument for --user" 1>&2
exit 1
else
GPG="$GPG --local-user $2"
shift 2
fi
;;
--version)
echo "gnupload $scriptversion"
exit $?
;;
-*)
echo "$0: Unknown option \`$1', try \`$0 --help'" 1>&2
exit 1
;;
*)
break
;;
esac
done
if test $# = 0; then
echo "$0: No file to upload or delete" 1>&2
exit 1
else
:
fi
if $delete; then :; else
# Make sure all files exist. We don't want to ask
# for the passphrase if the script will fail.
for file
do
if test ! -f $file; then
echo "$0: Cannot find \`$file'" 1>&2
exit 1
else
:
fi
done
fi
# Make sure passphrase is not exported in the environment.
unset passphrase
# Reset PATH to be sure that echo is a built-in. We will later use
# `echo $passphrase' to output the passphrase, so it is important that
# it is a built-in (third-party programs tend to appear in `ps'
# listings with their arguments...).
# Remember this script runs with `set -e', so if echo is not built-in
# it will exit now.
PATH=/empty echo -n "Enter GPG passphrase: "
stty -echo
read -r passphrase
stty echo
echo
# Nothing to sign if deleting.
if $delete; then :; else
for file
do
echo "Signing $file..."
rm -f $file.sig
echo $passphrase | $GPG --passphrase-fd 0 -ba -o $file.sig $file
done
fi
for dest in $to
do
for file
do
# Prepare arguments.
if $delete; then
echo "Removing $file from $dest..."
files= # nothing to upload if deleting
directive="archive: $file"
else
echo "Uploading $file to $dest..."
files="$file $file.sig"
directive="filename: "`basename -- "$file"`
fi
destdir=`echo $dest | sed 's/[^:]*://'`
case $dest in
alpha.gnu.org:*)
rm -f $file.directive $file.directive.asc
cat >$file.directive<$file.directive<