mirror of
git://projects.qi-hardware.com/wernermisc.git
synced 2024-11-22 05:18:25 +02:00
bin/authors: list files in git repo by author, with wildcards
This commit is contained in:
parent
61a999a26b
commit
9a093fecd4
101
bin/authors
Executable file
101
bin/authors
Executable 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";
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user