It is not exactly simple to figure out how to delete (archive) files from ftp.gnu.org and alpha.gnu.org with the ftp directives, and anyway constructing the directive files and uploading them by hand is always a pain.
This patch adds a --delete option so gnupload can do it. It worked ok in my tests, FWIW. Wdyt? When/if it's included, I'll add a note to the maintainers manual about it. Thanks, Karl --- a/lib/gnupload +++ b/lib/gnupload @@ -24,10 +24,12 @@ set -e GPG='gpg --batch --no-tty' to= +delete=false usage="Usage: $0 [OPTIONS]... FILES... -Sign all FILES, and upload them to selected destinations, according to +Sign all FILES, and upload them to (or delete them from) selected +destinations, according to <http://www.gnu.org/prep/maintain/html_node/Automated-FTP-Uploads.html>. Options: @@ -35,6 +37,7 @@ Options: --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: @@ -45,9 +48,14 @@ Recognized destinations are: build directive files and upload files by FTP [EMAIL PROTECTED]: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 \\ @@ -59,6 +67,10 @@ Send patches to <[email protected]>." while test -n "$1"; do case $1 in + --delete) + delete=true + shift + ;; --help) echo "$usage" exit $? @@ -96,23 +108,25 @@ while test -n "$1"; do done if test $# = 0; then - echo "$0: No file to upload" 1>&2 + echo "$0: No file to upload or delete" 1>&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 - exit 1 - else - : - fi -done +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 @@ -129,27 +143,39 @@ read -r passphrase stty echo echo -for file -do - echo "Signing $file..." - rm -f $file.sig - echo $passphrase | $GPG --passphrase-fd 0 -ba -o $file.sig $file -done +# 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 - echo "Uploading $file to $dest..." - files="$file $file.sig" + # 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<<EOF version: 1.1 directory: $destdir -filename: `basename -- "$file"` +$directive EOF echo "$passphrase" | $GPG --passphrase-fd 0 --clearsign $file.directive ncftpput ftp-upload.gnu.org /incoming/alpha $files $file.directive.asc @@ -160,20 +186,24 @@ EOF cat >$file.directive<<EOF version: 1.1 directory: $destdir -filename: `basename -- "$file"` +$directive EOF echo "$passphrase" | $GPG --passphrase-fd 0 --clearsign $file.directive ncftpput ftp-upload.gnu.org /incoming/ftp $files $file.directive.asc rm -f $file.directive $file.directive.asc ;; savannah.gnu.org:*) - ncftpput savannah.gnu.org /incoming/savannah/$destdir $files + # We only know how to implement delete for {ftp,alpha}.gnu.org. + $delete \ + || ncftpput savannah.gnu.org /incoming/savannah/$destdir $files ;; savannah.nongnu.org:*) - ncftpput savannah.nongnu.org /incoming/savannah/$destdir $files + $delete \ + || ncftpput savannah.nongnu.org /incoming/savannah/$destdir $files ;; *) - scp $files $dest + $delete \ + || scp $files $dest ;; esac done
