diff options
author | Eric Wong <normalperson@yhbt.net> | 2007-01-31 17:57:36 -0800 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2007-02-23 00:57:11 -0800 |
commit | ce4b4af7ff36d4e4999da937dffd2f9a3a420277 (patch) | |
tree | b89c9d584e49208ab3fd4487bb2206f8e958e486 | |
parent | 9c93fee51e26d5db82414317fa169294f3fa94b0 (diff) | |
download | git-ce4b4af7ff36d4e4999da937dffd2f9a3a420277.tar.gz git-ce4b4af7ff36d4e4999da937dffd2f9a3a420277.tar.xz |
git-svn: use sys* IO functions for reading rev_db
Using buffered IO for reading 40-41 bytes at a time isn't very
efficient. Buffering writes for a short duration is alright
since we close() right away and buffers will be flushed.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
-rwxr-xr-x | git-svn.perl | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/git-svn.perl b/git-svn.perl index b1d91fa47..1e3a3c08f 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -891,23 +891,20 @@ sub last_rev_commit { my $rl; open my $fh, '<', $self->{db_path} or croak "$self->{db_path} not readable: $!\n"; - seek $fh, $offset, 2; - $rl = readline $fh; - defined $rl or return (undef, undef); + sysseek($fh, $offset, 2); # don't care for errors + sysread($fh, $rl, 41) == 41 or return (undef, undef); chomp $rl; - while (('0' x40) eq $rl && tell $fh != 0) { + while (('0' x40) eq $rl && sysseek($fh, 0, 1) != 0) { $offset -= 41; - seek $fh, $offset, 2; - $rl = readline $fh; - defined $rl or return (undef, undef); + sysseek($fh, $offset, 2); # don't care for errors + sysread($fh, $rl, 41) == 41 or return (undef, undef); chomp $rl; } if ($c) { die "$self->{db_path} and ", $self->refname, " inconsistent!:\n$c != $rl\n"; } - my $rev = tell $fh; - croak $! if ($rev < 0); + my $rev = sysseek($fh, 0, 1) or croak $!; $rev = ($rev - 41) / 41; close $fh or croak $!; ($self->{last_rev}, $self->{last_commit}) = ($rev, $c); @@ -1419,12 +1416,9 @@ sub rev_db_get { my $ret; my $offset = $rev * 41; open my $fh, '<', $self->{db_path} or croak $!; - if (seek $fh, $offset, 0) { - $ret = readline $fh; - if (defined $ret) { - chomp $ret; - $ret = undef if ($ret =~ /^0{40}$/); - } + if (sysseek($fh, $offset, 0) == $offset) { + my $read = sysread($fh, $ret, 40); + $ret = undef if ($read != 40 || $ret eq ('0'x40)); } close $fh or croak $!; $ret; |