#!/usr/bin/perl -w

use strict;
use DBI;
use Test::Repocop::Options;
use Test::Repocop::TestDB;
use Test::Repocop::Metadata;

$Repocop::arg::reportlevel='skip';
#my $repocop_patch_url='http://ftp.linux.kiev.ua/pub/Linux/ALT/people/viy/repocop/reports/diff/by-srpm';
my $repocop_patch_url='http://repocop.altlinux.org/pub/repocop/reports/diff/by-srpm';
&Test::Repocop::Options::get_common_options(
    'patchurl=s' => \$repocop_patch_url,
);
&Test::Repocop::Options::die_if_nothing_to_report();

use vars qw($db $dbUser $dbPass $dbHost);
eval {
    #require '/usr/share/prometeus/web/cgi-bin/adm/dbinfo';
    require '/usr/share/prometeus/scripts/dbinfo';
};
die "can't find prometeus dbinfo file" if $@;

our $dsn = "DBI:mysql:$db:$dbHost";
our $dbh = DBI->connect($dsn,$dbUser,$dbPass) || die "can't connect to mysql\n";

my $sth = $dbh->do("DELETE from repocop");

#  name varchar(100) binary NOT NULL default '',
#  version varchar(100) NOT NULL default '',
#  rel varchar(100) NOT NULL default '',
#  arch varchar(10) NOT NULL default 'i586',
#  srcname varchar(100) binary NOT NULL default '',
#  srcversion varchar(50) NOT NULL default '',
#  srcrel varchar(20) NOT NULL default '',
#  testname varchar(100) NOT NULL default '',
#  status enum('skip','ok','warn','fail') NOT NULL default 'skip',
#  message mediumtext,

my $bugz_in_Q = "REPLACE repocop VALUES(?,?,?,?,?,?,?,?,?,?)";

$sth = $dbh->prepare($bugz_in_Q);

my $metadata=Test::Repocop::Metadata->new();
my $testdb=Test::Repocop::TestDB->new();
my $cache=$testdb->get_pkg_test_status_result_iterator();
while (my ($rpm,$test,$status,$result)=$cache->iterate4_filtered()) {
    my $name=$metadata->name($rpm);
    my $version=$metadata->version($rpm);
    my $release=$metadata->release($rpm);
    my $arch=$metadata->arch($rpm);
    my $srpm=$metadata->sourceid($rpm);
    my $srcname=$metadata->name($srpm);
    my $srcversion=$metadata->version($srpm);
    my $srcrelease=$metadata->release($srpm);
    unless (defined $srcname && defined $name && defined $version && defined $release && defined $arch) {
	warn "internal error: broken metadata for $rpm";
	next;
    }
    &to_prometeus($name,$version,$release,$arch,$srcname,$srcversion,$srcrelease,$test,$status,$result);
}

sub to_prometeus {
    return unless $_[0];
    $sth->execute(@_);
}

my $repocop_patchdir="$repocop_cachedir/reports/diff/by-srpm";

unless (-d $repocop_patchdir) {
    warn "repocop patches not found. run repocop-fix-* first.\n";
    exit;
}

$sth = $dbh->do("DELETE from repocop_patches");

#  name varchar(100) binary NOT NULL default '',
#  version varchar(50) NOT NULL default '',
#  rel varchar(20) NOT NULL default '',
#  url varchar(100) NOT NULL default '',

my $patch_Q = "REPLACE repocop_patches VALUES(?,?,?,?)";

$sth = $dbh->prepare($patch_Q);

foreach (glob "$repocop_patchdir/*") {
    s!^$repocop_patchdir/!!;
    my $patchname=$_;
    s!.diff!.src!;
    my $srpm=$_;
    my $name=$metadata->name($srpm);
    my $version=$metadata->version($srpm);
    my $release=$metadata->release($srpm);
    my $url=$repocop_patch_url.'/'.$patchname;
    $sth->execute($name,$version,$release,$url);
}

=head1	NAME

repocop-report-prometeus - a tool that reports repocop unit tests results to prometeus.

=head1	SYNOPSIS

B<repocop-report-prometeus>
=include synopsis.pod.in

=head1	DESCRIPTION

B<repocop-report-prometeus> processes results of repocop unit tests, 
created with repocop-run command, stored in <cachedir>, 
and publishes results to prometeus.
Presize subset of tests can be selected using B<--include>
and B<--exclude> options.

=head1	OPTIONS

=over

=include options-report.pod.in
=include options.pod.in

=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

