X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=build-aux%2Fgnupload;h=d4450753821d7864f19e9d525ed96fd71793e0de;hb=b187ff0528e2a081392a834e684d1d0c161708a7;hp=34dfa70e1c1de7029e0793b239526174d2dd7efc;hpb=986fe5066f259bb5e1a762b0fbf5343ca913db3a;p=gnulib.git
diff --git a/build-aux/gnupload b/build-aux/gnupload
index 34dfa70e1..d44507538 100755
--- a/build-aux/gnupload
+++ b/build-aux/gnupload
@@ -1,9 +1,10 @@
#!/bin/sh
# Sign files and upload them.
-scriptversion=2007-06-30.12
+scriptversion=2010-02-08.07; # UTC
-# Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation
+# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
#
# 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
@@ -16,101 +17,219 @@ scriptversion=2007-06-30.12
# 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., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program. If not, see .
# Originally written by Alexandre Duret-Lutz .
set -e
-GPG='/usr/bin/gpg --batch --no-tty'
+GPG='gpg --batch --no-tty'
+conffile=.gnuploadrc
to=
+dry_run=false
+symlink_files=
+delete_files=
+delete_symlinks=
+collect_var=
+dbg=
-usage="Usage: $0 [OPTIONS]... FILES...
+usage="Usage: $0 [OPTION]... [CMD] FILE... [[CMD] FILE...]
-Sign all FILES, and upload them to selected destinations, according to
-.
+Sign all FILES, and process them at selected destinations according to CMD.
+
+explains further.
+
+Commands:
+ --delete delete FILES from destination
+ --symlink create symbolic links
+ --rmsymlink remove symbolic links
+ -- treat the remaining arguments as files to upload
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
+ --symlink-regex[=EXPR] use sed script EXPR to compute symbolic link names
+ --dry-run do nothing, show what would have been done
--version output version information and exit
+If --symlink-regex is given without EXPR, then the link target name
+is created by replacing the version information with \`-latest', e.g.:
+
+ foo-1.3.4.tar.gz -> foo-latest.tar.gz
+
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
+ download.gnu.org.ua:{alpha|ftp}/DIRECTORY
+ build directive files and upload files by SFTP
[user@]host:DIRECTORY upload files with scp
-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
+Options and commands are applied in order. If the file $conffile exists
+in the current working directory, its contents are prepended to the
+actual command line options. Use this to keep your defaults. Comments
+(#) and empty lines in $conffile are allowed.
+
+Examples:
+1. Upload foobar-1.0.tar.gz to ftp.gnu.org:
+ gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz
+
+2. Upload foobar-1.0.tar.gz and foobar-1.0.tar.xz to ftp.gnu.org:
+ gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz foobar-1.0.tar.xz
+
+3. Same as above, and also create symbolic links to foobar-latest.tar.*:
+ gnupload --to ftp.gnu.org:foobar \\
+ --symlink-regex \\
+ foobar-1.0.tar.gz foobar-1.0.tar.xz
+
+4. Upload foobar-0.9.90.tar.gz to two sites:
+ gnupload --to alpha.gnu.org:foobar \\
+ --to sources.redhat.com:~ftp/pub/foobar \\
+ foobar-0.9.90.tar.gz
+
+5. Delete oopsbar-0.9.91.tar.gz and upload foobar-0.9.91.tar.gz
+ (the -- terminates the list of files to delete):
+ gnupload --to alpha.gnu.org:foobar \\
+ --to sources.redhat.com:~ftp/pub/foobar \\
+ --delete oopsbar-0.9.91.tar.gz \\
+ -- foobar-0.9.91.tar.gz
+
+gnupload uses the ncftpput program to do the transfers; if you don't
+happen to have an ncftp package installed, the ncftpput-ftp script in
+the build-aux/ directory of the gnulib package
+(http://savannah.gnu.org/projects/gnulib) may serve as a replacement.
Report bugs to .
Send patches to ."
+# Read local configuration file
+if test -r "$conffile"; then
+ echo "$0: Reading configuration file $conffile"
+ eval set x "`sed 's/#.*$//;/^$/d' \"$conffile\" | tr '\012\015' ' '` \"\$@\""
+ shift
+fi
+
while test -n "$1"; do
case $1 in
+ -*)
+ collect_var=
+ case $1 in
--help)
echo "$usage"
exit $?
;;
--to)
if test -z "$2"; then
- echo "$0: Missing argument for --to" 1>&2
+ echo "$0: Missing argument for --to" 1>&2
exit 1
else
to="$to $2"
- shift 2
+ shift
fi
;;
--user)
if test -z "$2"; then
- echo "$0: Missing argument for --user" 1>&2
+ echo "$0: Missing argument for --user" 1>&2
exit 1
else
GPG="$GPG --local-user $2"
- shift 2
+ shift
fi
;;
+ --delete)
+ collect_var=delete_files
+ ;;
+ --rmsymlink)
+ collect_var=delete_symlinks
+ ;;
+ --symlink-regex=*)
+ symlink_expr=`expr "$1" : '[^=]*=\(.*\)'`
+ ;;
+ --symlink-regex)
+ symlink_expr='s|-[0-9][0-9\.]*\(-[0-9][0-9]*\)\{0,1\}\.|-latest.|'
+ ;;
+ --symlink)
+ collect_var=symlink_files
+ ;;
+ --dry-run|-n)
+ dry_run=:
+ ;;
--version)
echo "gnupload $scriptversion"
exit $?
;;
+ --)
+ shift
+ break
+ ;;
-*)
echo "$0: Unknown option \`$1', try \`$0 --help'" 1>&2
exit 1
;;
- *)
+ esac
+ ;;
+ *)
+ if test -z "$collect_var"; then
break
- ;;
+ else
+ eval "$collect_var=\"\$$collect_var $1\""
+ fi
+ ;;
esac
+ shift
done
-if test $# = 0; then
- echo "$0: No file to upload" 1>&2
+dprint()
+{
+ echo "Running $*..."
+}
+
+if $dry_run; then
+ dbg=dprint
+fi
+
+if test -z "$to"; then
+ echo "$0: Missing destination sites" >&2
exit 1
-else
- :
fi
-# 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
+if test -n "$symlink_files"; then
+ x=`echo "$symlink_files" | sed 's/[^ ]//g;s/ //g'`
+ if test -n "$x"; then
+ echo "$0: Odd number of symlink arguments" >&2
exit 1
- else
- :
fi
-done
+fi
+
+if test $# = 0; then
+ if test -z "${symlink_files}${delete_files}${delete_symlinks}"; then
+ echo "$0: No file to upload" 1>&2
+ exit 1
+ fi
+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
+ elif test -n "$symlink_expr"; then
+ linkname=`echo $file | sed "$symlink_expr"`
+ if test -z "$linkname"; then
+ echo "$0: symlink expression produces empty results" >&2
+ exit 1
+ elif test "$linkname" = $file; then
+ echo "$0: symlink expression does not alter file name" >&2
+ exit 1
+ fi
+ fi
+ done
+fi
# Make sure passphrase is not exported in the environment.
unset passphrase
@@ -127,59 +246,168 @@ read -r passphrase
stty echo
echo
-for file
+if test $# -ne 0; then
+ for file
+ do
+ echo "Signing $file..."
+ rm -f $file.sig
+ echo "$passphrase" | $dbg $GPG --passphrase-fd 0 -ba -o $file.sig $file
+ done
+fi
+
+
+# mkdirective DESTDIR BASE FILE STMT
+# Arguments: See upload, below
+mkdirective ()
+{
+ stmt="$4"
+ if test -n "$3"; then
+ stmt="
+filename: $3$stmt"
+ fi
+
+ cat >${2}.directive<&2
+ fi
+ $dbg ncftpput savannah.gnu.org /incoming/savannah/$destdir $files
+ ;;
+ savannah.nongnu.org:*)
+ if test -z "$files"; then
+ echo "$0: warning: standalone directives not applicable for $dest" >&2
+ fi
+ $dbg ncftpput savannah.nongnu.org /incoming/savannah/$destdir $files
+ ;;
+ download.gnu.org.ua:alpha/*|download.gnu.org.ua:ftp/*)
+ destdir_p1=`echo "$destdir" | sed 's,^[^/]*/,,'`
+ destdir_topdir=`echo "$destdir" | sed 's,/.*,,'`
+ mkdirective "$destdir_p1" "$base" "$file" "$stmt"
+ echo "$passphrase" | $dbg $GPG --passphrase-fd 0 --clearsign $base.directive
+ for f in $files $base.directive.asc
+ do
+ echo put $f
+ done | $dbg sftp -b - puszcza.gnu.org.ua:/incoming/$destdir_topdir
+ ;;
+ /*)
+ dest_host=`echo "$dest" | sed 's,:.*,,'`
+ mkdirective "$destdir" "$base" "$file" "$stmt"
+ echo "$passphrase" | $dbg $GPG --passphrase-fd 0 --clearsign $base.directive
+ $dbg cp $files $base.directive.asc $dest_host
+ ;;
+ *)
+ if test -z "$files"; then
+ echo "$0: warning: standalone directives not applicable for $dest" >&2
+ fi
+ $dbg scp $files $dest
+ ;;
+ esac
+ rm -f $base.directive $base.directive.asc
+}
+
+#####
+# Process any standalone directives
+stmt=
+if test -n "$symlink_files"; then
+ stmt="$stmt
+`mksymlink $symlink_files`"
+fi
+
+for file in $delete_files
+do
+ stmt="$stmt
+archive: $file"
+done
+
+for file in $delete_symlinks
do
- echo "Signing $file..."
- rm -f $file.sig
- echo $passphrase | $GPG --passphrase-fd 0 -ba -o $file.sig $file
+ stmt="$stmt
+rmsymlink: $file"
done
+if test -n "$stmt"; then
+ for dest in $to
+ do
+ destdir=`echo $dest | sed 's/[^:]*://'`
+ upload "$dest" "$destdir" "`hostname`-$$" "" "$stmt"
+ done
+fi
+
+# Process actual uploads
for dest in $to
do
for file
do
echo "Uploading $file to $dest..."
+ stmt=
files="$file $file.sig"
destdir=`echo $dest | sed 's/[^:]*://'`
- case $dest in
- alpha.gnu.org:*)
- rm -f $file.directive $file.directive.asc
- cat >$file.directive<$file.directive<