1
0
mirror of git://projects.qi-hardware.com/wernermisc.git synced 2024-11-21 17:26:15 +02:00

bin/authors: list files in git repo by author, with wildcards

This commit is contained in:
Werner Almesberger 2013-09-27 09:53:59 -03:00
parent 61a999a26b
commit 9a093fecd4

101
bin/authors Executable file
View File

@ -0,0 +1,101 @@
#!/usr/bin/perl
#
# authors - List files in get repo by author, using wildcards
#
# Copyright 2013 by Werner Almesberger
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
$WIDTH = 79;
open(LOG, "git log --format='%an <%ae>' --name-only --no-merges |") ||
die "popen log";
while (<LOG>) {
chop;
if (/^$/) {
$a = $last;
undef $last;
next;
}
if (defined $last) {
push @{ $f{$last} }, $a;
$a{$a} = 1;
}
$last = $_;
}
if (defined $last) {
push @{ $f{$last} }, $a;
$a{$a} = 1;
}
close LOG;
sub add
{
local ($a, $f) = @_;
local $d, $n, $t;
local $best, $best_k, $k;
if ($f =~ m|/([^/]+)$|) {
$d = "$`/";
$n = $1;
} else {
$d = "";
$n = $f;
}
undef $best;
undef $best_k;
LONGER: for ($i = 0; $i <= length $n; $i++) {
$t = $d.substr($n, 0, $i);
$k = 0;
FIT: for (keys %f) {
next unless substr($_, 0, length $t) eq $t;
$k++;
for (@{ $f{$_} }) {
next FIT if $_ eq $a;
}
next LONGER;
}
last if $best_k > $k;
$best = $t;
$best_k = $k;
}
if ($best eq $f) {
$m{$f} = 1;
} else {
$m{"$best*"} = 1;
}
}
for $a (sort keys %a) {
undef %m;
for $f (keys %f) {
for (@{ $f{$f} }) {
next if $_ ne $a;
&add($a, $f);
last;
}
}
next unless %m;
print $a, "\n";
undef $p;
for (sort keys %m) {
if (!defined $p) {
$p = $_;
next;
}
if (length("$p $_") > $WIDTH) {
print "$p\n";
$p = $_;
} else {
$p .= " $_";
}
}
print $p, "\n\n";
}