Git.pm: Remove PerlIO usage from Git.xs

PerlIO_*() is not portable before 5.7.3, according to ppport.h, and it's
more clear what is going on when we do it in the Perl part of the Git module
anyway.

Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Petr Baudis 2006-07-02 01:38:56 +02:00 committed by Junio C Hamano
parent b9795608c4
commit e6634ac984
2 changed files with 38 additions and 32 deletions

View file

@ -511,7 +511,19 @@ sub wc_chdir {
=cut
# Implemented in Git.xs.
sub hash_object {
my ($self, $type, $file) = _maybe_self(@_);
# hash_object_* implemented in Git.xs.
if (ref($file) eq 'GLOB') {
my $hash = hash_object_pipe($type, fileno($file));
close $file;
return $hash;
} else {
hash_object_file($type, $file);
}
}

View file

@ -104,42 +104,36 @@ CODE:
}
char *
xs_hash_object(type, file)
xs_hash_object_pipe(type, fd)
char *type;
SV *file;
int fd;
CODE:
{
unsigned char sha1[20];
if (SvTYPE(file) == SVt_RV)
file = SvRV(file);
if (SvTYPE(file) == SVt_PVGV) {
/* Filehandle */
PerlIO *pio;
pio = IoIFP(sv_2io(file));
if (!pio)
croak("You passed me something weird - a dir glob?");
/* XXX: I just hope PerlIO didn't read anything from it yet.
* --pasky */
if (index_pipe(sha1, PerlIO_fileno(pio), type, 0))
croak("Unable to hash given filehandle");
/* Avoid any nasty surprises. */
PerlIO_close(pio);
} else {
/* String */
char *path = SvPV_nolen(file);
int fd = open(path, O_RDONLY);
struct stat st;
if (fd < 0 ||
fstat(fd, &st) < 0 ||
index_fd(sha1, fd, &st, 0, type))
croak("Unable to hash %s", path);
close(fd);
}
if (index_pipe(sha1, fd, type, 0))
croak("Unable to hash given filehandle");
RETVAL = sha1_to_hex(sha1);
}
OUTPUT:
RETVAL
char *
xs_hash_object_file(type, path)
char *type;
char *path;
CODE:
{
unsigned char sha1[20];
int fd = open(path, O_RDONLY);
struct stat st;
if (fd < 0 ||
fstat(fd, &st) < 0 ||
index_fd(sha1, fd, &st, 0, type))
croak("Unable to hash %s", path);
close(fd);
RETVAL = sha1_to_hex(sha1);
}
OUTPUT: