#!/usr/bin/perl -w

=head1 NAME
      
 
=head1 SYNOPSIS

    direct-release-flag <action>
  
=head1 DESCRIPTION

    Опции:
      Для всех: 
        -h, --help 
            показать справку и завершиться
        --check 
            выводит сводку по релиз-флагу. Можно не указывать, это -- действие по умолчанию
            если релиз-флаг сброшен -- код возврата 0 ("ок, можно спокойно коммитить")
            если флаг установлен    -- код возврата 1 ("осторожно, релиз")
        -q, --quiet 
            ничего не выводить в STDOUT

      Для релиз-менеджера:
        --set [mins]
            установить релиз-флаг на <mins> минут. По умолчанию -- на 90. 
        --drop 
            сбросить релиз-флаг

      Если хочется использовать не на ppcdev'е: 
        надо, чтобы на машину монтировался каталог /tmp/direct_release_flag с ppcdev'а
        + выставить переменную DIRECT_RELEASE_FLAG_DIR -- путь к этому примонтированному каталогу


=head1 COMMENTS

=cut

# $Id$

use strict;
use Getopt::Long;
use File::Slurp;

use utf8;
use open ':locale';

#.......................................................................................
my $dir = $ENV{DIRECT_RELEASE_FLAG_DIR} || '/tmp/direct_release_flag';
my $flag_filename = 'delta';
my $flag_full_filename = "$dir/$flag_filename";
my $DEFAULT_DELTA = 90; # в минутах

{
my $VERBOSE = 1;

sub p{print @_,"\n" if $VERBOSE;}

sub set_verbose{$VERBOSE = shift;}
}

#.......................................................................................
my $opt = parse_options();

if ($opt->{set_delta}){
    # выставляем флаг "осторожно, релиз"
    umask 0022;
    mkdir $dir; 
    chdir $dir or die "can't cd to $dir";
    write_file( $flag_full_filename, $opt->{set_delta} ) ;
    p "записан файл $flag_full_filename, время действия: $opt->{set_delta} мин.\n";
} elsif($opt->{drop}) {
    # снимаем флаг "осторожно, релиз"
    unlink $flag_full_filename or die "can't remove file $flag_full_filename"; 
    p "удален файл $flag_full_filename";
} elsif($opt->{check}) {
    my $release = 0; 
    my ($delta_min, $delta_sec, $flag_create_time);
    if (-f $flag_full_filename ){
        $delta_min = read_file($flag_full_filename) || $DEFAULT_DELTA;
        $delta_sec = $delta_min * 60;
        $flag_create_time = (stat($flag_full_filename))[9];
        $release = 1 if $flag_create_time >= time - $delta_sec; 
    }

    p "\nФлаг 'релиз' ".($release ? "установлен" : "сброшен");
    p $release ? "Пожалуйста, воздержись от коммитов в trunk\n" : "";
    if($release){
        # подробности: когда выставлен, когда закончится
        p "установлен:     ".localtime($flag_create_time);
        p "время действия: $delta_min мин.";
        p "заканчивается:  ".localtime($flag_create_time+$delta_sec);
        p "сейчас:         ".localtime;
        p "";
    }
    
    exit $release ? 1 : 0;
}


exit 0;
#.......................................................................................


=head2 parse_options
    
    возвращает ссылку на хеш с опциями из командной строки

=cut

sub parse_options
{
    my %O = (
    );

    my $opt_ok = GetOptions (
        "h|help"             => \&usage,
        "check"              => \$O{check},
        "set:$DEFAULT_DELTA" => \$O{set_delta},
        "drop"               => \$O{drop},
        "q|quiet"            => \$O{quiet},
    );

    $O{check} = 1 unless $O{set_delta} || $O{drop};   

    set_verbose(0) if $O{quiet};

    unless($opt_ok){
        print "can't parse options\n";
        exit(1);
    }

    return \%O;
}


=head2 usage

    Печатает usage-сообщение

=cut

sub usage {
    system("podselect -section SYNOPSIS -section DESCRIPTION $0 | pod2text-utf8 >&2");
    exit(1);
}

