git.shiar.nl
/
barcat.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
silence warnings on empty input
[barcat.git]
/
barcat
diff --git
a/barcat
b/barcat
index e6b22b6872becc110a6fe3934077c51e61851b8a..2c1104871194a4ae25395113c6a215599ddcf112 100755
(executable)
--- a/
barcat
+++ b/
barcat
@@
-18,7
+18,10
@@
GetOptions(\%opt,
'color|c!',
'C' => sub { $opt{color} = 0 },
'field|f=s' => sub {
'color|c!',
'C' => sub { $opt{color} = 0 },
'field|f=s' => sub {
- $opt{anchor} = /^[0-9]+$/ ? qr/(?:\S*\h+){$_}\K/ : $_ for $_[1];
+ eval {
+ local $_ = $_[1];
+ $opt{anchor} = /^[0-9]+$/ ? qr/(?:\S*\h+){$_}\K/ : qr/$_/;
+ } or die $@ =~ s/(?: at .+)?$/ for option $_[0]/r;
},
'human-readable|H!',
'interval|t:i',
},
'human-readable|H!',
'interval|t:i',
@@
-44,6
+47,7
@@
GetOptions(\%opt,
);
},
'markers|m=s',
);
},
'markers|m=s',
+ 'stat|s!',
'unmodified|u!',
'width|w=i',
'usage|h' => sub { podexit() },
'unmodified|u!',
'width|w=i',
'usage|h' => sub { podexit() },
@@
-53,8
+57,9
@@
GetOptions(\%opt,
$opt{width} ||= $ENV{COLUMNS} || 80;
$opt{color} //= -t *STDOUT; # enable on tty
$opt{trim} *= $opt{width} / 100 if $opt{trimpct};
$opt{width} ||= $ENV{COLUMNS} || 80;
$opt{color} //= -t *STDOUT; # enable on tty
$opt{trim} *= $opt{width} / 100 if $opt{trimpct};
-$opt{units} =
$opt{'human-readable'} && ['', qw( k M G T P E Z Y y z a f p n μ m )]
;
+$opt{units} =
[split //, ' kMGTPEZYyzafpnμm'] if $opt{'human-readable'}
;
$opt{anchor} //= qr/\A/;
$opt{anchor} //= qr/\A/;
+$opt{'value-length'} = 6 if $opt{units};
if (defined $opt{interval}) {
$opt{interval} ||= 1;
if (defined $opt{interval}) {
$opt{interval} ||= 1;
@@
-68,7
+73,7
@@
if (defined $opt{interval}) {
$SIG{INT} = 'IGNORE'; # continue after assumed eof
my (@lines, @values);
$SIG{INT} = 'IGNORE'; # continue after assumed eof
my (@lines, @values);
-my $valmatch = qr/$opt{anchor} ( \h* -? [0-9]* \.? [0-9]+ |)/x;
+my $valmatch = qr/$opt{anchor} ( \h* -? [0-9]* \.? [0-9]+
(?: e[+-]?[0-9]+ )?
|)/x;
while (readline) {
s/\r?\n\z//;
s/^\h*// unless $opt{unmodified};
while (readline) {
s/\r?\n\z//;
s/^\h*// unless $opt{unmodified};
@@
-87,14
+92,18
@@
while (readline) {
$SIG{INT} = 'DEFAULT';
$SIG{INT} = 'DEFAULT';
+my @order;
+
sub show_lines {
state $nr = $opt{hidemin} ? $opt{hidemin} - 1 : 0;
@lines and @lines > $nr or return;
sub show_lines {
state $nr = $opt{hidemin} ? $opt{hidemin} - 1 : 0;
@lines and @lines > $nr or return;
+@lines or return;
+@lines > $nr or return unless $opt{hidemin};
-
my
@order = sort { $b <=> $a } grep { length } @values;
-my $maxval =
$opt{hidemax} ? max @values[0 .. $opt{hidemax} - 1] : $order[0]
;
-my $minval = min $order[-1], 0;
+@order = sort { $b <=> $a } grep { length } @values;
+my $maxval =
($opt{hidemax} ? max grep { length } @values[0 .. $opt{hidemax} - 1] : $order[0]) // 0
;
+my $minval = min $order[-1]
// ()
, 0;
my $lenval = $opt{'value-length'} // max map { length } @order;
my $len = defined $opt{trim} && $opt{trim} <= 0 ? -$opt{trim} + 1 :
max map { length $values[$_] && length $lines[$_] }
my $lenval = $opt{'value-length'} // max map { length } @order;
my $len = defined $opt{trim} && $opt{trim} <= 0 ? -$opt{trim} + 1 :
max map { length $values[$_] && length $lines[$_] }
@@
-126,14
+135,21
@@
if ($opt{markers} // 1 and $size > 0) {
}
}
}
}
+@lines > $nr or return if $opt{hidemin};
+
sub sival {
my $unit = int(log($_[0]) / log(1000) - ($_[0] < 1));
sub sival {
my $unit = int(log($_[0]) / log(1000) - ($_[0] < 1));
- sprintf "%3.1f%1s", $_[0] / 1000 ** $unit,
- $#{$opt{units}} >> 1 < abs $unit ? "e$unit" : $opt{units}->[$unit];
+ my $float = $_[0] !~ /^ (?: 0*\.)? [0-9]{1,3} $/x;
+ sprintf('%*.*f%*s',
+ $float ? 5 : 3, $float, # length and tenths
+ $_[0] / 1000 ** $unit, # number
+ $float ? 0 : 3, # unit size
+ $#{$opt{units}} >> 1 < abs $unit ? "e$unit" : $opt{units}->[$unit]
+ );
}
while ($nr <= $#lines) {
}
while ($nr <= $#lines) {
- $nr >= $opt{hidemax} and last if $opt{hidemax};
+ $nr >= $opt{hidemax} and last if
defined
$opt{hidemax};
my $val = $values[$nr];
if (length $val) {
my $color = !$opt{color} ? 0 :
my $val = $values[$nr];
if (length $val) {
my $color = !$opt{color} ? 0 :
@@
-154,6
+170,15
@@
while ($nr <= $#lines) {
}
show_lines();
}
show_lines();
+if ($opt{stat}) {
+ my $total = sum @order;
+ printf '%s total', $total;
+ printf ' in %d values', scalar @values;
+ printf ' (%s min, %*.*f avg, %s max)',
+ $order[-1], 0, 2, $total / @order, $order[0];
+ say '';
+}
+
__END__
=head1 NAME
__END__
=head1 NAME
@@
-196,6
+221,8
@@
for example I<-f'(\d+)'> for the first digits anywhere.
Format values using SI unit prefixes,
turning long numbers like I<12356789> into I<12.4M>.
Format values using SI unit prefixes,
turning long numbers like I<12356789> into I<12.4M>.
+Also changes an exponent I<1.602176634e-19> to I<160.2z>.
+Short integers are aligned but kept without decimal point.
=item -t, --interval[=<seconds>]
=item -t, --interval[=<seconds>]
@@
-250,6
+277,10
@@
or 68% of all entries.
=back
=back
+=item -s, --stat
+
+Total statistics after all data.
+
=item -u, --unmodified
Do not strip leading whitespace.
=item -u, --unmodified
Do not strip leading whitespace.
@@
-321,9
+352,9
@@
Git statistics, such commit count by year:
git log --pretty=%ci | cut -b-4 | uniq -c | barcat
git log --pretty=%ci | cut -b-4 | uniq -c | barcat
-Or the
most frequent authors
:
+Or the
top 3 most frequent authors with statistics over all
:
- git shortlog -sn | barcat -L3
+ git shortlog -sn | barcat -L3
-s
Latency history:
Latency history: