Blame build-aux/announce-gen

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