From: "Gustavo L. de M. Chaves" <gnust...@cpan.org>

Git::activestate_pipe::TIEHANDLE creates an object to keep the
external command's output as an array of lines. The object also kept
an index into the array to know up to which line had already been read
via Git::activestate_pipe::READLINE.

We don't really need that index because lines already read don't need
to be kept. So, we simply unshift lines as they're being read and use
the array's size to know when we have read all lines.

This implementation uses more idiomatic Perl, which makes it more
readable and probably a little bit faster.

Signed-off-by: Gustavo L. de M. Chaves <gnust...@cpan.org>
---
 perl/Git.pm | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/perl/Git.pm b/perl/Git.pm
index 42c3971..2d88b89 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -1402,33 +1402,28 @@ sub TIEHANDLE {
        # should take care of the most common cases.
        my @escaped_params = map { "\"$_\"" } map { s/"/""/g; $_ } @params;
        my @data = qx{git @escaped_params};
-       bless { i => 0, data => \@data, exit => $? }, $class;
+       bless { data => \@data, exit => $? }, $class;
 }
 
 sub READLINE {
        my $self = shift;
-       if ($self->{i} >= scalar @{$self->{data}}) {
-               return undef;
-       }
-       my $i = $self->{i};
+       return unless @{$self->{data}};
        if (wantarray) {
-               $self->{i} = $#{$self->{'data'}} + 1;
-               return splice(@{$self->{'data'}}, $i);
+               return splice @{$self->{data}};
+       } else {
+               return shift @{$self->{data}};
        }
-       $self->{i} = $i + 1;
-       return $self->{'data'}->[ $i ];
 }
 
 sub CLOSE {
        my $self = shift;
        delete $self->{data};
-       delete $self->{i};
        return $self->{exit} == 0;
 }
 
 sub EOF {
        my $self = shift;
-       return ($self->{i} >= scalar @{$self->{data}});
+       return @{$self->{data}} == 0;
 }
 
 
-- 
1.7.12.464.g83379df.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to