Git.pm: Remove PerlIO usage from Git.xs
authorPetr Baudis <pasky@suse.cz>
Sat, 1 Jul 2006 23:38:56 +0000 (01:38 +0200)
committerJunio C Hamano <junkio@cox.net>
Mon, 3 Jul 2006 00:14:44 +0000 (17:14 -0700)
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>
perl/Git.pm
perl/Git.xs

index 05814477577d79cfda03b1850402de5c40b8b616..b4ee88bdfdc9fd6050b3898d0dcb6040a68ae967 100644 (file)
@@ -511,7 +511,19 @@ are involved.
 
 =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);
+       }
+}
 
 
 
index 3030ba9ab55e05a6a0debc18e634e25c0a8e6ece..cb232618c8f4d87fd9dc177afff9c34af6ee3bdd 100644 (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: