Blame build-aux/announce-gen

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