Blame build-aux/announce-gen

Packit 709fb3
eval '(exit $?0)' && eval 'exec perl -wS "$0" "$@"'
Packit 709fb3
  & eval 'exec perl -wS "$0" $argv:q'
Packit 709fb3
    if 0;
Packit 709fb3
# Generate a release announcement message.
Packit 709fb3
Packit 709fb3
my $VERSION = '2016-01-12 23:09'; # UTC
Packit 709fb3
# The definition above must lie within the first 8 lines in order
Packit 709fb3
# for the Emacs time-stamp write hook (at end) to update it.
Packit 709fb3
# If you change this file with Emacs, please let the write hook
Packit 709fb3
# do its job.  Otherwise, update this string manually.
Packit 709fb3
Packit 709fb3
# Copyright (C) 2002-2017 Free Software Foundation, Inc.
Packit 709fb3
Packit 709fb3
# This program is free software: you can redistribute it and/or modify
Packit 709fb3
# it under the terms of the GNU General Public License as published by
Packit 709fb3
# the Free Software Foundation, either version 3 of the License, or
Packit 709fb3
# (at your option) any later version.
Packit 709fb3
Packit 709fb3
# This program is distributed in the hope that it will be useful,
Packit 709fb3
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 709fb3
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 709fb3
# GNU General Public License for more details.
Packit 709fb3
Packit 709fb3
# You should have received a copy of the GNU General Public License
Packit 709fb3
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 709fb3
Packit 709fb3
# Written by Jim Meyering
Packit 709fb3
Packit 709fb3
use strict;
Packit 709fb3
Packit 709fb3
use Getopt::Long;
Packit 709fb3
use POSIX qw(strftime);
Packit 709fb3
Packit 709fb3
(my $ME = $0) =~ s|.*/||;
Packit 709fb3
Packit 709fb3
my %valid_release_types = map {$_ => 1} qw (alpha beta stable);
Packit 709fb3
my @archive_suffixes = ('tar.gz', 'tar.bz2', 'tar.lzma', 'tar.xz');
Packit 709fb3
my %digest_classes =
Packit 709fb3
  (
Packit 709fb3
   'md5' => (eval { require Digest::MD5; } and 'Digest::MD5'),
Packit 709fb3
   'sha1' => ((eval { require Digest::SHA; } and 'Digest::SHA')
Packit 709fb3
              or (eval { require Digest::SHA1; } and 'Digest::SHA1'))
Packit 709fb3
  );
Packit 709fb3
my $srcdir = '.';
Packit 709fb3
Packit 709fb3
sub usage ($)
Packit 709fb3
{
Packit 709fb3
  my ($exit_code) = @_;
Packit 709fb3
  my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
Packit 709fb3
  if ($exit_code != 0)
Packit 709fb3
    {
Packit 709fb3
      print $STREAM "Try '$ME --help' for more information.\n";
Packit 709fb3
    }
Packit 709fb3
  else
Packit 709fb3
    {
Packit 709fb3
      my @types = sort keys %valid_release_types;
Packit 709fb3
      print $STREAM <
Packit 709fb3
Usage: $ME [OPTIONS]
Packit 709fb3
Generate an announcement message.  Run this from builddir.
Packit 709fb3
Packit 709fb3
OPTIONS:
Packit 709fb3
Packit 709fb3
These options must be specified:
Packit 709fb3
Packit 709fb3
   --release-type=TYPE          TYPE must be one of @types
Packit 709fb3
   --package-name=PACKAGE_NAME
Packit 709fb3
   --previous-version=VER
Packit 709fb3
   --current-version=VER
Packit 709fb3
   --gpg-key-id=ID         The GnuPG ID of the key used to sign the tarballs
Packit 709fb3
   --url-directory=URL_DIR
Packit 709fb3
Packit 709fb3
The following are optional:
Packit 709fb3
Packit 709fb3
   --news=NEWS_FILE             include the NEWS section about this release
Packit 709fb3
                                from this NEWS_FILE; accumulates.
Packit 709fb3
   --srcdir=DIR                 where to find the NEWS_FILEs (default: $srcdir)
Packit 709fb3
   --bootstrap-tools=TOOL_LIST  a comma-separated list of tools, e.g.,
Packit 709fb3
                                autoconf,automake,bison,gnulib
Packit 709fb3
   --gnulib-version=VERSION     report VERSION as the gnulib version, where
Packit 709fb3
                                VERSION is the result of running git describe
Packit 709fb3
                                in the gnulib source directory.
Packit 709fb3
                                required if gnulib is in TOOL_LIST.
Packit 709fb3
   --no-print-checksums         do not emit MD5 or SHA1 checksums
Packit 709fb3
   --archive-suffix=SUF         add SUF to the list of archive suffixes
Packit 709fb3
   --mail-headers=HEADERS       a space-separated list of mail headers, e.g.,
Packit 709fb3
                                To: x\@example.com Cc: y-announce\@example.com,...
Packit 709fb3
Packit 709fb3
   --help             display this help and exit
Packit 709fb3
   --version          output version information and exit
Packit 709fb3
Packit 709fb3
EOF
Packit 709fb3
    }
Packit 709fb3
  exit $exit_code;
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
Packit 709fb3
=item C<%size> = C<sizes (@file)>
Packit 709fb3
Packit 709fb3
Compute the sizes of the C<@file> and return them as a hash.  Return
Packit 709fb3
C<undef> if one of the computation failed.
Packit 709fb3
Packit 709fb3
=cut
Packit 709fb3
Packit 709fb3
sub sizes (@)
Packit 709fb3
{
Packit 709fb3
  my (@file) = @_;
Packit 709fb3
Packit 709fb3
  my $fail = 0;
Packit 709fb3
  my %res;
Packit 709fb3
  foreach my $f (@file)
Packit 709fb3
    {
Packit 709fb3
      my $cmd = "du -h $f";
Packit 709fb3
      my $t = `$cmd`;
Packit 709fb3
      # FIXME-someday: give a better diagnostic, a la $PROCESS_STATUS
Packit 709fb3
      $@
Packit 709fb3
        and (warn "command failed: '$cmd'\n"), $fail = 1;
Packit 709fb3
      chomp $t;
Packit 709fb3
      $t =~ s/^\s*([\d.]+[MkK]).*/${1}B/;
Packit 709fb3
      $res{$f} = $t;
Packit 709fb3
    }
Packit 709fb3
  return $fail ? undef : %res;
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
=item C
Packit 709fb3
Packit 709fb3
Print a section C<$title> dedicated to the list of <@file>, which
Packit 709fb3
sizes are stored in C<%size>, and which are available from the C<@url>.
Packit 709fb3
Packit 709fb3
=cut
Packit 709fb3
Packit 709fb3
sub print_locations ($\@\%@)
Packit 709fb3
{
Packit 709fb3
  my ($title, $url, $size, @file) = @_;
Packit 709fb3
  print "Here are the $title:\n";
Packit 709fb3
  foreach my $url (@{$url})
Packit 709fb3
    {
Packit 709fb3
      for my $file (@file)
Packit 709fb3
        {
Packit 709fb3
          print "  $url/$file";
Packit 709fb3
          print "   (", $$size{$file}, ")"
Packit 709fb3
            if exists $$size{$file};
Packit 709fb3
          print "\n";
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
  print "\n";
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
=item C
Packit 709fb3
Packit 709fb3
Print the MD5 and SHA1 signature section for each C<@file>.
Packit 709fb3
Packit 709fb3
=cut
Packit 709fb3
Packit 709fb3
sub print_checksums (@)
Packit 709fb3
{
Packit 709fb3
  my (@file) = @_;
Packit 709fb3
Packit 709fb3
  print "Here are the MD5 and SHA1 checksums:\n";
Packit 709fb3
  print "\n";
Packit 709fb3
Packit 709fb3
  foreach my $meth (qw (md5 sha1))
Packit 709fb3
    {
Packit 709fb3
      my $class = $digest_classes{$meth} or next;
Packit 709fb3
      foreach my $f (@file)
Packit 709fb3
        {
Packit 709fb3
          open IN, '<', $f
Packit 709fb3
            or die "$ME: $f: cannot open for reading: $!\n";
Packit 709fb3
          binmode IN;
Packit 709fb3
          my $dig = $class->new->addfile(*IN)->hexdigest;
Packit 709fb3
          close IN;
Packit 709fb3
          print "$dig  $f\n";
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
  print "\n";
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
=item C
Packit 709fb3
Packit 709fb3
Print the section of the NEWS file C<$news_file> addressing changes
Packit 709fb3
between versions C<$prev_version> and C<$curr_version>.
Packit 709fb3
Packit 709fb3
=cut
Packit 709fb3
Packit 709fb3
sub print_news_deltas ($$$)
Packit 709fb3
{
Packit 709fb3
  my ($news_file, $prev_version, $curr_version) = @_;
Packit 709fb3
Packit 709fb3
  my $news_name = $news_file;
Packit 709fb3
  $news_name =~ s|^\Q$srcdir\E/||;
Packit 709fb3
Packit 709fb3
  print "\n$news_name\n\n";
Packit 709fb3
Packit 709fb3
  # Print all lines from $news_file, starting with the first one
Packit 709fb3
  # that mentions $curr_version up to but not including
Packit 709fb3
  # the first occurrence of $prev_version.
Packit 709fb3
  my $in_items;
Packit 709fb3
Packit 709fb3
  my $re_prefix = qr/(?:\* )?(?:Noteworthy c|Major c|C)(?i:hanges)/;
Packit 709fb3
Packit 709fb3
  my $found_news;
Packit 709fb3
  open NEWS, '<', $news_file
Packit 709fb3
    or die "$ME: $news_file: cannot open for reading: $!\n";
Packit 709fb3
  while (defined (my $line = <NEWS>))
Packit 709fb3
    {
Packit 709fb3
      if ( ! $in_items)
Packit 709fb3
        {
Packit 709fb3
          # Match lines like these:
Packit 709fb3
          # * Major changes in release 5.0.1:
Packit 709fb3
          # * Noteworthy changes in release 6.6 (2006-11-22) [stable]
Packit 709fb3
          $line =~ /^$re_prefix.*(?:[^\d.]|$)\Q$curr_version\E(?:[^\d.]|$)/o
Packit 709fb3
            or next;
Packit 709fb3
          $in_items = 1;
Packit 709fb3
          print $line;
Packit 709fb3
        }
Packit 709fb3
      else
Packit 709fb3
        {
Packit 709fb3
          # This regexp must not match version numbers in NEWS items.
Packit 709fb3
          # For example, they might well say "introduced in 4.5.5",
Packit 709fb3
          # and we don't want that to match.
Packit 709fb3
          $line =~ /^$re_prefix.*(?:[^\d.]|$)\Q$prev_version\E(?:[^\d.]|$)/o
Packit 709fb3
            and last;
Packit 709fb3
          print $line;
Packit 709fb3
          $line =~ /\S/
Packit 709fb3
            and $found_news = 1;
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
  close NEWS;
Packit 709fb3
Packit 709fb3
  $in_items
Packit 709fb3
    or die "$ME: $news_file: no matching lines for '$curr_version'\n";
Packit 709fb3
  $found_news
Packit 709fb3
    or die "$ME: $news_file: no news item found for '$curr_version'\n";
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
sub print_changelog_deltas ($$)
Packit 709fb3
{
Packit 709fb3
  my ($package_name, $prev_version) = @_;
Packit 709fb3
Packit 709fb3
  # Print new ChangeLog entries.
Packit 709fb3
Packit 709fb3
  # First find all CVS-controlled ChangeLog files.
Packit 709fb3
  use File::Find;
Packit 709fb3
  my @changelog;
Packit 709fb3
  find ({wanted => sub {$_ eq 'ChangeLog' && -d 'CVS'
Packit 709fb3
                          and push @changelog, $File::Find::name}},
Packit 709fb3
        '.');
Packit 709fb3
Packit 709fb3
  # If there are no ChangeLog files, we're done.
Packit 709fb3
  @changelog
Packit 709fb3
    or return;
Packit 709fb3
  my %changelog = map {$_ => 1} @changelog;
Packit 709fb3
Packit 709fb3
  # Reorder the list of files so that if there are ChangeLog
Packit 709fb3
  # files in the specified directories, they're listed first,
Packit 709fb3
  # in this order:
Packit 709fb3
  my @dir = qw ( . src lib m4 config doc );
Packit 709fb3
Packit 709fb3
  # A typical @changelog array might look like this:
Packit 709fb3
  # ./ChangeLog
Packit 709fb3
  # ./po/ChangeLog
Packit 709fb3
  # ./m4/ChangeLog
Packit 709fb3
  # ./lib/ChangeLog
Packit 709fb3
  # ./doc/ChangeLog
Packit 709fb3
  # ./config/ChangeLog
Packit 709fb3
  my @reordered;
Packit 709fb3
  foreach my $d (@dir)
Packit 709fb3
    {
Packit 709fb3
      my $dot_slash = $d eq '.' ? $d : "./$d";
Packit 709fb3
      my $target = "$dot_slash/ChangeLog";
Packit 709fb3
      delete $changelog{$target}
Packit 709fb3
        and push @reordered, $target;
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  # Append any remaining ChangeLog files.
Packit 709fb3
  push @reordered, sort keys %changelog;
Packit 709fb3
Packit 709fb3
  # Remove leading './'.
Packit 709fb3
  @reordered = map { s!^\./!!; $_ } @reordered;
Packit 709fb3
Packit 709fb3
  print "\nChangeLog entries:\n\n";
Packit 709fb3
  # print join ("\n", @reordered), "\n";
Packit 709fb3
Packit 709fb3
  $prev_version =~ s/\./_/g;
Packit 709fb3
  my $prev_cvs_tag = "\U$package_name\E-$prev_version";
Packit 709fb3
Packit 709fb3
  my $cmd = "cvs -n diff -u -r$prev_cvs_tag -rHEAD @reordered";
Packit 709fb3
  open DIFF, '-|', $cmd
Packit 709fb3
    or die "$ME: cannot run '$cmd': $!\n";
Packit 709fb3
  # Print two types of lines, making minor changes:
Packit 709fb3
  # Lines starting with '+++ ', e.g.,
Packit 709fb3
  # +++ ChangeLog   22 Feb 2003 16:52:51 -0000      1.247
Packit 709fb3
  # and those starting with '+'.
Packit 709fb3
  # Don't print the others.
Packit 709fb3
  my $prev_printed_line_empty = 1;
Packit 709fb3
  while (defined (my $line = <DIFF>))
Packit 709fb3
    {
Packit 709fb3
      if ($line =~ /^\+\+\+ /)
Packit 709fb3
        {
Packit 709fb3
          my $separator = "*"x70 ."\n";
Packit 709fb3
          $line =~ s///;
Packit 709fb3
          $line =~ s/\s.*//;
Packit 709fb3
          $prev_printed_line_empty
Packit 709fb3
            or print "\n";
Packit 709fb3
          print $separator, $line, $separator;
Packit 709fb3
        }
Packit 709fb3
      elsif ($line =~ /^\+/)
Packit 709fb3
        {
Packit 709fb3
          $line =~ s///;
Packit 709fb3
          print $line;
Packit 709fb3
          $prev_printed_line_empty = ($line =~ /^$/);
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
  close DIFF;
Packit 709fb3
Packit 709fb3
  # The exit code should be 1.
Packit 709fb3
  # Allow in case there are no modified ChangeLog entries.
Packit 709fb3
  $? == 256 || $? == 128
Packit 709fb3
    or warn "warning: '$cmd' had unexpected exit code or signal ($?)\n";
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
sub get_tool_versions ($$)
Packit 709fb3
{
Packit 709fb3
  my ($tool_list, $gnulib_version) = @_;
Packit 709fb3
  @$tool_list
Packit 709fb3
    or return ();
Packit 709fb3
Packit 709fb3
  my $fail;
Packit 709fb3
  my @tool_version_pair;
Packit 709fb3
  foreach my $t (@$tool_list)
Packit 709fb3
    {
Packit 709fb3
      if ($t eq 'gnulib')
Packit 709fb3
        {
Packit 709fb3
          push @tool_version_pair, ucfirst $t . ' ' . $gnulib_version;
Packit 709fb3
          next;
Packit 709fb3
        }
Packit 709fb3
      # Assume that the last "word" on the first line of
Packit 709fb3
      # 'tool --version' output is the version string.
Packit 709fb3
      my ($first_line, undef) = split ("\n", `$t --version`);
Packit 709fb3
      if ($first_line =~ /.* (\d[\w.-]+)$/)
Packit 709fb3
        {
Packit 709fb3
          $t = ucfirst $t;
Packit 709fb3
          push @tool_version_pair, "$t $1";
Packit 709fb3
        }
Packit 709fb3
      else
Packit 709fb3
        {
Packit 709fb3
          defined $first_line
Packit 709fb3
            and $first_line = '';
Packit 709fb3
          warn "$t: unexpected --version output\n:$first_line";
Packit 709fb3
          $fail = 1;
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  $fail
Packit 709fb3
    and exit 1;
Packit 709fb3
Packit 709fb3
  return @tool_version_pair;
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
{
Packit 709fb3
  # Neutralize the locale, so that, for instance, "du" does not
Packit 709fb3
  # issue "1,2" instead of "1.2", what confuses our regexps.
Packit 709fb3
  $ENV{LC_ALL} = "C";
Packit 709fb3
Packit 709fb3
  my $mail_headers;
Packit 709fb3
  my $release_type;
Packit 709fb3
  my $package_name;
Packit 709fb3
  my $prev_version;
Packit 709fb3
  my $curr_version;
Packit 709fb3
  my $gpg_key_id;
Packit 709fb3
  my @url_dir_list;
Packit 709fb3
  my @news_file;
Packit 709fb3
  my $bootstrap_tools;
Packit 709fb3
  my $gnulib_version;
Packit 709fb3
  my $print_checksums_p = 1;
Packit 709fb3
Packit 709fb3
  # Reformat the warnings before displaying them.
Packit 709fb3
  local $SIG{__WARN__} = sub
Packit 709fb3
    {
Packit 709fb3
      my ($msg) = @_;
Packit 709fb3
      # Warnings from GetOptions.
Packit 709fb3
      $msg =~ s/Option (\w)/option --$1/;
Packit 709fb3
      warn "$ME: $msg";
Packit 709fb3
    };
Packit 709fb3
Packit 709fb3
  GetOptions
Packit 709fb3
    (
Packit 709fb3
     'mail-headers=s'     => \$mail_headers,
Packit 709fb3
     'release-type=s'     => \$release_type,
Packit 709fb3
     'package-name=s'     => \$package_name,
Packit 709fb3
     'previous-version=s' => \$prev_version,
Packit 709fb3
     'current-version=s'  => \$curr_version,
Packit 709fb3
     'gpg-key-id=s'       => \$gpg_key_id,
Packit 709fb3
     'url-directory=s'    => \@url_dir_list,
Packit 709fb3
     'news=s'             => \@news_file,
Packit 709fb3
     'srcdir=s'           => \$srcdir,
Packit 709fb3
     'bootstrap-tools=s'  => \$bootstrap_tools,
Packit 709fb3
     'gnulib-version=s'   => \$gnulib_version,
Packit 709fb3
     'print-checksums!'   => \$print_checksums_p,
Packit 709fb3
     'archive-suffix=s'   => \@archive_suffixes,
Packit 709fb3
Packit 709fb3
     help => sub { usage 0 },
Packit 709fb3
     version => sub { print "$ME version $VERSION\n"; exit },
Packit 709fb3
    ) or usage 1;
Packit 709fb3
Packit 709fb3
  my $fail = 0;
Packit 709fb3
  # Ensure that each required option is specified.
Packit 709fb3
  $release_type
Packit 709fb3
    or (warn "release type not specified\n"), $fail = 1;
Packit 709fb3
  $package_name
Packit 709fb3
    or (warn "package name not specified\n"), $fail = 1;
Packit 709fb3
  $prev_version
Packit 709fb3
    or (warn "previous version string not specified\n"), $fail = 1;
Packit 709fb3
  $curr_version
Packit 709fb3
    or (warn "current version string not specified\n"), $fail = 1;
Packit 709fb3
  $gpg_key_id
Packit 709fb3
    or (warn "GnuPG key ID not specified\n"), $fail = 1;
Packit 709fb3
  @url_dir_list
Packit 709fb3
    or (warn "URL directory name(s) not specified\n"), $fail = 1;
Packit 709fb3
Packit 709fb3
  my @tool_list = split ',', $bootstrap_tools
Packit 709fb3
    if $bootstrap_tools;
Packit 709fb3
Packit 709fb3
  grep (/^gnulib$/, @tool_list) ^ defined $gnulib_version
Packit 709fb3
    and (warn "when specifying gnulib as a tool, you must also specify\n"
Packit 709fb3
        . "--gnulib-version=V, where V is the result of running git describe\n"
Packit 709fb3
        . "in the gnulib source directory.\n"), $fail = 1;
Packit 709fb3
Packit 709fb3
  !$release_type || exists $valid_release_types{$release_type}
Packit 709fb3
    or (warn "'$release_type': invalid release type\n"), $fail = 1;
Packit 709fb3
Packit 709fb3
  @ARGV
Packit 709fb3
    and (warn "too many arguments:\n", join ("\n", @ARGV), "\n"),
Packit 709fb3
      $fail = 1;
Packit 709fb3
  $fail
Packit 709fb3
    and usage 1;
Packit 709fb3
Packit 709fb3
  my $my_distdir = "$package_name-$curr_version";
Packit 709fb3
Packit 709fb3
  my $xd = "$package_name-$prev_version-$curr_version.xdelta";
Packit 709fb3
Packit 709fb3
  my @candidates = map { "$my_distdir.$_" } @archive_suffixes;
Packit 709fb3
  my @tarballs = grep {-f $_} @candidates;
Packit 709fb3
Packit 709fb3
  @tarballs
Packit 709fb3
    or die "$ME: none of " . join(', ', @candidates) . " were found\n";
Packit 709fb3
  my @sizable = @tarballs;
Packit 709fb3
  -f $xd
Packit 709fb3
    and push @sizable, $xd;
Packit 709fb3
  my %size = sizes (@sizable);
Packit 709fb3
  %size
Packit 709fb3
    or exit 1;
Packit 709fb3
Packit 709fb3
  my $headers = '';
Packit 709fb3
  if (defined $mail_headers)
Packit 709fb3
    {
Packit 709fb3
      ($headers = $mail_headers) =~ s/\s+(\S+:)/\n$1/g;
Packit 709fb3
      $headers .= "\n";
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  # The markup is escaped as <\# so that when this script is sent by
Packit 709fb3
  # mail (or part of a diff), Gnus is not triggered.
Packit 709fb3
  print <
Packit 709fb3
Packit 709fb3
${headers}Subject: $my_distdir released [$release_type]
Packit 709fb3
Packit 709fb3
<\#secure method=pgpmime mode=sign>
Packit 709fb3
Packit 709fb3
FIXME: put comments here
Packit 709fb3
Packit 709fb3
EOF
Packit 709fb3
Packit 709fb3
  if (@url_dir_list == 1 && @tarballs == 1)
Packit 709fb3
    {
Packit 709fb3
      # When there's only one tarball and one URL, use a more concise form.
Packit 709fb3
      my $m = "$url_dir_list[0]/$tarballs[0]";
Packit 709fb3
      print "Here are the compressed sources and a GPG detached signature[*]:\n"
Packit 709fb3
        . "  $m\n"
Packit 709fb3
        . "  $m.sig\n\n";
Packit 709fb3
    }
Packit 709fb3
  else
Packit 709fb3
    {
Packit 709fb3
      print_locations ("compressed sources", @url_dir_list, %size, @tarballs);
Packit 709fb3
      -f $xd
Packit 709fb3
        and print_locations ("xdelta diffs (useful? if so, "
Packit 709fb3
                             . "please tell bug-gnulib\@gnu.org)",
Packit 709fb3
                             @url_dir_list, %size, $xd);
Packit 709fb3
      my @sig_files = map { "$_.sig" } @tarballs;
Packit 709fb3
      print_locations ("GPG detached signatures[*]", @url_dir_list, %size,
Packit 709fb3
                       @sig_files);
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  if ($url_dir_list[0] =~ "gnu\.org")
Packit 709fb3
    {
Packit 709fb3
      print "Use a mirror for higher download bandwidth:\n";
Packit 709fb3
      if (@tarballs == 1 && $url_dir_list[0] =~ m!http://ftp\.gnu\.org/gnu/!)
Packit 709fb3
        {
Packit 709fb3
          (my $m = "$url_dir_list[0]/$tarballs[0]")
Packit 709fb3
            =~ s!http://ftp\.gnu\.org/gnu/!http://ftpmirror\.gnu\.org/!;
Packit 709fb3
          print "  $m\n"
Packit 709fb3
              . "  $m.sig\n\n";
Packit 709fb3
Packit 709fb3
        }
Packit 709fb3
      else
Packit 709fb3
        {
Packit 709fb3
          print "  http://www.gnu.org/order/ftp.html\n\n";
Packit 709fb3
        }
Packit 709fb3
    }
Packit 709fb3
Packit 709fb3
  $print_checksums_p
Packit 709fb3
    and print_checksums (@sizable);
Packit 709fb3
Packit 709fb3
  print <
Packit 709fb3
[*] Use a .sig file to verify that the corresponding file (without the
Packit 709fb3
.sig suffix) is intact.  First, be sure to download both the .sig file
Packit 709fb3
and the corresponding tarball.  Then, run a command like this:
Packit 709fb3
Packit 709fb3
  gpg --verify $tarballs[0].sig
Packit 709fb3
Packit 709fb3
If that command fails because you don't have the required public key,
Packit 709fb3
then run this command to import it:
Packit 709fb3
Packit 709fb3
  gpg --keyserver keys.gnupg.net --recv-keys $gpg_key_id
Packit 709fb3
Packit 709fb3
and rerun the 'gpg --verify' command.
Packit 709fb3
EOF
Packit 709fb3
Packit 709fb3
  my @tool_versions = get_tool_versions (\@tool_list, $gnulib_version);
Packit 709fb3
  @tool_versions
Packit 709fb3
    and print "\nThis release was bootstrapped with the following tools:",
Packit 709fb3
      join ('', map {"\n  $_"} @tool_versions), "\n";
Packit 709fb3
Packit 709fb3
  print_news_deltas ($_, $prev_version, $curr_version)
Packit 709fb3
    foreach @news_file;
Packit 709fb3
Packit 709fb3
  $release_type eq 'stable'
Packit 709fb3
    or print_changelog_deltas ($package_name, $prev_version);
Packit 709fb3
Packit 709fb3
  exit 0;
Packit 709fb3
}
Packit 709fb3
Packit 709fb3
### Setup "GNU" style for perl-mode and cperl-mode.
Packit 709fb3
## Local Variables:
Packit 709fb3
## mode: perl
Packit 709fb3
## perl-indent-level: 2
Packit 709fb3
## perl-continued-statement-offset: 2
Packit 709fb3
## perl-continued-brace-offset: 0
Packit 709fb3
## perl-brace-offset: 0
Packit 709fb3
## perl-brace-imaginary-offset: 0
Packit 709fb3
## perl-label-offset: -2
Packit 709fb3
## perl-extra-newline-before-brace: t
Packit 709fb3
## perl-merge-trailing-else: nil
Packit 709fb3
## eval: (add-hook 'write-file-hooks 'time-stamp)
Packit 709fb3
## time-stamp-start: "my $VERSION = '"
Packit 709fb3
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
Packit 709fb3
## time-stamp-time-zone: "UTC0"
Packit 709fb3
## time-stamp-end: "'; # UTC"
Packit 709fb3
## End: