summaryrefslogtreecommitdiffstats
path: root/git/.bin/git/git-blame-stats
diff options
context:
space:
mode:
Diffstat (limited to 'git/.bin/git/git-blame-stats')
-rwxr-xr-xgit/.bin/git/git-blame-stats37
1 files changed, 37 insertions, 0 deletions
diff --git a/git/.bin/git/git-blame-stats b/git/.bin/git/git-blame-stats
new file mode 100755
index 0000000..320d755
--- /dev/null
+++ b/git/.bin/git/git-blame-stats
@@ -0,0 +1,37 @@
+#!/usr/bin/perl
+
+use Getopt::Long;
+use POSIX qw(ceil);
+use strict;
+Getopt::Long::Configure(qw(bundling));
+my %authors;
+my $total;
+my $files;
+my $rev = shift(@ARGV) || "HEAD";
+
+foreach my $file (`git ls-tree --name-only -r $rev`) {
+ chomp($file);
+ print STDERR "Processing $file\n";
+ foreach my $line (`git blame -M -w $rev -- "$file"`) {
+ chomp($line);
+ if (substr($line, 0, 1) eq "^") {
+ ++$authors{"*initial checkin"};
+ } else {
+ $line =~ s[^.*?\((.*?)\s*\d{4}-\d{2}-\d{2}.*][$1];
+ ++$authors{$line};
+ }
+ ++$total;
+ }
+}
+
+print "Total lines: $total\n";
+my $i = 0;
+my $author_ind = ceil(log(scalar(keys %authors)) / log(10));
+my $lines_ind = ceil(log($total) / log(10));
+foreach my $author (sort { $authors{$b} <=> $authors{$a} } keys %authors) {
+ printf "%${author_ind}s %${lines_ind}u %5.2f%% %s\n",
+ sprintf("#%u", ++$i),
+ $authors{$author},
+ $authors{$author} * 100 / $total,
+ $author;
+}