Better date handling and terminal size adaptation
authorTony Finch <dot@dotat.at>
Fri, 27 Mar 2015 15:22:41 +0000 (15:22 +0000)
committerTony Finch <dot@dotat.at>
Fri, 27 Mar 2015 15:22:41 +0000 (15:22 +0000)
git-graph

index a4f269e..d9bd62d 100755 (executable)
--- a/git-graph
+++ b/git-graph
@@ -4,6 +4,7 @@ use warnings;
 use strict;
 
 use Getopt::Long qw{:config gnu_getopt posix_default};
 use strict;
 
 use Getopt::Long qw{:config gnu_getopt posix_default};
+use POSIX;
 use Term::ReadKey;
 
 $0 =~ s{^.*/([^/]+)$}{$1};
 use Term::ReadKey;
 
 $0 =~ s{^.*/([^/]+)$}{$1};
@@ -15,14 +16,18 @@ sub fale { fail "@_: $!"; }
 
 my %opt;
 GetOptions(\%opt, qw{
 
 my %opt;
 GetOptions(\%opt, qw{
-       cancel
-       overlay
-       stack
+       cancel|c
+       overlay|o
+       stack|s
 }) or stop;
 
 $opt{stack} = 1 unless $opt{cancel} or $opt{overlay};
 
 }) or stop;
 
 $opt{stack} = 1 unless $opt{cancel} or $opt{overlay};
 
-my @log = qx{git log --pretty=format:%ai --shortstat};
+my @terminal = GetTerminalSize;
+my $width = $terminal[0] - 10;
+my $height = $terminal[1];
+
+my @log = qx{git log --pretty=format:%ct --no-merges --shortstat --since='$height days ago'};
 
 my %add;
 my %del;
 
 my %add;
 my %del;
@@ -40,8 +45,8 @@ while (@log) {
        fail "truncated git log output"
            unless defined $date and defined $stat;
        chomp ($date, $stat);
        fail "truncated git log output"
            unless defined $date and defined $stat;
        chomp ($date, $stat);
-       $date =~ s{^([0-9-]{10}) [0-9:]{8} [+-][0-9]{4}$}{$1}
-           or fail "bad date $date";
+       $date =~ m{^[0-9]{10}$} or fail "bad timestamp $date";
+       $date = int ($date / 86400);
        $stat =~ m{^\ \d+\ files?\ changed
                   (?:,\ (\d+)\ insertion[s()+]+)?
                   (?:,\ (\d+)\ deletion[s()-]+)?$}x
        $stat =~ m{^\ \d+\ files?\ changed
                   (?:,\ (\d+)\ insertion[s()+]+)?
                   (?:,\ (\d+)\ deletion[s()-]+)?$}x
@@ -60,13 +65,16 @@ while (@log) {
 my $max = $opt{cancel} ? $canmax :
     $opt{stack} ? $addmax + $delmax :
     $addmax > $delmax ? $addmax : $delmax;
 my $max = $opt{cancel} ? $canmax :
     $opt{stack} ? $addmax + $delmax :
     $addmax > $delmax ? $addmax : $delmax;
-my $width = [GetTerminalSize]->[0] - 12;
 my $scale = $width / $max;
 
 my $scale = $width / $max;
 
-for my $date (sort keys %add) {
+my $today = int (time / 86400);
+
+for my $date ($today - $height .. $today) {
        my $add;
        my $del;
        my $mod;
        my $add;
        my $del;
        my $mod;
+       $add{$date} //= 0;
+       $del{$date} //= 0;
        if ($opt{cancel}) {
                if ($add{$date} > $del{$date}) {
                        $add = $add{$date} - $del{$date};
        if ($opt{cancel}) {
                if ($add{$date} > $del{$date}) {
                        $add = $add{$date} - $del{$date};
@@ -92,8 +100,10 @@ for my $date (sort keys %add) {
                $del = $del{$date};
                $mod = 0;
        }
                $del = $del{$date};
                $mod = 0;
        }
-       printf "$date \e[33m%s\e[32m%s\e[31m%s\e[0m\n",
-           "#" x ($mod * $scale),
-           "+" x ($add * $scale),
-           "-" x ($del * $scale);
+       my $greg = strftime "%b %d %w", localtime $date * 86400;
+       $greg =~ s{(\d)$}{substr "sMTWTFs", $1, 1}e;
+       printf "$greg \e[33m%s\e[32m%s\e[31m%s\e[0m\n",
+           "#" x ($mod && 1 + $mod * $scale),
+           "+" x ($add && 1 + $add * $scale),
+           "-" x ($del && 1 + $del * $scale);
 }
 }