#!/usr/bin/perl
use strict;
use warnings;

# $Id$

=head1 NAME

svn-reset - вернуть рабочую копию в состояние "как после svn checkout"

=head1 DESCRIPTION

svn-reset file file ... [ --keep-ignored ]

Параметры:

    file            Файл или каталог для приведения в исходное состояние
    --keep-ignored  Если указан, файлы из svn:ignore не удаляются
    --only-ignored  Если указан, удаляются только файлы из svn:ignore
    --quiet         Уменьшить объём выводимой информации; выводить только ошибки

См. также:

    svn help revert

=head1 SYNOPSIS

    b 8699
    cd packages/svnroot
    svn-reset .

=cut

use Getopt::Long;

use Yandex::Shell;
use Yandex::Svn;

my ( $opt_keep_ignored, $opt_only_ignored, $opt_quiet );
my $getopt_ok = GetOptions(
    'keep-ignored' => \$opt_keep_ignored,
    'only-ignored' => \$opt_only_ignored,
    'quiet'        => \$opt_quiet,
    'help|usage'   => \&usage,
);

my @files = @ARGV;
unless ($getopt_ok) {
    die "Invalid arguments, please refer to --help for usage information\n";
}

unless (@files) {
    die "Missing operand, please refer to --help for usage information\n";
}

if ( $opt_keep_ignored && $opt_only_ignored ) {
    print STDERR "--keep-ignored and --only-ignored are mutually exclusive\n";
    exit 1;
}

my $cmd = {
    'svn_revert' => [ 'svn', 'revert', '-R' ],
    'rm'         => [ 'rm', '-rvf' ],
};

if ($opt_quiet) {
    $cmd = {
        'svn_revert' => [ 'svn', 'revert', '-R', '-q' ],
        'rm'         => [ 'rm', '-rf' ],
    };
}

foreach my $file (@files) {
    my $status = svn_file_status($file);
    $status->{unversioned} ||= [];
    $status->{ignored}     ||= [];

    if ($opt_only_ignored) {
        foreach my $ignored_file ( @{ $status->{ignored} } ) {
            yash_system( @{ $cmd->{rm} }, $ignored_file );
        }
    } else {
        yash_system( @{ $cmd->{svn_revert} }, $file );

        foreach my $unversioned_file ( @{ $status->{unversioned} } ) {
            yash_system( @{ $cmd->{rm} }, $unversioned_file );
        }

        unless ($opt_keep_ignored) {
            foreach my $ignored_file ( @{ $status->{ignored} } ) {
                yash_system( @{ $cmd->{rm} }, $ignored_file );
            }
        }
    }
}

sub usage {
    system "podselect -section NAME -section DESCRIPTION $0 | pod2text-utf8";
    exit 0;
}
