X-Git-Url: http://git.shiar.nl/barcat.git/blobdiff_plain/ef0556b2123644377182a9f43a4b2a753cb571a6..ea4599f110cbf1c347535ac1add4299bb8a5e13e:/graph diff --git a/graph b/graph index d317df5..0e07a6e 100755 --- a/graph +++ b/graph @@ -1,19 +1,33 @@ #!/usr/bin/env perl -use 5.014; +use 5.018; use warnings; use utf8; use List::Util qw( min max sum ); use open qw( :std :utf8 ); +use experimental qw( lexical_subs ); our $VERSION = '1.02'; use Getopt::Long '2.33', qw( :config gnu_getopt ); -sub podexit { require Pod::Usage; Pod::Usage::pod2usage(-exitval => 0, @_) } -GetOptions(\my %opt, +sub podexit { + require Pod::Usage; + Pod::Usage::pod2usage(-exitval => 0, -perldocopt => '-oman', @_); +} +my %opt; +GetOptions(\%opt, 'color|c!', 'follow|f:i', - 'trim|length|l=i', + 'trim|length|l=s' => sub { + my ($optname, $optval) = @_; + $optval =~ s/%$// and $opt{trimpct}++; + $optval =~ m/^-?[0-9]+$/ or die( + "Value \"$optval\" invalid for option $optname", + " (number or percentage expected)\n" + ); + $opt{trim} = $optval; + }, 'markers|m=s', + 'unmodified|u!', 'width|w=i', 'usage|h' => sub { podexit() }, 'help' => sub { podexit(-verbose => 2) }, @@ -21,6 +35,7 @@ GetOptions(\my %opt, $opt{width} ||= $ENV{COLUMNS} || 80; $opt{color} //= -t *STDOUT; # enable on tty +$opt{trim} *= $opt{width} / 100 if $opt{trimpct}; if (defined $opt{follow}) { $opt{follow} ||= 1; @@ -35,8 +50,9 @@ $SIG{INT} = 'IGNORE'; # continue after assumed eof my (@lines, @values); while (readline) { - chomp; - push @values, s/^\h* ( -? [0-9]* (?:\.[0-9]+)? )//x && $1; + s/\r?\n\z//; + s/^\h*// unless $opt{unmodified}; + push @values, s/^ ( \h* -? [0-9]* \.? [0-9]+ |)//x && $1; if (defined $opt{trim}) { my $trimpos = abs $opt{trim}; if ($trimpos <= 1) { @@ -48,12 +64,14 @@ while (readline) { } push @lines, $_; } -@lines or exit; $SIG{INT} = 'DEFAULT'; sub show_lines { +state $nr = 0; +@lines and @lines > $nr or return; + my @order = sort { $b <=> $a } grep { length } @values; my $maxval = $order[0]; my $minval = min $order[-1], 0; @@ -72,9 +90,21 @@ if ($opt{markers} // 1 and $size > 0) { $barmark[ orderpos($#order / 2) ] = '+'; # mean $barmark[ -$minval * $size ] = '|' if $minval < 0; # zero defined and $opt{color} and $_ = "\e[36m$_\e[0m" for @barmark; + + state $lastmax = $maxval; + if ($maxval > $lastmax) { + print ' ' x ($lenval + $len); + printf "\e[90m" if $opt{color}; + printf '%-*s', + ($lastmax - $minval) * $size + .5, + '-' x (($values[$nr - 1] - $minval) * $size); + print "\e[92m" if $opt{color}; + say '+' x (($maxval - $lastmax - $minval) * $size + .5); + print "\e[0m" if $opt{color}; + $lastmax = $maxval; + } } -state $nr = 0; while ($nr <= $#lines) { my $val = $values[$nr]; if (length $val) { @@ -123,7 +153,7 @@ disabled otherwise such as when piped or redirected. Interval to output partial progress. -=item -l, --length=[-] +=item -l, --length=[-][%] Trim line contents (between number and bars) to a maximum number of characters. @@ -166,6 +196,11 @@ or 68% of all entries. =back +=item -u, --unmodified + +Do not strip leading whitespace. +Keep original value alignment, which may be significant in some programs. + =item -w, --width= Override the maximum number of columns to use. @@ -200,7 +235,7 @@ Number of HTTP requests per day: Any kind of database query with leading counts: echo 'SELECT count(*),schemaname FROM pg_tables GROUP BY 2' | - psql -t | graph + psql -t | graph -u Git statistics, such commit count by year: