#!/usr/bin/perl

=head1 DESCRIPTION

Подсчёт числа строк кода в различных репозиториях

direct-cloc --repo perl --from 2017-12-20 >~/cloc.perl

nc localhost 42000 <~/cloc.perl

direct-cloc --repo java --from 2017-12-20 >~/cloc.java

nc localhost 42000 <~/cloc.java

=cut

use Direct::Modern;

use Getopt::Long;

use Path::Tiny;
use Yandex::Shell;
use XML::LibXML;
use YAML::XS qw//;
use Yandex::TimeCommon qw/mysql2unix/;

$|++;

my %repos = (
    perl => {
        svn => 'svn+ssh://arcadia.yandex.ru/arc/trunk/arcadia/direct/perl',
        cloc_opts => ['--match-f', '\.(pl|pm|t)$', '--not-match-f', '^(geo_regions.pm|geobase.pm|RBAC.*Old.pm)$', '--force-lang=Perl,t'],
    },
    java => {
        svn => 'svn+ssh://arcadia.yandex.ru/arc/trunk/arcadia/direct',
        cloc_opts => ['--match-f', '\.(java)$', '--exclude-dir=dbschema', '--exclude-dir=generated', '--force-lang=Java,java'],
    },
);

sub _log {
    print STDERR @_, "\n";
}

my $REPOS;
my $FROM;
my $TO;
my $LIMIT = 0;
GetOptions(
    "repos=s" => \$REPOS,
    "from=s" => \$FROM,
    "to=s" => \$TO,
    "limit=i" => \$LIMIT,
    "h|help" => sub {
        system("podselect -section NAME -section DESCRIPTION $0 | pod2text-utf8 >&2");
        exit 0;
    },
    ) || die $!;

if (!defined $REPOS || !exists $repos{$REPOS}) {
    die "You must define --repos with one of ".join(", ", sort keys %repos);
}

my $tempdir = Path::Tiny->tempdir();
_log "temp dir: $tempdir";

my $cfg = $repos{$REPOS};
my $date2rev = svn_log_date2rev($cfg->{svn});

my @dates = sort 
    grep {!defined $TO || $TO ge $_} 
    grep {!defined $FROM || $FROM le $_} 
    keys %$date2rev;
if (!@dates) {
    _log "no dates, finish";
    exit 0;
}
if ($LIMIT > 0) {
    @dates = @dates[0..$LIMIT-1];
}

_log "checkout...";
yash_system("svn", "checkout", "-q", "--ignore-externals", -r => $date2rev->{$dates[0]}, $cfg->{svn}, "$tempdir");

for my $date (@dates) {
    _log "date=$date, svn up to $date2rev->{$date}...";
    yash_system("svn", "up", "-q", "--ignore-externals", -r => $date2rev->{$date}, "$tempdir");
    my $yaml = yash_qx("cloc", "--progress-rate=0", "--quiet", @{$cfg->{cloc_opts}}, "--yaml", "$tempdir");
    my $data = YAML::XS::Load($yaml);

    my $ts = mysql2unix($date);
    for my $lang (grep {!/^(SUM|Header)$/i} keys %$data) {
        while(my ($metric, $value) = each %{$data->{$lang}}) {
            print "junk.zhur.cloc.$REPOS.$lang.$metric $value $ts\n";
        }
    }
}


sub svn_log_date2rev {
    my $url = shift;
    my $xml = yash_qx("svn", "log", "--xml", $url);
    my $doc = XML::LibXML->new()->parse_string($xml)->documentElement();

    my %date2rev;
    foreach my $entry ($doc->findnodes('/log/logentry')) {
        my $rev = $entry->getAttribute('revision');
        my $date = substr $entry->findvalue('date'), 0, 10;
        $date2rev{$date} = $rev;
    }
    
    return \%date2rev;
}
