Blame build-aux/announce-gen

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