#!/usr/bin/perl -w

use strict;
use Test::Repocop::Common;
use Test::Repocop::Options;
use Test::Repocop::SQL;
use Test::Repocop::TestDB;
use File::Path;

my $cmd_tail=substr($0, -6);
$Repocop::arg::except=$cmd_tail eq "except";
$Repocop::arg::except=0 if $cmd_tail eq "-given";
$verbose=1;
my $repocop_vacuum_db=1;
&Test::Repocop::Options::get_common_options(
    # Unknown option: -db-vacuum for --no-db-vacuum :(
    # TODO: deprecate? bug in some versions of Getopt::Long, it seems
    "db-vacuum!"  => \$repocop_vacuum_db,

    "vacuum!"  => \$repocop_vacuum_db,
);
&Test::Repocop::Options::die_if_nothing_to_report();

my @pkg_keylist_to_purge=&Repocop::arg::pkg_keylist();
exec "pod2usage --exit=2 $0" unless @pkg_keylist_to_purge;

print "'except' mode\n" if $verbose and $Repocop::arg::except;

print "purging testdb...\n" if $verbose;
Test::Repocop::TestDB->new()->purge();

my $repocop_test_dbdir="$repocop_cachedir/db";
print "purging databases in $repocop_test_dbdir...\n" if $verbose;
foreach my $dbfile (glob "$repocop_test_dbdir/*.db") {
    &repocop_note("purge $dbfile");
    my $testname=$dbfile;
    $testname=~s/\.db$//;
    $testname=~s!^$repocop_test_dbdir/!!;
    my $testdir=&Test::Repocop::Common::find_test_dir($testname);
    my $purge_sql=$testdir.'/purge.sql';
    $purge_sql=undef unless -e $purge_sql;
    &repocop_note("purge $dbfile".($purge_sql ? " [using $purge_sql]":'').".");
    &Test::Repocop::SQL::purge_db($dbfile, $purge_sql);
    if ($repocop_vacuum_db) {
	&repocop_note("vacuum $dbfile.");
	&repocop_note("[note: vacuuming can be skipped with --novacuum option].");
	&Test::Repocop::SQL::vacuum_db($dbfile);
    }
}

foreach my $testpurge (&Test::Repocop::Common::glob_tests('purge', @Repocop::arg::tests_dir)) {
    my $testname=&Test::Repocop::Common::filepath2testname($testpurge);
    &Test::Repocop::Common::set_test_environment($testname);
    &Test::Repocop::Common::mkdir_test_environment($testname);
    &repocop_note("trying [purge] $testname");
    my $purgearg = $Repocop::arg::except? '--except':'--given';
  
    if (-x $testpurge) {
	open (PURGECMD,'|-',$testpurge, $purgearg) or die "opening purge script $testpurge failed: $?";
	map {print PURGECMD $_,"\n"} @pkg_keylist_to_purge;
    }
    close(PURGECMD) or die "closing pipe to purge script $testpurge failed: $?";
    &Test::Repocop::Common::cleanup_test_environment($testname);
}


print "done.\n" if $verbose;

=head1	NAME

repocop-purge-except, repocop-purge-given - purge repocop cache from obsolete results.

=head1	SYNOPSIS

B<repocop-purge-except, repocop-purge-given>
[B<-h|--help>]
[B<-v|--verbose>]
[B<-q|--quiet>]
[B<-c|--cachedir> I<cachedir>]
[B<--et|--exclude-test> I<comma separated list of tests>]
[B<--it|--include-test> I<comma separated list of tests>]
[B<--ep|--exclude-packager> I<comma separated list of packager's nicks>]
[B<--ip|--include-packager> I<comma separated list of packager's nicks>]
[B<--pkgcollectors-dir> I<comma separated list of local collectors' dirs>]
[B<--srccollectors-dir> I<comma separated list of local collectors' dirs>]
[B<--pkgtests-dir> I<comma separated list of local tests' dirs>]
[B<--srctests-dir> I<comma separated list of local tests' dirs>]
[B<--ex|--except>] 
[B<-g|--given>] 
[B<-l|--last-run>] 
[B<--newer>] I<filename>
[B<-r|--report> <s[kip]|o[k]|w[arn]|f[ail]>]
[I<DIR>...] [I<FILE>...]

=head1	DESCRIPTION

B<repocop-purge-except, repocop-purge-given> 
purge repocop cache from obsolete results. There are two modes of that
utility: repocop-purge-except removes all data except about packages
given as its arguments (or from last run, -l option).
repocop-purge-given removes all data about given packages.

=head1	OPTIONS

=over

=item	B<-c,--cachedir> I<dir>

Provides alternative location for cachedir. 
Repocop cachedir is a place where test results and 
packages metadata information are stored.

=item	B<--except>, B<--given>

Control processing of rpm arguments. 
B<--given> (default) means processing only given rpm arguments.
B<--except>  means processing all data except given rpm arguments.

=item	B<--et, --exclude-test> I<comma separated list of tests>

Report all processed tests exept the given excluded set.

=item	B<--it, --include-test> I<comma separated list of tests>

Report the given set of tests.

=item	B<--ep, --exclude-packager> I<comma separated list of tests>

=item	B<--it, --include-packager> I<comma separated list of tests>

Exclude/include packages according to Packager: tag.

=item [B<--pkgcollectors-dir> I<comma separated list of local collectors' dirs>]

=item [B<--srccollectors-dir> I<comma separated list of local collectors' dirs>]

=item [B<--pkgtests-dir> I<comma separated list of local tests' dirs>]

=item [B<--srctests-dir> I<comma separated list of local tests' dirs>]

Append user's local tests and collectors to repocop.

=item	B<-h, --help>

Display this help and exit.

=item	B<-v, --verbose>, B<-q, --quiet>

Verbosity level. Multiple -v increase the verbosity level, -q sets it to 0.

=item	B<-l, --last-run>

Use the set of packages processed at last run as an argument.

=item	B<--newer> I<filename>

Process packages newer then I<filename> only.
Note: this filtering does not apply to B<--last-run> option.

=item	B<--acl-file> I<file>

the argument is /path/to/Sisyphus/files/list/list.src.classic
This option is ALTLinux-specific. The file content is ACL db,
which is used to sort result by ALTLinux ACL.


=back

=head1	AUTHOR

Written by Igor Vlasenko <viy@altlinux.org>.

=head1	ACKNOWLEGEMENTS

To Alexey Torbin <at@altlinux.org>, whose qa-robot package
had a strong influence on repocop. 

=head1	COPYING

Copyright (c) 2008 Igor Vlasenko, ALT Linux Team.

This is free software; you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later version.

=cut

