summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2007-04-29 21:05:54 (GMT)
committerJunio C Hamano <junkio@cox.net>2007-04-30 22:50:13 (GMT)
commitbcd8ee5b4368594f2fe646c97d75a8bcdfb1d4e7 (patch)
tree3d4f95d97e35720c9060afb0cdcadfe484429006
parente9d54bd18bcf5dc9eb68eb1cba9a6a7ba3f71fd6 (diff)
downloadgit-bcd8ee5b4368594f2fe646c97d75a8bcdfb1d4e7.zip
git-bcd8ee5b4368594f2fe646c97d75a8bcdfb1d4e7.tar.gz
git-bcd8ee5b4368594f2fe646c97d75a8bcdfb1d4e7.tar.bz2
Fix symlink handling in git-svn, related to PerlIO
After reading the leading contents from a symlink data obtained from subversion, which we expect to begin with 'link ', the code forked to hash the remainder (which should match readlink() result) using git-hash-objects, by redirecting its STDIN from the filehandle we read that 'link ' from. This was Ok with Perl on modern Linux, but on Mac OS, the read in the parent process slurped more than we asked for in stdio buffer, and the child did not correctly see the "remainder". This attempts to fix the issue by using lower level sysseek and sysread instead of seek and read to bypass the stdio buffer. Signed-off-by: Junio C Hamano <junkio@cox.net> Acked-by: Eric Wong <normalperson@yhbt.net> Acked-by: Seth Falcon <sethfalcon@gmail.com>
-rwxr-xr-xgit-svn.perl4
1 files changed, 2 insertions, 2 deletions
diff --git a/git-svn.perl b/git-svn.perl
index 4be8576..6f509f8 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -2470,9 +2470,9 @@ sub close_file {
my $got = $md5->hexdigest;
die "Checksum mismatch: $path\n",
"expected: $exp\n got: $got\n" if ($got ne $exp);
- seek($fh, 0, 0) or croak $!;
+ sysseek($fh, 0, 0) or croak $!;
if ($fb->{mode_b} == 120000) {
- read($fh, my $buf, 5) == 5 or croak $!;
+ sysread($fh, my $buf, 5) == 5 or croak $!;
$buf eq 'link ' or die "$path has mode 120000",
"but is not a link\n";
}