diff options
author | Jesse Luehrs <doy@tozt.net> | 2009-11-08 14:52:42 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2009-11-08 14:52:42 -0600 |
commit | 036eb2d7b5db9f65c8991be91e1c567d6fbb0399 (patch) | |
tree | d9bc29a9aea8bb551835d8f242b63f970c9d96c3 /bin/git/git-blame-stats | |
parent | 96690c276df5f1f8389e81d273113c85a285b36d (diff) | |
download | conf-036eb2d7b5db9f65c8991be91e1c567d6fbb0399.tar.gz conf-036eb2d7b5db9f65c8991be91e1c567d6fbb0399.zip |
make git helper scripts available to the main git program
Diffstat (limited to 'bin/git/git-blame-stats')
-rwxr-xr-x | bin/git/git-blame-stats | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/bin/git/git-blame-stats b/bin/git/git-blame-stats new file mode 100755 index 0000000..320d755 --- /dev/null +++ b/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; +} |