Skip to content

Commit 3c479c3

Browse files
Petr BaudisJunio C Hamano
authored andcommitted
Git.pm: Introduce fast get_object() method
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 0270083 commit 3c479c3

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

perl/Git.pm

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,24 @@ sub ident_person {
572572
}
573573

574574

575+
=item get_object ( TYPE, SHA1 )
576+
577+
Return contents of the given object in a scalar string. If the object has
578+
not been found, undef is returned; however, do not rely on this! Currently,
579+
if you use multiple repositories at once, get_object() on one repository
580+
_might_ return the object even though it exists only in another repository.
581+
(But do not rely on this behaviour either.)
582+
583+
The method must be called on a repository instance.
584+
585+
Implementation of this method is very fast; no external command calls
586+
are involved. That's why it is broken, too. ;-)
587+
588+
=cut
589+
590+
# Implemented in Git.xs.
591+
592+
575593
=item hash_object ( TYPE, FILENAME )
576594
577595
=item hash_object ( TYPE, FILEHANDLE )

perl/Git.xs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,30 @@ CODE:
111111
free((char **) argv);
112112
}
113113

114+
115+
SV *
116+
xs_get_object(type, id)
117+
char *type;
118+
char *id;
119+
CODE:
120+
{
121+
unsigned char sha1[20];
122+
unsigned long size;
123+
void *buf;
124+
125+
if (strlen(id) != 40 || get_sha1_hex(id, sha1) < 0)
126+
XSRETURN_UNDEF;
127+
128+
buf = read_sha1_file(sha1, type, &size);
129+
if (!buf)
130+
XSRETURN_UNDEF;
131+
RETVAL = newSVpvn(buf, size);
132+
free(buf);
133+
}
134+
OUTPUT:
135+
RETVAL
136+
137+
114138
char *
115139
xs_hash_object_pipe(type, fd)
116140
char *type;

0 commit comments

Comments
 (0)