From f034a464d6e536eebfb37cc788558ad613564db8 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Wed, 4 Mar 2009 20:39:56 +0100 Subject: [PATCH] Various gnupload improvements. Add support for uploading to download.gnu.org.ua. Add support for a .gnupload configuration file. Support creating and removing symlinks. Allow for several operations in a single invocation. Add debugging features. * lib/gnupload: New options --delete, --symlink, --rmsymlink, --symlink-regex, --dry-run; support `--' to separate options and commands from files. New target download.gnu.org.ua. Expand `.gnupload' file contents before command line arguments. (usage): Expand. (dprint, mkdirective, mksymlink, upload): New functions. * THANKS: Update. Signed-off-by: Ralf Wildenhues --- ChangeLog | 16 +++ THANKS | 1 + lib/gnupload | 397 +++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 307 insertions(+), 107 deletions(-) diff --git a/ChangeLog b/ChangeLog index b82133d91..a45f4e750 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2009-03-04 Sergey Poznyakoff + + Various gnupload improvements. + Add support for uploading to download.gnu.org.ua. + Add support for a .gnupload configuration file. + Support creating and removing symlinks. + Allow for several operations in a single invocation. + Add debugging features. + * lib/gnupload: New options --delete, --symlink, --rmsymlink, + --symlink-regex, --dry-run; support `--' to separate options and + commands from files. New target download.gnu.org.ua. Expand + `.gnupload' file contents before command line arguments. + (usage): Expand. + (dprint, mkdirective, mksymlink, upload): New functions. + * THANKS: Update. + 2009-03-03 Peter Rosin Add depmode=msvcmsys for Microsoft Visual C++ on MSYS. diff --git a/THANKS b/THANKS index aed4ad6db..25de1e386 100644 --- a/THANKS +++ b/THANKS @@ -293,6 +293,7 @@ Sam Steingold sds@gnu.org Sander Niemeijer niemeijer@science-and-technology.nl Santiago Vila sanvila@unex.es Scott James Remnant scott@netsplit.com +Sergey Poznyakoff gray@gnu.org.ua Sergey Vlasov vsu@mivlgu.murom.ru Seth Alves alves@hungry.com Shannon L. Brown slbrow@sandia.gov diff --git a/lib/gnupload b/lib/gnupload index 5d4289ffc..a87c13f5c 100755 --- a/lib/gnupload +++ b/lib/gnupload @@ -1,9 +1,9 @@ #!/bin/sh # Sign files and upload them. -scriptversion=2009-01-30.00 +scriptversion=2009-03-04.20 -# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation +# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 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 @@ -24,100 +24,193 @@ set -e GPG='gpg --batch --no-tty' to= -delete=false +dry_run= +symlink_files= +delete_files= +delete_symlinks= +collect_var= +dbg= -usage="Usage: $0 [OPTIONS]... FILES... +usage="Usage: $0 [OPTIONS]... [COMMAND] FILES... [[COMMAND] FILES...] -Sign all FILES, and upload them to (or delete them from) selected -destinations, according to +Sign all FILES, and upload them to selected destinations, according to . +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 - --delete delete FILES from destination instead of uploading + --symlink-regex[=SED-EXPR] use SED-EXPR to create symbolic links + --dry-run do nothing, show what would have been done --version output version information and exit +If --symlink-re is given without SED-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 -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. +If the file .gnupload 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 .gnupload are allowed. -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 +Examples: +1. Upload automake-1.8.2b.tar.gz and automake-1.8.2b.tar.bz2 to two sites: + 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 -Multiple-target multiple-file example: +2. Same as above, but also create symbolic links to automake-latest.tar.*: gnupload --to sources.redhat.com:~ftp/pub/automake \\ --to alpha.gnu.org:automake \\ + --symlink-regex \\ automake-1.8.2b.tar.gz automake-1.8.2b.tar.bz2 -You can get the latest version of this script from savannah: - +3. Symlink automake-1.8.2b.tar.gz to automake-latest.tar.gz and +automake-1.8.2b.tar.bz2 to automake-latest.tar.bz2 on both sites: + + gnupload --to sources.redhat.com:~ftp/pub/automake \\ + --to alpha.gnu.org:automake \\ + --symlink automake-1.8.2b.tar.gz automake-latest.tar.gz \\ + automake-1.8.2b.tar.bz2 automake-latest.tar.bz2 + +4. Delete automake-1.8.2a.tar.gz and .bz2, remove symlink +automake-latest.tar.gz and upload automake-1.8.2b.tar.gz: + + gnupload --to sources.redhat.com:~ftp/pub/automake \\ + --to alpha.gnu.org:automake \\ + --delete automake-1.8.2a.tar.gz automake-1.8.2a.tar.bz2 \\ + --rmsymlink automake-latest.tar.gz \\ + -- \\ + automake-1.8.2b.tar.gz automake-1.8.2b.tar.bz2 Report bugs to . Send patches to ." +# Read local configuration file +if test -r .gnupload; then + echo "$0: Reading configuration file .gnupload" + eval set -- "`sed 's/#.*$//;/^$/d' .gnupload | tr '\012\015' ' '` $@" +fi + 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 + -*) collect_var= + case $1 in + --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 + ;; + --delete) + collect_var=delete_files + shift + ;; + --rmsymlink) + collect_var=delete_symlinks + shift + ;; + --symlink-regex=*) + symlink_expr=`expr "$1" : '[^=]*=\(.*\)'` + shift + ;; + --symlink-regex) + symlink_expr='s|-[0-9][0-9\.]*\(-[0-9][0-9]*\)\{0,1\}\.|-latest.|' + shift + ;; + --symlink) + collect_var=symlink_files + shift + ;; + --dry-run|-n) + dry_run=1 + shift + ;; + --version) + echo "gnupload $scriptversion" + exit $? + ;; + --) + shift + break + ;; + -*) + echo "$0: Unknown option \`$1', try \`$0 --help'" 1>&2 + exit 1 + ;; + esac ;; - --user) - if test -z "$2"; then - echo "$0: Missing argument for --user" 1>&2 - exit 1 + *) if test -z "$collect_var"; then + break else - GPG="$GPG --local-user $2" - shift 2 + eval $collect_var=\"\$$collect_var \"$1\"\" + shift 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 +dprint() +{ + echo "Running $*..." +} + +if test -n "$dry_run"; then + dbg=dprint +fi + +if test -z "$to"; then + echo "$0: Missing destination sites" >&2 exit 1 -else - : fi -if $delete; then :; else +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 + fi +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 @@ -125,8 +218,15 @@ if $delete; then :; else if test ! -f $file; then echo "$0: Cannot find \`$file'" 1>&2 exit 1 - else - : + 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 @@ -146,8 +246,7 @@ read -r passphrase stty echo echo -# Nothing to sign if deleting. -if $delete; then :; else +if test $# -ne 0; then for file do echo "Signing $file..." @@ -156,59 +255,143 @@ if $delete; then :; else 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/*) + mkdirective "${destdir#*/}" "$base" "$file" "$stmt" + echo "$passphrase" | $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%%/*} + ;; + /*) + mkdirective "$destdir" "$base" "$file" "$stmt" + echo "$passphrase" | $GPG --passphrase-fd 0 --clearsign $base.directive + $dbg cp $files $base.directive.asc ${dest%%:*} + ;; + *) + 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 + 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 - # 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 + 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<