annotate: fix -S parameter to take a string
[git.git] / git-annotate.perl
index ee8ff15..cd476c7 100755 (executable)
@@ -31,7 +31,7 @@ our ($help, $longrev, $rename, $starting_rev, $rev_file) = (0, 0, 1);
 my $rc = GetOptions(   "long|l" => \$longrev,
                        "help|h" => \$help,
                        "rename|r" => \$rename,
-                       "rev-file|S" => \$rev_file);
+                       "rev-file|S=s" => \$rev_file);
 if (!$rc or $help) {
        usage();
 }
@@ -174,7 +174,8 @@ sub git_rev_list {
 
        my $revlist;
        if ($rev_file) {
-               open($revlist, '<' . $rev_file);
+               open($revlist, '<' . $rev_file)
+                   or die "Failed to open $rev_file : $!";
        } else {
                $revlist = open_pipe("git-rev-list","--parents","--remove-empty",$rev,"--",$file)
                        or die "Failed to exec git-rev-list: $!";
@@ -304,6 +305,12 @@ sub _git_diff_parse {
                        }
                        $ri++;
 
+               } elsif (m/^\\/) {
+                       ;
+                       # Skip \No newline at end of file.
+                       # But this can be internationalized, so only look
+                       # for an initial \
+
                } else {
                        if (substr($_,1) ne get_line($slines,$ri) ) {
                                die sprintf("Line %d (%d) does not match:\n|%s\n|%s\n%s => %s\n",
@@ -431,8 +438,20 @@ sub gitvar_name {
     return join(' ', @field[0...(@field-4)]);
 }
 
-
 sub open_pipe {
+       if ($^O eq '##INSERT_ACTIVESTATE_STRING_HERE##') {
+               return open_pipe_activestate(@_);
+       } else {
+               return open_pipe_normal(@_);
+       }
+}
+
+sub open_pipe_activestate {
+       tie *fh, "Git::ActiveStatePipe", @_;
+       return *fh;
+}
+
+sub open_pipe_normal {
        my (@execlist) = @_;
 
        my $pid = open my $kid, "-|";
@@ -445,3 +464,32 @@ sub open_pipe {
 
        return $kid;
 }
+
+package Git::ActiveStatePipe;
+use strict;
+
+sub TIEHANDLE {
+       my ($class, @params) = @_;
+       my $cmdline = join " ", @params;
+       my  @data = qx{$cmdline};
+       bless { i => 0, data => \@data }, $class;
+}
+
+sub READLINE {
+       my $self = shift;
+       if ($self->{i} >= scalar @{$self->{data}}) {
+               return undef;
+       }
+       return $self->{'data'}->[ $self->{i}++ ];
+}
+
+sub CLOSE {
+       my $self = shift;
+       delete $self->{data};
+       delete $self->{i};
+}
+
+sub EOF {
+       my $self = shift;
+       return ($self->{i} >= scalar @{$self->{data}});
+}