Code

Use Ryan's git-annotate instead of jsannotate
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Mon, 20 Feb 2006 15:20:10 +0000 (16:20 +0100)
committerJunio C Hamano <junkio@cox.net>
Wed, 22 Feb 2006 10:06:42 +0000 (02:06 -0800)
Since Ryan's git-annotate is much faster, and has support for renames,
it is likely it goes into the mainstream git soon. Adapt it a little to
work with gitcvs, and actually use it.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
git-annotate.perl

index 8f984318af406fd725097052b4a4f01b9141c1e0..3800c4654b7f04a0fbd47fe4c5832f0ac6b0692b 100755 (executable)
@@ -8,9 +8,25 @@
 
 use warnings;
 use strict;
+use Getopt::Std;
+use POSIX qw(strftime gmtime);
 
-my $filename = shift @ARGV;
+sub usage() {
+       print STDERR 'Usage: ${\basename $0} [-s] [-S revs-file] file
+
+       -l              show long rev
+       -r              follow renames
+       -S commit       use revs from revs-file instead of calling git-rev-list
+';
+
+       exit(1);
+}
 
+our ($opt_h, $opt_l, $opt_r, $opt_S);
+getopts("hlrS:") or usage();
+$opt_h && usage();
+
+my $filename = shift @ARGV;
 
 my @stack = (
        {
@@ -41,12 +57,19 @@ while (my $bound = pop @stack) {
                my ($rev, @parents) = @$revinst;
                $head ||= $rev;
 
+               if (!defined($rev)) {
+                       $rev = "";
+               }
                $revs{$rev}{'filename'} = $bound->{'filename'};
                if (scalar @parents > 0) {
                        $revs{$rev}{'parents'} = \@parents;
                        next;
                }
 
+               if (!$opt_r) {
+                       next;
+               }
+
                my $newbound = find_parent_renames($rev, $bound->{'filename'});
                if ( exists $newbound->{'filename'} && $newbound->{'filename'} ne $bound->{'filename'}) {
                        push @stack, $newbound;
@@ -65,7 +88,7 @@ foreach my $l (@filelines) {
        my ($output, $rev, $committer, $date);
        if (ref $l eq 'ARRAY') {
                ($output, $rev, $committer, $date) = @$l;
-               if (length($rev) > 8) {
+               if (!$opt_l && length($rev) > 8) {
                        $rev = substr($rev,0,8);
                }
        } else {
@@ -73,7 +96,8 @@ foreach my $l (@filelines) {
                ($rev, $committer, $date) = ('unknown', 'unknown', 'unknown');
        }
 
-       printf("(%8s %10s %10s %d)%s\n", $rev, $committer, $date, $i++, $output);
+       printf("%s\t(%10s\t%10s\t%d)%s\n", $rev, $committer,
+               format_date($date), $i++, $output);
 }
 
 sub init_claim {
@@ -119,8 +143,12 @@ sub handle_rev {
 sub git_rev_list {
        my ($rev, $file) = @_;
 
-       open(P,"-|","git-rev-list","--parents","--remove-empty",$rev,"--",$file)
-               or die "Failed to exec git-rev-list: $!";
+       if ($opt_S) {
+               open(P, '<' . $opt_S);
+       } else {
+               open(P,"-|","git-rev-list","--parents","--remove-empty",$rev,"--",$file)
+                       or die "Failed to exec git-rev-list: $!";
+       }
 
        my @revs;
        while(my $line = <P>) {
@@ -319,3 +347,10 @@ sub git_commit_info {
 
        return %info;
 }
+
+sub format_date {
+       my ($timestamp, $timezone) = split(' ', $_[0]);
+
+       return strftime("%Y-%m-%d %H:%M:%S " . $timezone, gmtime($timestamp));
+}
+