Edit

kc3-lang/automake/lib/gnupload

Branch :

  • Show log

    Commit

  • Author : Karl Berry
    Date : 2008-11-12 20:52:03
    Hash : c594f831
    Message : New gnupload option --delete to remove archive files. * lib/gnupload: Accept --delete to remove files from alpha.gnu.org or ftp.gnu.org. Signed-off-by: Ralf Wildenhues <Ralf.Wildenhues@gmx.de>

  • lib/gnupload
  • #!/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 <http://www.gnu.org/licenses/>.
    
    # Originally written by Alexandre Duret-Lutz <adl@gnu.org>.
    
    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
    <http://www.gnu.org/prep/maintain/html_node/Automated-FTP-Uploads.html>.
    
    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 <bug-automake@gnu.org>.
    Send patches to <automake-patches@gnu.org>."
    
    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<<EOF
    version: 1.1
    directory: $destdir
    $directive
    EOF
    	echo "$passphrase" | $GPG --passphrase-fd 0 --clearsign $file.directive
            ncftpput ftp-upload.gnu.org /incoming/alpha $files $file.directive.asc
    	rm -f $file.directive $file.directive.asc
    	;;
          ftp.gnu.org:*)
    	rm -f $file.directive $file.directive.asc
    	cat >$file.directive<<EOF
    version: 1.1
    directory: $destdir
    $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:*)
            # We only know how to implement delete for {ftp,alpha}.gnu.org.
            $delete \
            || ncftpput savannah.gnu.org /incoming/savannah/$destdir $files
    	;;
          savannah.nongnu.org:*)
            $delete \
            || ncftpput savannah.nongnu.org /incoming/savannah/$destdir $files
    	;;
          *)
            $delete \
    	|| scp $files $dest
    	;;
        esac
      done
    done
    
    # Local variables:
    # eval: (add-hook 'write-file-hooks 'time-stamp)
    # time-stamp-start: "scriptversion="
    # time-stamp-format: "%:y-%02m-%02d.%02H"
    # time-stamp-end: "$"
    # End: