Blame build-aux/gnupload

Packit Service fdd496
#!/bin/sh
Packit Service fdd496
# Sign files and upload them.
Packit Service fdd496
Packit Service fdd496
scriptversion=2016-01-11.22; # UTC
Packit Service fdd496
Packit Service fdd496
# Copyright (C) 2004-2017 Free Software Foundation, Inc.
Packit Service fdd496
#
Packit Service fdd496
# This program is free software; you can redistribute it and/or modify
Packit Service fdd496
# it under the terms of the GNU General Public License as published by
Packit Service fdd496
# the Free Software Foundation; either version 3, or (at your option)
Packit Service fdd496
# any later version.
Packit Service fdd496
#
Packit Service fdd496
# This program is distributed in the hope that it will be useful,
Packit Service fdd496
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fdd496
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service fdd496
# GNU General Public License for more details.
Packit Service fdd496
#
Packit Service fdd496
# You should have received a copy of the GNU General Public License
Packit Service fdd496
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service fdd496
Packit Service fdd496
# Originally written by Alexandre Duret-Lutz <adl@gnu.org>.
Packit Service fdd496
# The master copy of this file is maintained in the gnulib Git repository.
Packit Service fdd496
# Please send bug reports and feature requests to bug-gnulib@gnu.org.
Packit Service fdd496
Packit Service fdd496
set -e
Packit Service fdd496
Packit Service fdd496
GPG='gpg --batch --no-tty'
Packit Service fdd496
conffile=.gnuploadrc
Packit Service fdd496
to=
Packit Service fdd496
dry_run=false
Packit Service fdd496
replace=
Packit Service fdd496
symlink_files=
Packit Service fdd496
delete_files=
Packit Service fdd496
delete_symlinks=
Packit Service fdd496
collect_var=
Packit Service fdd496
dbg=
Packit Service fdd496
nl='
Packit Service fdd496
'
Packit Service fdd496
Packit Service fdd496
usage="Usage: $0 [OPTION]... [CMD] FILE... [[CMD] FILE...]
Packit Service fdd496
Packit Service fdd496
Sign all FILES, and process them at the destinations specified with --to.
Packit Service fdd496
If CMD is not given, it defaults to uploading.  See examples below.
Packit Service fdd496
Packit Service fdd496
Commands:
Packit Service fdd496
  --delete                 delete FILES from destination
Packit Service fdd496
  --symlink                create symbolic links
Packit Service fdd496
  --rmsymlink              remove symbolic links
Packit Service fdd496
  --                       treat the remaining arguments as files to upload
Packit Service fdd496
Packit Service fdd496
Options:
Packit Service fdd496
  --to DEST                specify a destination DEST for FILES
Packit Service fdd496
                           (multiple --to options are allowed)
Packit Service fdd496
  --user NAME              sign with key NAME
Packit Service fdd496
  --replace                allow replacements of existing files
Packit Service fdd496
  --symlink-regex[=EXPR]   use sed script EXPR to compute symbolic link names
Packit Service fdd496
  --dry-run                do nothing, show what would have been done
Packit Service fdd496
                           (including the constructed directive file)
Packit Service fdd496
  --version                output version information and exit
Packit Service fdd496
  --help                   print this help text and exit
Packit Service fdd496
Packit Service fdd496
If --symlink-regex is given without EXPR, then the link target name
Packit Service fdd496
is created by replacing the version information with '-latest', e.g.:
Packit Service fdd496
  foo-1.3.4.tar.gz -> foo-latest.tar.gz
Packit Service fdd496
Packit Service fdd496
Recognized destinations are:
Packit Service fdd496
  alpha.gnu.org:DIRECTORY
Packit Service fdd496
  savannah.gnu.org:DIRECTORY
Packit Service fdd496
  savannah.nongnu.org:DIRECTORY
Packit Service fdd496
  ftp.gnu.org:DIRECTORY
Packit Service fdd496
                           build directive files and upload files by FTP
Packit Service fdd496
  download.gnu.org.ua:{alpha|ftp}/DIRECTORY
Packit Service fdd496
                           build directive files and upload files by SFTP
Packit Service fdd496
  [user@]host:DIRECTORY    upload files with scp
Packit Service fdd496
Packit Service fdd496
Options and commands are applied in order.  If the file $conffile exists
Packit Service fdd496
in the current working directory, its contents are prepended to the
Packit Service fdd496
actual command line options.  Use this to keep your defaults.  Comments
Packit Service fdd496
(#) and empty lines in $conffile are allowed.
Packit Service fdd496
Packit Service fdd496
<http://www.gnu.org/prep/maintain/html_node/Automated-FTP-Uploads.html>
Packit Service fdd496
gives some further background.
Packit Service fdd496
Packit Service fdd496
Examples:
Packit Service fdd496
1. Upload foobar-1.0.tar.gz to ftp.gnu.org:
Packit Service fdd496
  gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz
Packit Service fdd496
Packit Service fdd496
2. Upload foobar-1.0.tar.gz and foobar-1.0.tar.xz to ftp.gnu.org:
Packit Service fdd496
  gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz foobar-1.0.tar.xz
Packit Service fdd496
Packit Service fdd496
3. Same as above, and also create symbolic links to foobar-latest.tar.*:
Packit Service fdd496
  gnupload --to ftp.gnu.org:foobar \\
Packit Service fdd496
           --symlink-regex \\
Packit Service fdd496
           foobar-1.0.tar.gz foobar-1.0.tar.xz
Packit Service fdd496
Packit Service fdd496
4. Upload foobar-0.9.90.tar.gz to two sites:
Packit Service fdd496
  gnupload --to alpha.gnu.org:foobar \\
Packit Service fdd496
           --to sources.redhat.com:~ftp/pub/foobar \\
Packit Service fdd496
           foobar-0.9.90.tar.gz
Packit Service fdd496
Packit Service fdd496
5. Delete oopsbar-0.9.91.tar.gz and upload foobar-0.9.91.tar.gz
Packit Service fdd496
   (the -- terminates the list of files to delete):
Packit Service fdd496
  gnupload --to alpha.gnu.org:foobar \\
Packit Service fdd496
           --to sources.redhat.com:~ftp/pub/foobar \\
Packit Service fdd496
           --delete oopsbar-0.9.91.tar.gz \\
Packit Service fdd496
           -- foobar-0.9.91.tar.gz
Packit Service fdd496
Packit Service fdd496
gnupload executes a program ncftpput to do the transfers; if you don't
Packit Service fdd496
happen to have an ncftp package installed, the ncftpput-ftp script in
Packit Service fdd496
the build-aux/ directory of the gnulib package
Packit Service fdd496
(http://savannah.gnu.org/projects/gnulib) may serve as a replacement.
Packit Service fdd496
Packit Service fdd496
Send patches and bug reports to <bug-gnulib@gnu.org>."
Packit Service fdd496
Packit Service fdd496
# Read local configuration file
Packit Service fdd496
if test -r "$conffile"; then
Packit Service fdd496
  echo "$0: Reading configuration file $conffile"
Packit Service fdd496
  conf=`sed 's/#.*$//;/^$/d' "$conffile" | tr "\015$nl" '  '`
Packit Service fdd496
  eval set x "$conf \"\$@\""
Packit Service fdd496
  shift
Packit Service fdd496
fi
Packit Service fdd496
Packit Service fdd496
while test -n "$1"; do
Packit Service fdd496
  case $1 in
Packit Service fdd496
  -*)
Packit Service fdd496
    collect_var=
Packit Service fdd496
    case $1 in
Packit Service fdd496
    --help)
Packit Service fdd496
      echo "$usage"
Packit Service fdd496
      exit $?
Packit Service fdd496
      ;;
Packit Service fdd496
    --to)
Packit Service fdd496
      if test -z "$2"; then
Packit Service fdd496
        echo "$0: Missing argument for --to" 1>&2
Packit Service fdd496
        exit 1
Packit Service fdd496
      elif echo "$2" | grep 'ftp-upload\.gnu\.org' >/dev/null; then
Packit Service fdd496
        echo "$0: Use ftp.gnu.org:PKGNAME or alpha.gnu.org:PKGNAME" >&2
Packit Service fdd496
        echo "$0: for the destination, not ftp-upload.gnu.org (which" >&2
Packit Service fdd496
        echo "$0:  is used for direct ftp uploads, not with gnupload)." >&2
Packit Service fdd496
        echo "$0: See --help and its examples if need be." >&2
Packit Service fdd496
        exit 1
Packit Service fdd496
      else
Packit Service fdd496
        to="$to $2"
Packit Service fdd496
        shift
Packit Service fdd496
      fi
Packit Service fdd496
      ;;
Packit Service fdd496
    --user)
Packit Service fdd496
      if test -z "$2"; then
Packit Service fdd496
        echo "$0: Missing argument for --user" 1>&2
Packit Service fdd496
        exit 1
Packit Service fdd496
      else
Packit Service fdd496
        GPG="$GPG --local-user $2"
Packit Service fdd496
        shift
Packit Service fdd496
      fi
Packit Service fdd496
      ;;
Packit Service fdd496
    --delete)
Packit Service fdd496
      collect_var=delete_files
Packit Service fdd496
      ;;
Packit Service fdd496
    --replace)
Packit Service fdd496
      replace="replace: true"
Packit Service fdd496
      ;;
Packit Service fdd496
    --rmsymlink)
Packit Service fdd496
      collect_var=delete_symlinks
Packit Service fdd496
      ;;
Packit Service fdd496
    --symlink-regex=*)
Packit Service fdd496
      symlink_expr=`expr "$1" : '[^=]*=\(.*\)'`
Packit Service fdd496
      ;;
Packit Service fdd496
    --symlink-regex)
Packit Service fdd496
      symlink_expr='s|-[0-9][0-9\.]*\(-[0-9][0-9]*\)\{0,1\}\.|-latest.|'
Packit Service fdd496
      ;;
Packit Service fdd496
    --symlink)
Packit Service fdd496
      collect_var=symlink_files
Packit Service fdd496
      ;;
Packit Service fdd496
    --dry-run|-n)
Packit Service fdd496
      dry_run=:
Packit Service fdd496
      ;;
Packit Service fdd496
    --version)
Packit Service fdd496
      echo "gnupload $scriptversion"
Packit Service fdd496
      exit $?
Packit Service fdd496
      ;;
Packit Service fdd496
    --)
Packit Service fdd496
      shift
Packit Service fdd496
      break
Packit Service fdd496
      ;;
Packit Service fdd496
    -*)
Packit Service fdd496
      echo "$0: Unknown option '$1', try '$0 --help'" 1>&2
Packit Service fdd496
      exit 1
Packit Service fdd496
      ;;
Packit Service fdd496
    esac
Packit Service fdd496
    ;;
Packit Service fdd496
  *)
Packit Service fdd496
    if test -z "$collect_var"; then
Packit Service fdd496
      break
Packit Service fdd496
    else
Packit Service fdd496
      eval "$collect_var=\"\$$collect_var $1\""
Packit Service fdd496
    fi
Packit Service fdd496
    ;;
Packit Service fdd496
  esac
Packit Service fdd496
  shift
