Re: git-who
On Oct 7, 2008, at 10:25 PM, Jeff King wrote:
Show 17 quoted lines
> On Tue, Oct 07, 2008 at 05:02:46PM -0400, Kate Rhodes wrote:
>
>> As is it's probably not worth including in git, but I'm thinking that
>> someone else can probably come up with some improvements, such as
>> dates in
>> the verbose mode, support for a treeish instead of a single file
>> path, and
>> / or rewriting it in C so that it can work on Windows.
>
> Scripts like this often find a good home in git's contrib/ directory.
> Consider submitting a patch which adds it there.
>
>> git://github.com/masukomi/git_accessories.git
>
> I took a look. My biggest complaint is that for many files, it
> produces
> too many names.
Yeah, I agree, I just haven't come up with a better idea that addresses the question of "who touched this". Maybe some sort of recency toggle.
Show 5 quoted lines
> It would be nice to at least sort the names by number
> of commits. But even more accurate might be the number of added lines.
> Somebody who creates a 200-line file should surely come before
> somebody
> who made a 1-line tweak, right?
Yeah, I've considered maybe adding a -n (number) like that and ordering people by number of commits. I'm not convinced that, in most cases, size of changes is as important as number. I think it depends on the file. In some cases a person who's constantly mucking about with the file is a better go-to person when you have questions / issues, than someone who happened to make a few large commits a while ago. But then again....
>
> But perhaps even more accurate would be to rely on blame output, since
> it attributes not just added lines, but lines which have actually
> survived into the current product.
> And fortunately that is relatively
> easy to do (only lightly tested):
excellent! Thank you. I'll poke at this tomorrow. :)
-masukomi
Show 38 quoted lines
>
>
> -- >8 --
> #!/usr/bin/perl
> #
> # Invoke as 'git who -M -C file.c' (or whichever blame options
> # you prefer). You can even check a particular set of lines
> # with "git who -M -C -L 40,60 file.c".
>
> use strict;
>
> open(my $in, '-|', qw(git blame -p), @ARGV);
>
> my %count;
> my %author;
> my $current_sha1;
> while(<$in>) {
> if (!$current_sha1) {
> /^[0-9a-f]{40}/ or die "expected sha1, got $_";
> $current_sha1 = $&;
> $count{$current_sha1}++;
> }
> elsif (/^author (.*)/) {
> $author{$current_sha1} = $1;
> }
> elsif (/^\t/) {
> $current_sha1 = undef;
> }
> }
>
> my %acount;
> while(my ($h, $c) = each %count) {
> $acount{$author{$h}} += $c;
> }
>
> foreach (sort { $acount{$b} <=> $acount{$a} } keys %acount) {
> print "$_ ($acount{$_})\n";
> }