#!/usr/bin/env perl

# Note: this script must not be used to build MPFR due to the
# dependency on perl, but this is OK for "make dist".

# Copyright 2016 Free Software Foundation, Inc.
# This script is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.

use strict;
use Cwd;

if (! -d 'src')
  {
    getcwd() =~ m,/tools$,
      or die "Execute $0 from the MPFR source directory\n";
    chdir '..' or die "$!\n$0: can't change cwd\n";
  }

open VERSION, '<', 'VERSION'
  or die "$!\n$0: can't open VERSION file\n";
my $version = do { local $/; <VERSION> };
close VERSION or die "$!\n$0: can't close VERSION file\n";

my ($base,$mv,$pl,$suf) = $version =~ /^((\d+\.\d+)\.(\d+))(-\S+)?/
  or die "$0: bad VERSION format\n";

my $r1 = qr/^Changes from version/;
my $r2 = qr/ to version \Q$base\E:/;
my $rx = $pl ? qr/$r1 \Q$mv\E\.@{[$pl-1]}$r2/ : qr/${r1}s? \S+\.[0*]$r2/;

open NEWS, '<', 'NEWS'
  or die "$!\n$0: can't open NEWS file\n";
my $ok;
while (<NEWS>)
  {
    /$rx/ and $ok = 1;
    $suf ne '-dev' && /FIXME|TODO/ and $! = 2, die "$0: $& in NEWS file";
  }
close NEWS or die "$!\n$0: can't close NEWS file\n";

$ok or $! = 1, die "$0: missing or bad change log in NEWS file\n";