Packit Service fdd496
done
Packit Service fdd496
Packit Service fdd496
dprint()
Packit Service fdd496
{
Packit Service fdd496
  echo "Running $* ..."
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
if $dry_run; then
Packit Service fdd496
  dbg=dprint
Packit Service fdd496
fi
Packit Service fdd496
Packit Service fdd496
if test -z "$to"; then
Packit Service fdd496
  echo "$0: Missing destination sites" >&2
Packit Service fdd496
  exit 1
Packit Service fdd496
fi
Packit Service fdd496
Packit Service fdd496
if test -n "$symlink_files"; then
Packit Service fdd496
  x=`echo "$symlink_files" | sed 's/[^ ]//g;s/  //g'`
Packit Service fdd496
  if test -n "$x"; then
Packit Service fdd496
    echo "$0: Odd number of symlink arguments" >&2
Packit Service fdd496
    exit 1
Packit Service fdd496
  fi
Packit Service fdd496
fi
Packit Service fdd496
Packit Service fdd496
if test $# = 0; then
Packit Service fdd496
  if test -z "${symlink_files}${delete_files}${delete_symlinks}"; then
Packit Service fdd496
    echo "$0: No file to upload" 1>&2
Packit Service fdd496
    exit 1
Packit Service fdd496
  fi
Packit Service fdd496
else
Packit Service fdd496
  # Make sure all files exist.  We don't want to ask
Packit Service fdd496
  # for the passphrase if the script will fail.
Packit Service fdd496
  for file
Packit Service fdd496
  do
Packit Service fdd496
    if test ! -f $file; then
Packit Service fdd496
      echo "$0: Cannot find '$file'" 1>&2
Packit Service fdd496
      exit 1
Packit Service fdd496
    elif test -n "$symlink_expr"; then
Packit Service fdd496
      linkname=`echo $file | sed "$symlink_expr"`
Packit Service fdd496
      if test -z "$linkname"; then
Packit Service fdd496
        echo "$0: symlink expression produces empty results" >&2
Packit Service fdd496
        exit 1
Packit Service fdd496
      elif test "$linkname" = $file; then
Packit Service fdd496
        echo "$0: symlink expression does not alter file name" >&2
Packit Service fdd496
        exit 1
Packit Service fdd496
      fi
Packit Service fdd496
    fi
Packit Service fdd496
  done
Packit Service fdd496
fi
Packit Service fdd496
Packit Service fdd496
# Make sure passphrase is not exported in the environment.
Packit Service fdd496
unset passphrase
Packit Service fdd496
unset passphrase_fd_0
Packit Service fdd496
GNUPGHOME=${GNUPGHOME:-$HOME/.gnupg}
Packit Service fdd496
Packit Service fdd496
# Reset PATH to be sure that echo is a built-in.  We will later use
Packit Service fdd496
# 'echo $passphrase' to output the passphrase, so it is important that
Packit Service fdd496
# it is a built-in (third-party programs tend to appear in 'ps'
Packit Service fdd496
# listings with their arguments...).
Packit Service fdd496
# Remember this script runs with 'set -e', so if echo is not built-in
Packit Service fdd496
# it will exit now.
Packit Service fdd496
if $dry_run || grep -q "^use-agent" $GNUPGHOME/gpg.conf; then :; else
Packit Service fdd496
  PATH=/empty echo -n "Enter GPG passphrase: "
Packit Service fdd496
  stty -echo
Packit Service fdd496
  read -r passphrase
Packit Service fdd496
  stty echo
Packit Service fdd496
  echo
Packit Service fdd496
  passphrase_fd_0="--passphrase-fd 0"
Packit Service fdd496
fi
Packit Service fdd496
Packit Service fdd496
if test $# -ne 0; then
Packit Service fdd496
  for file
Packit Service fdd496
  do
Packit Service fdd496
    echo "Signing $file ..."
Packit Service fdd496
    rm -f $file.sig
Packit Service fdd496
    echo "$passphrase" | $dbg $GPG $passphrase_fd_0 -ba -o $file.sig $file
Packit Service fdd496
  done
Packit Service fdd496
fi
Packit Service fdd496
Packit Service fdd496
Packit Service fdd496
# mkdirective DESTDIR BASE FILE STMT
Packit Service fdd496
# Arguments: See upload, below
Packit Service fdd496
mkdirective ()
Packit Service fdd496
{
Packit Service fdd496
  stmt="$4"
Packit Service fdd496
  if test -n "$3"; then
Packit Service fdd496
    stmt="
Packit Service fdd496
filename: $3$stmt"
Packit Service fdd496
  fi
Packit Service fdd496
Packit Service fdd496
  cat >${2}.directive<
Packit Service fdd496
version: 1.2
Packit Service fdd496
directory: $1
Packit Service fdd496
comment: gnupload v. $scriptversion$stmt
Packit Service fdd496
EOF
Packit Service fdd496
  if $dry_run; then
Packit Service fdd496
    echo "File ${2}.directive:"
Packit Service fdd496
    cat ${2}.directive
Packit Service fdd496
    echo "File ${2}.directive:" | sed 's/./-/g'
Packit Service fdd496
  fi
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
mksymlink ()
Packit Service fdd496
{
Packit Service fdd496
  while test $# -ne 0
Packit Service fdd496
  do
Packit Service fdd496
    echo "symlink: $1 $2"
Packit Service fdd496
    shift
Packit Service fdd496
    shift
Packit Service fdd496
  done
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
# upload DEST DESTDIR BASE FILE STMT FILES
Packit Service fdd496
# Arguments:
Packit Service fdd496
#  DEST     Destination site;
Packit Service fdd496
#  DESTDIR  Destination directory;
Packit Service fdd496
#  BASE     Base name for the directive file;
Packit Service fdd496
#  FILE     Name of the file to distribute (may be empty);
Packit Service fdd496
#  STMT     Additional statements for the directive file;
Packit Service fdd496
#  FILES    List of files to upload.
Packit Service fdd496
upload ()
Packit Service fdd496
{
Packit Service fdd496
  dest=$1
Packit Service fdd496
  destdir=$2
Packit Service fdd496
  base=$3
Packit Service fdd496
  file=$4
Packit Service fdd496
  stmt=$5
Packit Service fdd496
  files=$6
Packit Service fdd496
Packit Service fdd496
  rm -f $base.directive $base.directive.asc
Packit Service fdd496
  case $dest in
Packit Service fdd496
    alpha.gnu.org:*)
Packit Service fdd496
      mkdirective "$destdir" "$base" "$file" "$stmt"
Packit Service fdd496
      echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
Packit Service fdd496
      $dbg ncftpput ftp-upload.gnu.org /incoming/alpha $files $base.directive.asc
Packit Service fdd496
      ;;
Packit Service fdd496
    ftp.gnu.org:*)
Packit Service fdd496
      mkdirective "$destdir" "$base" "$file" "$stmt"
Packit Service fdd496
      echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
Packit Service fdd496
      $dbg ncftpput ftp-upload.gnu.org /incoming/ftp $files $base.directive.asc
Packit Service fdd496
      ;;
Packit Service fdd496
    savannah.gnu.org:*)
Packit Service fdd496
      if test -z "$files"; then
Packit Service fdd496
        echo "$0: warning: standalone directives not applicable for $dest" >&2
Packit Service fdd496
      fi
Packit Service fdd496
      $dbg ncftpput savannah.gnu.org /incoming/savannah/$destdir $files
Packit Service fdd496
      ;;
Packit Service fdd496
    savannah.nongnu.org:*)
