object.c: allow parse_object to handle arbitrary repositories

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Stefan Beller 2018-06-28 18:22:19 -07:00 committed by Junio C Hamano
parent 108ed1a3d8
commit 8e4b0b6047
2 changed files with 8 additions and 9 deletions

View file

@ -245,28 +245,28 @@ struct object *parse_object_or_die(const struct object_id *oid,
die(_("unable to parse object: %s"), name ? name : oid_to_hex(oid)); die(_("unable to parse object: %s"), name ? name : oid_to_hex(oid));
} }
struct object *parse_object_the_repository(const struct object_id *oid) struct object *parse_object(struct repository *r, const struct object_id *oid)
{ {
unsigned long size; unsigned long size;
enum object_type type; enum object_type type;
int eaten; int eaten;
const struct object_id *repl = lookup_replace_object(the_repository, oid); const struct object_id *repl = lookup_replace_object(r, oid);
void *buffer; void *buffer;
struct object *obj; struct object *obj;
obj = lookup_object(the_repository, oid->hash); obj = lookup_object(r, oid->hash);
if (obj && obj->parsed) if (obj && obj->parsed)
return obj; return obj;
if ((obj && obj->type == OBJ_BLOB && has_object_file(oid)) || if ((obj && obj->type == OBJ_BLOB && has_object_file(oid)) ||
(!obj && has_object_file(oid) && (!obj && has_object_file(oid) &&
oid_object_info(the_repository, oid, NULL) == OBJ_BLOB)) { oid_object_info(r, oid, NULL) == OBJ_BLOB)) {
if (check_object_signature(repl, NULL, 0, NULL) < 0) { if (check_object_signature(repl, NULL, 0, NULL) < 0) {
error("sha1 mismatch %s", oid_to_hex(oid)); error("sha1 mismatch %s", oid_to_hex(oid));
return NULL; return NULL;
} }
parse_blob_buffer(lookup_blob(the_repository, oid), NULL, 0); parse_blob_buffer(lookup_blob(r, oid), NULL, 0);
return lookup_object(the_repository, oid->hash); return lookup_object(r, oid->hash);
} }
buffer = read_object_file(oid, &type, &size); buffer = read_object_file(oid, &type, &size);
@ -277,7 +277,7 @@ struct object *parse_object_the_repository(const struct object_id *oid)
return NULL; return NULL;
} }
obj = parse_object_buffer(the_repository, oid, type, size, obj = parse_object_buffer(r, oid, type, size,
buffer, &eaten); buffer, &eaten);
if (!eaten) if (!eaten)
free(buffer); free(buffer);

View file

@ -124,8 +124,7 @@ void *object_as_type(struct repository *r, struct object *obj, enum object_type
* *
* Returns NULL if the object is missing or corrupt. * Returns NULL if the object is missing or corrupt.
*/ */
#define parse_object(r, oid) parse_object_##r(oid) struct object *parse_object(struct repository *r, const struct object_id *oid);
struct object *parse_object_the_repository(const struct object_id *oid);
/* /*
* Like parse_object, but will die() instead of returning NULL. If the * Like parse_object, but will die() instead of returning NULL. If the