/* * Given an object name, read the object data and size, and return a * "struct object". If the object data we are returning is also borrowed * by the "struct object" representation, set *eaten as well---it is a * signal from parse_object_buffer to us not to free the buffer. */ static void *get_obj(const unsigned char *sha1, struct object **obj, unsigned long *sz, int *eaten) { enum object_type type; void *buf = read_sha1_file(sha1, &type, sz); if (buf) *obj = parse_object_buffer(sha1, type, *sz, buf, eaten); else *obj = NULL; return buf; }
static void export_blob(const unsigned char *sha1) { unsigned long size; enum object_type type; char *buf; struct object *object; int eaten; if (no_data) return; if (is_null_sha1(sha1)) return; object = lookup_object(sha1); if (object && object->flags & SHOWN) return; if (anonymize) { buf = anonymize_blob(&size); object = (struct object *)lookup_blob(sha1); eaten = 0; } else { buf = read_sha1_file(sha1, &type, &size); if (!buf) die ("Could not read blob %s", sha1_to_hex(sha1)); if (check_sha1_signature(sha1, buf, size, typename(type)) < 0) die("sha1 mismatch in blob %s", sha1_to_hex(sha1)); object = parse_object_buffer(sha1, type, size, buf, &eaten); } if (!object) die("Could not read blob %s", sha1_to_hex(sha1)); mark_next_object(object); printf("blob\nmark :%"PRIu32"\ndata %lu\n", last_idnum, size); if (size && fwrite(buf, size, 1, stdout) != 1) die_errno ("Could not write blob '%s'", sha1_to_hex(sha1)); printf("\n"); show_progress(); object->flags |= SHOWN; if (!eaten) free(buf); }
static int fsck_obj_buffer(const struct object_id *oid, enum object_type type, unsigned long size, void *buffer, int *eaten) { /* * Note, buffer may be NULL if type is OBJ_BLOB. See * verify_packfile(), data_valid variable for details. */ struct object *obj; obj = parse_object_buffer(oid, type, size, buffer, eaten); if (!obj) { errors_found |= ERROR_OBJECT; return error("%s: object corrupt or missing", oid_to_hex(oid)); } obj->flags &= ~(REACHABLE | SEEN); obj->flags |= HAS_OBJ; return fsck_obj(obj); }
static struct object *parse_loose_object(const struct object_id *oid, const char *path) { struct object *obj; void *contents; enum object_type type; unsigned long size; int eaten; if (read_loose_object(path, oid, &type, &size, &contents) < 0) return NULL; if (!contents && type != OBJ_BLOB) die("BUG: read_loose_object streamed a non-blob"); obj = parse_object_buffer(oid, type, size, contents, &eaten); if (!eaten) free(contents); return obj; }
struct object *parse_object(const struct object_id *oid) { unsigned long size; enum object_type type; int eaten; const struct object_id *repl = lookup_replace_object(the_repository, oid); void *buffer; struct object *obj; obj = lookup_object(oid->hash); if (obj && obj->parsed) return obj; if ((obj && obj->type == OBJ_BLOB && has_object_file(oid)) || (!obj && has_object_file(oid) && oid_object_info(the_repository, oid, NULL) == OBJ_BLOB)) { if (check_object_signature(repl, NULL, 0, NULL) < 0) { error("sha1 mismatch %s", oid_to_hex(oid)); return NULL; } parse_blob_buffer(lookup_blob(oid), NULL, 0); return lookup_object(oid->hash); } buffer = read_object_file(oid, &type, &size); if (buffer) { if (check_object_signature(repl, buffer, size, type_name(type)) < 0) { free(buffer); error("sha1 mismatch %s", oid_to_hex(repl)); return NULL; } obj = parse_object_buffer(oid, type, size, buffer, &eaten); if (!eaten) free(buffer); return obj; } return NULL; }