#!/usr/bin/perl -w

#use strict;
use warnings;
use Carp;
use Getopt::Long;
use File::Basename;
use RPM::Source::Editor;
Getopt::Long::Configure ("bundling");

my ($rpm,$spec,$hook,$changelog,$release,$backportver);
my $packager='';
my $verbose=1;
my $cleanup=1;
my $outputdir='.';
my $patchdir=dirname($0)."/patches";

my $result = GetOptions ("rpm=s" => \$rpm,
		      "spec=s" => \$spec,
		      "outdir=s"   => \$outputdir,
		      "packager=s"   => \$packager,
		      "hook=s"   => \$hook,
		      "M=s"   => \$backportver,
		      "changelog=s"   => \$changelog,
		      "cleanup!"   => \$cleanup,
		      "release=s"   => \$release,
		      "verbose+"  => \$verbose);
sub usage () {
    print "options:
[--rpm] /path/to/altlinux.src.rpm
--spec /path/to/altlinux.spec
--hook /path/to/hook to be called on resulting spec file
--out /path/to/output_dir
--changelog '- message'
-Mxx 
--release 'release' - if we need to adjust the package's release
";
}

if (! $rpm && ! $spec) {
    if (@ARGV) {
	$rpm = shift @ARGV;
    } else {
	print "ERROR: one of --rpm | --spec is required!\n";
	usage();
	exit (4);
    }
}

if (!$backportver) {
    print "ERROR: -Mdistrover is required!\n";
    usage();
    exit (5);
}

my $alt=RPM::Source::Editor->new(
    SOURCERPM => $rpm, 
    SPECFILE=> $spec, 
    OUTPUTDIR=> $outputdir, 
    PATCHDIR=>$patchdir, 
    VERBOSE=> $verbose,
    CLEANUP=> $cleanup,
    CHANGELOG=>'- M'.$backportver.' backport',
);

my $rel = $alt->get_section('package','')->get_tag('Release');

# our -- hack ?
our $jpptoolsdir=dirname($0);
# for cross-references in hooks
push @INC, $jpptoolsdir."/hooks", "./hooks";

if (not $hook) {
    # looking for default hook
    my $name = $alt->get_section('package','')->get_tag('Name');
    foreach my $defhook("$jpptoolsdir/hooks/$name.pl","./hooks/$name.pl") {
	# macro_expansion should be here
	#print "looking for default hook $defhook\n";
	$hook = $defhook if (-e $defhook);
    }
}

die "bad Release: $rel (not starts with alt - nota an ALT Linux release !)" unless $rel=~/alt((?:\d+.)*)(\d+)(.*)/;
my $relmajor=$1;
my $relminor=$2;
my $reltail=$3;
my $newrel = 'alt0.M'.$backportver.'.1';
if ($relminor>0) {
    $newrel = 'alt'.$relmajor.($relminor-1).'.M'.$backportver.'.1';
}

$newrel=$release if ($release);
$alt->get_section('package','')->set_tag('Release',$newrel);

our @SPECHOOKS;

if ($hook) {
    require $hook;
    die "script $hook does not have a valid hook!\n" unless @SPECHOOKS;
    if (@SPECHOOKS) {
	$alt->{WARN_NOTAPPLIED}++;
	map {&$_($alt)} @SPECHOOKS;
	$alt->{WARN_NOTAPPLIED}--;
    }
}

if ($rpm || $spec) {
    $alt->get_section('changelog')->set_body($alt->get_section('changelog')->get_body());
}

if ($changelog) {
    $alt->set_changelog($changelog);
}

if ($packager eq 'auto') {
    $packager=$alt->macros()->macro_subst('%{packager}');
}

if ($packager) {
    if ($packager ne 'none') {
	$alt->get_section('package','')->set_tag('Packager',$packager);
    } else {
	$alt->get_section('package','')->clear_tag('Packager');
    }
}

print $alt->get_spec() if $spec or $verbose>2;
$alt->write_rpm() if $rpm;
$alt->cleanup();

