#!/usr/bin/env perl
#
# This program creates a source distribution of qpdf.  For details,
# see README.maintainer.
#

require 5.008;
BEGIN { $^W = 1; }
use strict;
use Cwd;
use IO::File;

my $whoami = ($0 =~ m,([^/\\]*)$,) ? $1 : $0;
#my $dirname = ($0 =~ m,(.*)[/\\][^/\\]+$,) ? $1 : ".";

usage() unless @ARGV >= 1;
my $srcdir = shift(@ARGV);
my $run_tests = 1;
if (@ARGV)
{
    if ($ARGV[0] eq '--no-tests')
    {
	$run_tests = 0;
    }
    else
    {
	usage();
    }
}
$srcdir =~ s,/$,,;
usage() unless $srcdir =~ m/^qpdf-(\d+\.\d+(?:\.(a|b|rc)?\d+)?)$/;
my $version = $1;
usage() unless -d $srcdir;

my $pwd = getcwd();
cd($srcdir);

# Check versions
my $fh = safe_open("configure.ac");
my $config_version = 'unknown';
while (<$fh>)
{
    if (m/^AC_INIT\(qpdf,([^\)]+)\)/)
    {
	$config_version = $1;
	last;
    }
}
$fh->close();

$fh = safe_open("libqpdf/QPDF.cc");
my $code_version = 'unknown';
while (<$fh>)
{
    if (m/QPDF::qpdf_version = \"([^\"]+)\"/)
    {
	$code_version = $1;
	last;
    }
}
$fh->close();

$fh = safe_open("manual/qpdf-manual.xml");
my $doc_version = 'unknown';
while (<$fh>)
{
    if (m/swversion "([^\"]+)\"/)
    {
	$doc_version = $1;
	last;
    }
}
$fh->close();

$fh = safe_open("qpdf.spec");
my $spec_version = 'unknown';
while (<$fh>)
{
    if (m/Version: (.*)$/)
    {
	$spec_version = $1;
	last;
    }
}

my $version_error = 0;
if ($version ne $config_version)
{
    print "$whoami: configure.ac version = $config_version\n";
    $version_error = 1;
}
if ($version ne $code_version)
{
    print "$whoami: QPDF.cc version = $code_version\n";
    $version_error = 1;
}
if ($version ne $doc_version)
{
    print "$whoami: qpdf-manual.xml version = $doc_version\n";
    $version_error = 1;
}
if ($version ne $spec_version)
{
    print "$whoami: qpdf.spec version = $spec_version\n";
    $version_error = 1;
}
if ($version_error)
{
    die "$whoami: version numbers are not consistent\n";
}

run("./autogen.sh");
run("./configure --enable-doc-maintenance");
run("make build_manual");
run("make distclean");
cd($pwd);
run("tar czvf $srcdir.tar.gz-candidate $srcdir");
if ($run_tests)
{
    cd($srcdir);
    run("./configure");
    run("make check");
    cd($pwd);
}
rename "$srcdir.tar.gz-candidate", "$srcdir.tar.gz" or die;

print "
Source distribution created as $srcdir.tar.gz
You can now remove $srcdir.
If this is a release, don't forget to tag the version control system and
make a backup of the release tar file.

";

sub safe_open
{
    my $file = shift;
    my $fh = new IO::File("<$file") or die "$whoami: can't open $file: $!";
    $fh;
}

sub run
{
    my $cmd = shift;
    system($cmd) == 0 or die "$whoami: $cmd failed\n";
}

sub cd
{
    my $dir = shift;
    chdir($dir) or die;
}

sub usage
{
    die "
Usage: $whoami qpdf-version [ --no-tests ]

qpdf-version must be a directory containing a pristine export of that
version of qpdf from the version control system.  Use of --no-tests
can be used for internally testing releases, but do not use it for a
real release.

";
}