#!/usr/bin/perl -w

=head1 NAME

    inspect-svn-branch -- Статистика по бранчам

=head1 DESCRIPTION

    inspect-svn-branch --so     # бранчи по владельцам
    inspect-svn-branch calc_price_refactoring     # информация про отдельный брач 
    inspect-svn-branch |grep `whoami` |grep 'WAS MERGED'     # мои смерженные бранчи

    inspect-svn-branch -svn $DRT calc_price_refactoring 
    inspect-svn-branch -svn $DRT calc_price_refactoring advq-timings Antispam

    Опции:
        -h, --help
            показать справку

        --svn <svn_url>
            корень проекта в svn
            если не указан -- будет взят умолчальный проект из ProjectSpecific.pm

        --sort-by-owner, --so
            сортировать бранчи по владельцу

        --sort-by-age, --sa
            сортировать бранчи по возрасту

    Параметры
        имена бранчей (полные или относительно каталога branches)
        без параметров -- выводит статистику по всем бранчам

=cut

# $Id$


use strict;
use warnings;

use Getopt::Long;

use Yandex::Svn;
use ProjectSpecific qw/svn_url/;

use utf8;
use open ':std' => ':utf8';

#.......................................................

run() unless caller();

sub run
{
    my %O = parse_options();

    my $delayed_print = $O{sort_by_owner} || $O{sort_by_age} ? 1 : 0;

    print "### svn: $O{svn_root}\n";
    my $stat = svn_branches_stat(
        $O{svn_root}, 
        branches => (@ARGV ? \@ARGV : ''),
        process_branch_stat => ($delayed_print ? sub {print ".";} : \&print_branch_stat)
    );

    exit unless $delayed_print;

    print "\n";

    # Сортируем бранчи
    @$stat = sort { $a->{create_author} cmp $b->{create_author} } @$stat if $O{sort_by_owner};
    @$stat = sort { $a->{create_date} cmp $b->{create_date} } @$stat if $O{sort_by_age};

    # Печатаем результат
    my $prev_owner = '';
    for my $s (@$stat){
        print "\n" if $O{sort_by_owner} && $prev_owner ne $s->{create_author};
        $prev_owner = $s->{create_author};
        print_branch_stat($s);
    }

    exit;
}

# разбирает параметры командной строки
sub parse_options
{
    my %O = (
    );

    my $svn;
    GetOptions (
        "h|help"   => \&usage,
        "svn=s"    => \$svn,
        "so|sort-by-owner"    => \$O{sort_by_owner},
        "sa|sort-by-age"      => \$O{sort_by_age},
    ) or die "can't parse options";

    $svn ||= svn_url('root');

    die "svn url missed (--svn option)" if !$svn;

    ( $O{svn_root} = $svn ) =~ s!(/trunk|/branches)/?$!!;

    return %O;
}


# Печатает usage-сообщение
sub usage {
    system("podselect -section SYNOPSIS -section DESCRIPTION $0 | pod2text-utf8 >&2");
    exit(1);
}


# Печатает строку статистики по одному файлу
sub print_branch_stat
{
    my ($s) = @_;

    print "$s->{branch}: created $s->{create_date} ( r$s->{create_rev} ) by $s->{create_author}; " 
        . "changed $s->{edit_date} by $s->{edit_author}; "
        . ( $s->{merged_rev} ? "WAS MERGED into trunk" : "not merged into trunk yet" )
        . ( $s->{merged_rev} && $s->{edit_rev} > $s->{merged_rev} ? 
            " but has additional commits (merged: $s->{merged_rev}, changed: $s->{edit_rev})" 
            : "" 
        )
        . "\n";

    return;
}

