#!/usr/bin/perl -w

use strict;
use warnings;
use Carp;
use Test::Repocop::Log;
use Test::Repocop::Common;
use Test::Repocop::TestDB;
use Test::Repocop::Metadata;
use Test::Repocop::CLI::Base;
our @ISA=qw/Test::Repocop::CLI/;

$Test::Repocop::Log::verbose=1;
my $dry_run=1;
our @LONGOPT=(
    "n|dry-run!"  => \$dry_run,
    );
our @LONGOPT_POD2USAGE=qw/-verbose 1 -exitval 1/;
__PACKAGE__->get_and_process_cli_options();

my $metadata=Test::Repocop::Metadata->new();
my $testdb=Test::Repocop::TestDB->new();
# TODO: check and use this too
#my $sourceid2specfilename=Test::Repocop::Metadata::sourceid2specfilename();

my $testdb_3_iterator=$testdb->get_pkg_test_status_iterator();
while (my ($rpm,$test,$status)=$testdb_3_iterator->iterate3()) {
    #print STDERR "$rpm:$test:$status\n";
    if (!defined $rpm || !defined $test  || !defined $status) {
	print "Oops: should not be: bad $rpm:$test:$status\n";
    }
    my $sourceid=$metadata->sourceid($rpm);
    my $name=$metadata->name($rpm);
    my $version=$metadata->version($rpm);
    my $release=$metadata->release($rpm);
    my $arch=$metadata->arch($rpm);
    if (!defined $sourceid || !defined $name || !defined $version || !defined $release || !defined $arch) {
	if ($dry_run) {
	    print "bad metadata for rpm $rpm (name=$name version=$version release=$release arch=$arch sourceid=$sourceid)\n";
	} else {
	    print "forced purge of $rpm (bad rpm.db metadata)\n";
	    $testdb->delete_pkg($rpm);
	}
    } else {
	my $srcname=$metadata->name($sourceid);
	if (!defined $srcname) {
	    print "bad metadata for sourceid $sourceid of $rpm\n";
	}
    }
}
__END__



=head1	NAME

repocop-selftest - test and purge broken repocop db.

=head1	SYNOPSIS

B<repocop-selftest>
[B<-n|--dry-run|--no-dry-run> ]
[B<-h|--help>]
[B<-v|--verbose>]
[B<-q|--quiet>]
[B<--workdir> I<workdir>]

=head1	DESCRIPTION

B<repocop-selftest> checks repocop db for consistency
and purges found broken records if any.

Currently it only checks metadata from main rpm.db.

=head1	OPTIONS

=over

=item	B<-n|--dry-run>

Dry run. Purge nothing, just report.

=item	B<-no-dry-run>

Purge mode.

=item	B<--workdir> I<dir>

Provides alternative location for the Repocop workdir. Repocop workdir
is a place where test results and packages metadata information are stored.
Default is I<~/.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.


=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-2022 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
