Add a horizontal scale
[u/fanf2/git-graph.git] / git-graph
index d9bd62d..b5254dd 100755 (executable)
--- a/git-graph
+++ b/git-graph
@@ -9,25 +9,18 @@ use Term::ReadKey;
 
 $0 =~ s{^.*/([^/]+)$}{$1};
 
-sub stop { exit 1; } # because 'die' uses a weird exit status
-sub wail { warn "$0: @_\n"; }
-sub fail { wail @_; stop; }
-sub fale { fail "@_: $!"; }
-
 my %opt;
 GetOptions(\%opt, qw{
        cancel|c
        overlay|o
        stack|s
-}) or stop;
+}) or exit 1;
 
 $opt{stack} = 1 unless $opt{cancel} or $opt{overlay};
 
 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 $width = $terminal[0] - 11;
+my $height = $terminal[1] - 2;
 
 my %add;
 my %del;
@@ -36,21 +29,18 @@ my $addmax = 0;
 my $delmax = 0;
 my $canmax = 0;
 
-while (@log) {
-       my $date = shift @log;
-       my $stat = shift @log;
-       my $blank = shift @log;
-       fail "bad blank line $blank"
-           unless not defined $blank or $blank eq "\n";
-       fail "truncated git log output"
-           unless defined $date and defined $stat;
-       chomp ($date, $stat);
-       $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
-           or fail "bad stats $stat";
+my $date;
+
+for (qx{git log --pretty=format:%ct --shortstat --since='$height days ago'}) {
+       next if m{^\s*$};
+       if (m{^(\d{10})\n$}) {
+               $date = int ($1 / 86400);
+               next;
+       }
+       m{^\ \d+\ files?\ changed
+         (?:,\ (\d+)\ insertion[s()+]+)?
+          (?:,\ (\d+)\ deletion[s()-]+)?$}x
+           or die "$0: bad stats $_";
        my ($add,$del) = ($1 || 0, $2 || 0);
        $add{$date} += $add;
        $del{$date} += $del;
@@ -107,3 +97,7 @@ for my $date ($today - $height .. $today) {
            "+" x ($add && 1 + $add * $scale),
            "-" x ($del && 1 + $del * $scale);
 }
+printf "         \e[33m#\e[0m <- %-8d %s %8d ->\n",
+    1/$scale,
+    " " x ($width - 25),
+    $max;