Blame build-aux/announce-gen

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