Estimativa do tempo gasto no projeto Git com o grep

1

Considere um log do Git:

commit 4d6b30238fbfc972ea4505cadf43abd316506d9e
Author: Dotan Cohen <[email protected]>
Date:   Mon Jan 11 22:41:21 2016 +0200

    Final foobar version

commit 4d6b30238fbfc972ea4505cadf43abd316506d9e
Author: Dotan Cohen <[email protected]>
Date:   Mon Jan 11 19:11:51 2016 +0200

    Working foobars

commit 4d6b30238fbfc972ea4505cadf43abd316506d9e
Author: Dotan Cohen <[email protected]>
Date:   Mon Jan 11 10:31:37 2016 +0200

    Broken foobars

commit 4d6b30238fbfc972ea4505cadf43abd316506d9e
Author: Dotan Cohen <[email protected]>
Date:   Mon Jan 10 21:47:22 2016 +0200

    Added foobars

commit 4d6b30238fbfc972ea4505cadf43abd316506d9e
Author: Dotan Cohen <[email protected]>
Date:   Mon Jan 10 11:54:12 2016 +0200

    Preparation for foobars

Como posso obter a primeira e a última vez de cada mensagem de confirmação para cada dia, depois fazer um pouco de matemática e estimar o tempo total gasto? Algo parecido com isto:

Date:   Mon Jan 11 22:41:21 2016 +0200
Date:   Mon Jan 11 10:31:37 2016 +0200
TOTAL A:           12:09:44

Date:   Mon Jan 10 21:47:22 2016 +0200
Date:   Mon Jan 10 11:54:12 2016 +0200
TOTAL B:           09:53:10

TOTAL: 22:02:54

Para os propósitos desta edição, podemos supor que todos os commits foram feitos pela mesma pessoa. Observe que pode haver uma quantidade arbitrária de confirmações por dia e uma quantidade arbitrária de dias que pode abranger diferentes meses ou anos.

    
por dotancohen 19.01.2016 / 15:43

1 resposta

2

O seguinte código Perl deve aproximá-lo muito, muito perto do que eu acho que você quer. Se você não estiver familiarizado com o Perl, será necessário instalar o módulo DateTime::Format::Strptime do CPAN ... cpan install DateTime::Format::Strptime .

Em seguida, imprima seu log git em um arquivo git log > git.log .

Depois disso, cole o seguinte código em um arquivo, coloque o arquivo de log no mesmo diretório e execute-o.

Não é o meu código mais bonito ou mais eficiente, mas eu só tinha alguns minutos para colocar algo em conjunto.

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

use DateTime::Format::Strptime;

my $log = 'git.log';

open my $fh, '<', $log or die $!;

my %dates;
my @order;

while (<$fh>){
    if (/Date:\s+(.*?)(\d{2}:.*)/){
        push @order, $1 if ! $dates{$1};
        push @{ $dates{$1} }, "$1$2";
    }
}

my $letter = 'A';
my $total_time = DateTime::Duration->new;

for my $day (@order){

    my $start = $dates{$day}->[0];
    my $end   = $dates{$day}->[-1];

    my $parser = DateTime::Format::Strptime->new(
        pattern  => '%a %b %d %H:%M:%S %Y %z',
        on_error => 'croak',
    );

    my $dt1 = $parser->parse_datetime($start);
    my $dt2 = $parser->parse_datetime($end);

    my $total = $dt1 - $dt2;
    $total_time = $total_time + $total;

    print "$start\n$end\n";

    print "Total $letter:\t";
    print join ':', ($total->hours, $total->minutes, $total->seconds);
    print "\n\n";

    $letter++;
}

print "Total time overall: ";
print join ':', ($total_time->hours, $total_time->minutes, $total_time->seconds);
print "\n";
    
por 19.01.2016 / 17:37

Tags