Packit Service fdd496
      if test -z "$files"; then
Packit Service fdd496
        echo "$0: warning: standalone directives not applicable for $dest" >&2
Packit Service fdd496
      fi
Packit Service fdd496
      $dbg ncftpput savannah.nongnu.org /incoming/savannah/$destdir $files
Packit Service fdd496
      ;;
Packit Service fdd496
    download.gnu.org.ua:alpha/*|download.gnu.org.ua:ftp/*)
Packit Service fdd496
      destdir_p1=`echo "$destdir" | sed 's,^[^/]*/,,'`
Packit Service fdd496
      destdir_topdir=`echo "$destdir" | sed 's,/.*,,'`
Packit Service fdd496
      mkdirective "$destdir_p1" "$base" "$file" "$stmt"
Packit Service fdd496
      echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
Packit Service fdd496
      for f in $files $base.directive.asc
Packit Service fdd496
      do
Packit Service fdd496
        echo put $f
Packit Service fdd496
      done | $dbg sftp -b - puszcza.gnu.org.ua:/incoming/$destdir_topdir
Packit Service fdd496
      ;;
Packit Service fdd496
    /*)
Packit Service fdd496
      dest_host=`echo "$dest" | sed 's,:.*,,'`
Packit Service fdd496
      mkdirective "$destdir" "$base" "$file" "$stmt"
Packit Service fdd496
      echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
Packit Service fdd496
      $dbg cp $files $base.directive.asc $dest_host
Packit Service fdd496
      ;;
Packit Service fdd496
    *)
Packit Service fdd496
      if test -z "$files"; then
Packit Service fdd496
        echo "$0: warning: standalone directives not applicable for $dest" >&2
Packit Service fdd496
      fi
Packit Service fdd496
      $dbg scp $files $dest
Packit Service fdd496
      ;;
Packit Service fdd496
  esac
Packit Service fdd496
  rm -f $base.directive $base.directive.asc
Packit Service fdd496
}
Packit Service fdd496
Packit Service fdd496
#####
Packit Service fdd496
# Process any standalone directives
Packit Service fdd496
stmt=
Packit Service fdd496
if test -n "$symlink_files"; then
Packit Service fdd496
  stmt="$stmt
Packit Service fdd496
`mksymlink $symlink_files`"
Packit Service fdd496
fi
Packit Service fdd496
Packit Service fdd496
for file in $delete_files
Packit Service fdd496
do
Packit Service fdd496
  stmt="$stmt
Packit Service fdd496
archive: $file"
Packit Service fdd496
done
Packit Service fdd496
Packit Service fdd496
for file in $delete_symlinks
Packit Service fdd496
do
Packit Service fdd496
  stmt="$stmt
Packit Service fdd496
rmsymlink: $file"
Packit Service fdd496
done
Packit Service fdd496
Packit Service fdd496
if test -n "$stmt"; then
Packit Service fdd496
  for dest in $to
Packit Service fdd496
  do
Packit Service fdd496
    destdir=`echo $dest | sed 's/[^:]*://'`
Packit Service fdd496
    upload "$dest" "$destdir" "`hostname`-$$" "" "$stmt"
Packit Service fdd496
  done
Packit Service fdd496
fi
Packit Service fdd496
Packit Service fdd496
# Process actual uploads
Packit Service fdd496
for dest in $to
Packit Service fdd496
do
Packit Service fdd496
  for file
Packit Service fdd496
  do
Packit Service fdd496
    echo "Uploading $file to $dest ..."
Packit Service fdd496
    stmt=
Packit Service fdd496
    #
Packit Service fdd496
    # allowing file replacement is all or nothing.
Packit Service fdd496
    if test -n "$replace"; then stmt="$stmt
Packit Service fdd496
$replace"
Packit Service fdd496
    fi
Packit Service fdd496
    #
Packit Service fdd496
    files="$file $file.sig"
Packit Service fdd496
    destdir=`echo $dest | sed 's/[^:]*://'`
Packit Service fdd496
    if test -n "$symlink_expr"; then
Packit Service fdd496
      linkname=`echo $file | sed "$symlink_expr"`
Packit Service fdd496
      stmt="$stmt
Packit Service fdd496
symlink: $file $linkname
Packit Service fdd496
symlink: $file.sig $linkname.sig"
Packit Service fdd496
    fi
Packit Service fdd496
    upload "$dest" "$destdir" "$file" "$file" "$stmt" "$files"
Packit Service fdd496
  done
Packit Service fdd496
done
Packit Service fdd496
Packit Service fdd496
exit 0
Packit Service fdd496
Packit Service fdd496
# Local variables:
Packit Service fdd496
# eval: (add-hook 'write-file-hooks 'time-stamp)
Packit Service fdd496
# time-stamp-start: "scriptversion="
Packit Service fdd496
# time-stamp-format: "%:y-%02m-%02d.%02H"
Packit Service fdd496
# time-stamp-time-zone: "UTC0"
Packit Service fdd496
# time-stamp-end: "; # UTC"
Packit Service fdd496
# End: