#!/usr/bin/perl -w

package Source::Repository::Mass::AutorepoPurge;

use strict;
use warnings;
use Carp;
use File::Basename;
use Getopt::Long;
use RPM::Header;
use File::Find;

use Autorepo::Config;

use Source::Shared::Resource::Verbose;
use Source::Repository::Mass 0.412;
use Source::Repository::Matcher;
use Source::Repository::Matcher::DistroMap;
use Source::Repository::Mass::RPMEpoch;
use Source::Repository::Mass::RPMNoEpoch;
use Source::Repository::Mass::ALTLinuxBackport 0.004;
use Source::Repository::Mass::SkipName::AltFilesList;

our @ISA = qw/Source::Repository::Mass/;

my $list_only=1;
my $autoports_mode=$CONFIG{'AUTOREPO_AUTOPORTS_SUFFIX'};
my $verbose=0;
$verbose=1 if $ENV{TERM}; # not to pollute cron mail

$Source::Repository::Mass::ORIGINPATH="$AUTOREPO_ROOT/$AUTOREPO_SHARED_SRPMS";
$Source::Repository::Mass::DESTPATH=$CONFIG{'AUTOREPO_PURGE_DESTPATH'};
$Source::Repository::Mass::Transform::suppress_rename=1;
$Source::Repository::Mass::strategy = 'both';

if (!$CONFIG{'AUTOREPO_PURGE_DESTPATH'} or $CONFIG{'AUTOREPO_PURGE_DESTPATH'} eq 'none') {
    print "purge disabled (AUTOREPO_PURGE_DESTPATH not set) \n";
    exit;
}

sub print_longopt {
    print "  Purge options:
	--autoports autoports mode
	--list (default) list srpms to be purged, no removal
	--purge|--remove remove duplicates
";
}
our @LONGOPT=(
    'autoports' => \$autoports_mode,
    'list' => sub {$list_only=1},
    'purge|remove' => sub {$list_only=0},
    );

sub before_process_options {
    my ($self)=@_;
    $verbose=$Source::Shared::verbose-1 if $Source::Shared::verbose>1;
    $verbose=0 if !$Source::Shared::verbose;
    if (! $autoports_mode) {
	@Source::Repository::Mass::EXT_LONGOPT_CLASSES = grep {$_ ne 'Source::Repository::Mass::ALTLinuxBackport'} @Source::Repository::Mass::EXT_LONGOPT_CLASSES;
    }
}

sub process_options {
    my ($self)=@_;
    if ($autoports_mode) {
	$Source::Repository::Mass::strategy = 'older';
	&Source::Repository::Mass::RPMEpoch::set_defaults();
	$Source::Repository::Mass::epoch_comparator=\&Source::Package::Comparators::rpm40_epoch_comparator;
	$RPM::Source::Convert::ALTLinuxBackport::backport_suffix=$CONFIG{'AUTOREPO_AUTOPORTS_SUFFIX'};
	$DistroMap::default_destbranch=$AUTOREPO_BRANCH;
	print STDERR "PURGE:process_options: autoports mode: branch=$AUTOREPO_BRANCH\n" if $verbose>1;
	
    } else {
	&Source::Repository::Mass::RPMNoEpoch::set_defaults();
	$DistroMap::default_destbranch='sisyphus';
	print STDERR "PURGE:process_options: default mode: branch=sisyphus", 
	    " strategy=$Source::Repository::Mass::strategy",
	    " ORIGINPATH=$Source::Repository::Mass::ORIGINPATH",
	    " DESTPATH=$Source::Repository::Mass::DESTPATH",
	    "\n" if $verbose>1;
    }
}

my $convert=Source::Repository::Mass::AutorepoPurge->new(-opt_all_names_def_repo=>1);

my %OLDSRPM;
my @OLDRPM;

$convert->process();

my @deprecated_srpms=sort (keys(%OLDSRPM));
unless (@deprecated_srpms) {
    print "No deprecated src.rpms found.\n" if $verbose;
} else {
    print "Deprecated:\n";
    foreach my $srpm (@deprecated_srpms) {
	print "$srpm\n";
    }
    unless ($list_only) {
	foreach my $srpm (@deprecated_srpms) {
	    unlink $OLDSRPM{$srpm}, map {"$_/$srpm"} @AUTOREPO_SRPM_LINKDIRS;
	}
	find(\&wanted, @AUTOREPO_RPM_DIRS);
	#map {print "rpm: $_\n"} @OLDRPM;
	unlink @OLDRPM;
	system ('autorepo-rebuild-repository');
    }
}

sub process_pair {
    my ($self,$pkgpair,$transaction_name,$transaction_count)=@_;
    my $originrpm=$pkgpair->origin->{-file};
    print STDERR "processing pair: ",$pkgpair->originname,' (',basename($originrpm),') - ',$pkgpair->destname,' (',$pkgpair->dest->{-file},")\n" if $verbose >1;
    die "Oops: no file for ".$pkgpair->originname if not $originrpm;
    $OLDSRPM{basename($originrpm)}=$originrpm;
}

sub wanted {
    return unless $File::Find::name and -f $File::Find::name;
    my $href = new RPM::Header $File::Find::name;
    die "Oops: not an rpm ".$File::Find::name unless $href;
    die "Oops: no srpm info ".$File::Find::name unless $href->{SOURCERPM};
    push @OLDRPM, $File::Find::name if $OLDSRPM{$href->{SOURCERPM}};
}

1;
