#!/usr/bin/perl -w

use strict;
use warnings;
use Carp;
use Getopt::Long;
use File::Basename;
use RPM::Source::Editor;

my $verbose=1;
my $result = GetOptions (
		      "verbose+"  => \$verbose);

my $specfile=$ARGV[0];
if (!$specfile) {
    print "usage:$0 specfile\n";
    exit (1);
}
if (! -e $specfile) {
    print "ERROR: $specfile does not found\n";
    exit (64);
}

my $spec=RPM::Source::Editor->new(
    SPECFILE=> $specfile,
    VERBOSE=> $verbose,
);

my $mainsec=$spec->get_section('package','');

my $timestamp=`date +"\%Y\%m\%d"`;
chomp $timestamp;



&update_tag('Release');
&update_tag('Version');
&update_tag('Serial');
&update_tag('Epoch');
sub update_tag{
    my $tagname=shift;
    my $val = $mainsec->get_tag($tagname, RAW=>1);
    if ($val and $val=~/20[012]\d(?:0[1-9]|1[0-2])[0-3][0-9]/) {
	$val=~s/20[012]\d(?:0[1-9]|1[0-2])[0-3][0-9]/$timestamp/;
	print "changed timestamp in tag $tagname\n";
	$mainsec->set_tag($tagname, $val);
	&write_spec_and_exit();
    }
}

if ($mainsec->match_body(qr'^\%define\s+[\w_]+\s+20[012]\d(?:0[1-9]|1[0-2])[0-3][0-9]\s*$')) {
    print "changed timestamp in macro definition\n";
    $mainsec->subst_body_if(qr'20[012]\d(?:0[1-9]|1[0-2])[0-3][0-9]',$timestamp,
		       qr'^\%define\s+[\w_]+\s+20[012]\d(?:0[1-9]|1[0-2])[0-3][0-9]\s*$');
    &write_spec_and_exit();
};

print "timestamp not found in spec file. exiting.\n";
exit 3;

sub write_spec_and_exit {
    system('mv',$specfile,$specfile.'~')==0 or die "can't backup specfile $specfile";
    open SPEC, '>', $specfile or die "can't rewrite specfile $specfile: $!";
    print SPEC $spec->get_spec();
    close SPEC;
    exit 0;
}
