Code

Git.pm: Introduce fast get_object() method
authorPetr Baudis <pasky@suse.cz>
Mon, 3 Jul 2006 20:48:05 +0000 (22:48 +0200)
committerJunio C Hamano <junkio@cox.net>
Sun, 9 Jul 2006 08:20:01 +0000 (01:20 -0700)
Direct .xs routine. Note that it does not work 100% correctly when
you juggle multiple repository objects, but it is not that bad either.
The trouble is that we might reuse packs information for another
Git project; that is not an issue since Git depends on uniqueness
of SHA1 ids so if we have found the object somewhere else, it is
nevertheless going to be the same object. It merely makes object
existence detection through this method unreliable; it is duly noted
in the documentation.

At least that's how I see it, I hope I didn't overlook any other
potential problem. I tested it for memory leaks and it appears to be
doing ok.

Signed-off-by: Petr Baudis <pasky@suse.cz>
Signed-off-by: Junio C Hamano <junkio@cox.net>
perl/Git.pm
perl/Git.xs

index 9da15e9c8c208ffd6a51b524edc828c85dce5355..f2467bddbe91954aa5a014bcee79333fe1586cde 100644 (file)
@@ -572,6 +572,24 @@ sub ident_person {
 }
 
 
+=item get_object ( TYPE, SHA1 )
+
+Return contents of the given object in a scalar string. If the object has
+not been found, undef is returned; however, do not rely on this! Currently,
+if you use multiple repositories at once, get_object() on one repository
+_might_ return the object even though it exists only in another repository.
+(But do not rely on this behaviour either.)
+
+The method must be called on a repository instance.
+
+Implementation of this method is very fast; no external command calls
+are involved. That's why it is broken, too. ;-)
+
+=cut
+
+# Implemented in Git.xs.
+
+
 =item hash_object ( TYPE, FILENAME )
 
 =item hash_object ( TYPE, FILEHANDLE )
index 6ed26a29b89ab1959ef2e62917fb72c137bab39f..226dd4f681ae99bb5c53a4e63394161d92c6ff76 100644 (file)
@@ -111,6 +111,30 @@ CODE:
        free((char **) argv);
 }
 
+
+SV *
+xs_get_object(type, id)
+       char *type;
+       char *id;
+CODE:
+{
+       unsigned char sha1[20];
+       unsigned long size;
+       void *buf;
+
+       if (strlen(id) != 40 || get_sha1_hex(id, sha1) < 0)
+               XSRETURN_UNDEF;
+
+       buf = read_sha1_file(sha1, type, &size);
+       if (!buf)
+               XSRETURN_UNDEF;
+       RETVAL = newSVpvn(buf, size);
+       free(buf);
+}
+OUTPUT:
+       RETVAL
+
+
 char *
 xs_hash_object_pipe(type, fd)
        char *type;