This involves also adapting sha1_object_info_extended and a some internal functions that are used to implement these. It all has to happen in one patch, because of a single recursive chain of calls visits all these functions. Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- object-store.h | 13 ++++++------- packfile.c | 58 ++++++++++++++++++++++++++++------------------------------ packfile.h | 8 ++++---- sha1_file.c | 24 +++++++++++++----------- 4 files changed, 51 insertions(+), 52 deletions(-) diff --git a/object-store.h b/object-store.h index 4ff60e3be0..6930cfef82 100644 --- a/object-store.h +++ b/object-store.h @@ -91,10 +91,7 @@ static inline void *read_sha1_file(const unsigned char *sha1, enum object_type * } /* Read and unpack a sha1 file into memory, write memory to a sha1 file */ - -#define sha1_object_info(r, sha1, size) \ - sha1_object_info_##r(sha1, size) -extern int sha1_object_info_the_repository(const unsigned char *, unsigned long *); +extern int sha1_object_info(struct repository *r, const unsigned char *sha1, unsigned long *sizep); extern int hash_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *sha1); extern int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *return_sha1); extern int hash_sha1_file_literally(const void *buf, unsigned long len, const char *type, struct object_id *oid, unsigned flags); @@ -166,8 +163,10 @@ struct object_info { #define OBJECT_INFO_SKIP_CACHED 4 /* Do not retry packed storage after checking packed and loose storage */ #define OBJECT_INFO_QUICK 8 -#define sha1_object_info_extended(r, s, oi, f) \ - sha1_object_info_extended_##r(s, oi, f) -extern int sha1_object_info_extended_the_repository(const unsigned char *, struct object_info *, unsigned flags); + +extern int sha1_object_info_extended(struct repository *r, + const unsigned char *sha1, + struct object_info *oi, + unsigned flags); #endif /* OBJECT_STORE_H */ diff --git a/packfile.c b/packfile.c index 178d2e0ddd..6a8d5edf6d 100644 --- a/packfile.c +++ b/packfile.c @@ -1082,9 +1082,9 @@ static const unsigned char *get_delta_base_sha1(struct packed_git *p, return NULL; } -#define retry_bad_packed_offset(r, p, o) \ - retry_bad_packed_offset_##r(p, o) -static int retry_bad_packed_offset_the_repository(struct packed_git *p, off_t obj_offset) +static int retry_bad_packed_offset(struct repository *r, + struct packed_git *p, + off_t obj_offset) { int type; struct revindex_entry *revidx; @@ -1094,7 +1094,7 @@ static int retry_bad_packed_offset_the_repository(struct packed_git *p, off_t ob return OBJ_BAD; sha1 = nth_packed_object_sha1(p, revidx->nr); mark_bad_packed_object(p, sha1); - type = sha1_object_info(the_repository, sha1, NULL); + type = sha1_object_info(r, sha1, NULL); if (type <= OBJ_NONE) return OBJ_BAD; return type; @@ -1102,13 +1102,12 @@ static int retry_bad_packed_offset_the_repository(struct packed_git *p, off_t ob #define POI_STACK_PREALLOC 64 -#define packed_to_object_type(r, p, o, t, w, c) \ - packed_to_object_type_##r(p, o, t, w, c) -static enum object_type packed_to_object_type_the_repository(struct packed_git *p, - off_t obj_offset, - enum object_type type, - struct pack_window **w_curs, - off_t curpos) +static enum object_type packed_to_object_type(struct repository *r, + struct packed_git *p, + off_t obj_offset, + enum object_type type, + struct pack_window **w_curs, + off_t curpos) { off_t small_poi_stack[POI_STACK_PREALLOC]; off_t *poi_stack = small_poi_stack; @@ -1135,7 +1134,7 @@ static enum object_type packed_to_object_type_the_repository(struct packed_git * if (type <= OBJ_NONE) { /* If getting the base itself fails, we first * retry the base, otherwise unwind */ - type = retry_bad_packed_offset(the_repository, p, base_offset); + type = retry_bad_packed_offset(r, p, base_offset); if (type > OBJ_NONE) goto out; goto unwind; @@ -1163,7 +1162,7 @@ static enum object_type packed_to_object_type_the_repository(struct packed_git * unwind: while (poi_stack_nr) { obj_offset = poi_stack[--poi_stack_nr]; - type = retry_bad_packed_offset(the_repository, p, obj_offset); + type = retry_bad_packed_offset(r, p, obj_offset); if (type > OBJ_NONE) goto out; } @@ -1250,15 +1249,15 @@ static void detach_delta_base_cache_entry(struct delta_base_cache_entry *ent) free(ent); } -#define cache_or_unpack_entry(r, p, bo, bs, t) cache_or_unpack_entry_##r(p, bo, bs, t) -static void *cache_or_unpack_entry_the_repository(struct packed_git *p, off_t base_offset, - unsigned long *base_size, enum object_type *type) +static void *cache_or_unpack_entry(struct repository *r, struct packed_git *p, + off_t base_offset, unsigned long *base_size, + enum object_type *type) { struct delta_base_cache_entry *ent; ent = get_delta_base_cache_entry(p, base_offset); if (!ent) - return unpack_entry(the_repository, p, base_offset, type, base_size); + return unpack_entry(r, p, base_offset, type, base_size); if (type) *type = ent->type; @@ -1312,8 +1311,8 @@ static void add_delta_base_cache(struct packed_git *p, off_t base_offset, hashmap_add(&delta_base_cache, ent); } -int packed_object_info_the_repository(struct packed_git *p, off_t obj_offset, - struct object_info *oi) +int packed_object_info(struct repository *r, struct packed_git *p, + off_t obj_offset, struct object_info *oi) { struct pack_window *w_curs = NULL; unsigned long size; @@ -1325,7 +1324,7 @@ int packed_object_info_the_repository(struct packed_git *p, off_t obj_offset, * a "real" type later if the caller is interested. */ if (oi->contentp) { - *oi->contentp = cache_or_unpack_entry(the_repository, p, obj_offset, oi->sizep, + *oi->contentp = cache_or_unpack_entry(r, p, obj_offset, oi->sizep, &type); if (!*oi->contentp) type = OBJ_BAD; @@ -1359,7 +1358,7 @@ int packed_object_info_the_repository(struct packed_git *p, off_t obj_offset, if (oi->typep || oi->typename) { enum object_type ptot; - ptot = packed_to_object_type(the_repository, p, obj_offset, + ptot = packed_to_object_type(r, p, obj_offset, type, &w_curs, curpos); if (oi->typep) *oi->typep = ptot; @@ -1448,10 +1447,10 @@ struct unpack_entry_stack_ent { unsigned long size; }; -#define read_object(r, s, t, sz) read_object_##r(s, t, sz) -static void *read_object_the_repository(const unsigned char *sha1, - enum object_type *type, - unsigned long *size) +static void *read_object(struct repository *r, + const unsigned char *sha1, + enum object_type *type, + unsigned long *size) { struct object_info oi = OBJECT_INFO_INIT; void *content; @@ -1459,14 +1458,13 @@ static void *read_object_the_repository(const unsigned char *sha1, oi.sizep = size; oi.contentp = &content; - if (sha1_object_info_extended(the_repository, sha1, &oi, 0) < 0) + if (sha1_object_info_extended(r, sha1, &oi, 0) < 0) return NULL; return content; } -void *unpack_entry_the_repository(struct packed_git *p, off_t obj_offset, - enum object_type *final_type, - unsigned long *final_size) +void *unpack_entry(struct repository *r, struct packed_git *p, off_t obj_offset, + enum object_type *final_type, unsigned long *final_size) { struct pack_window *w_curs = NULL; off_t curpos = obj_offset; @@ -1596,7 +1594,7 @@ void *unpack_entry_the_repository(struct packed_git *p, off_t obj_offset, sha1_to_hex(base_sha1), (uintmax_t)obj_offset, p->pack_name); mark_bad_packed_object(p, base_sha1); - base = read_object(the_repository, base_sha1, &type, &base_size); + base = read_object(r, base_sha1, &type, &base_size); external_base = base; } } diff --git a/packfile.h b/packfile.h index 6d10871d25..f8d2825cce 100644 --- a/packfile.h +++ b/packfile.h @@ -125,8 +125,7 @@ extern off_t nth_packed_object_offset(const struct packed_git *, uint32_t n); extern off_t find_pack_entry_one(const unsigned char *sha1, struct packed_git *); extern int is_pack_valid(struct packed_git *); -#define unpack_entry(r, p, of, ot, s) unpack_entry_##r(p, of, ot, s) -extern void *unpack_entry_the_repository(struct packed_git *, off_t, enum object_type *, unsigned long *); +extern void *unpack_entry(struct repository *r, struct packed_git *, off_t, enum object_type *, unsigned long *); extern unsigned long unpack_object_header_buffer(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep); extern unsigned long get_size_from_delta(struct packed_git *, struct pack_window **, off_t); extern int unpack_object_header(struct packed_git *, struct pack_window **, off_t *, unsigned long *); @@ -136,8 +135,9 @@ extern void release_pack_memory(size_t); /* global flag to enable extra checks when accessing packed objects */ extern int do_check_packed_object_crc; -#define packed_object_info(r, p, o, oi) packed_object_info_##r(p, o, oi) -extern int packed_object_info_the_repository(struct packed_git *pack, off_t offset, struct object_info *); +extern int packed_object_info(struct repository *r, + struct packed_git *pack, + off_t offset, struct object_info *); extern void mark_bad_packed_object(struct packed_git *p, const unsigned char *sha1); extern const struct packed_git *has_packed_and_bad(const unsigned char *sha1); diff --git a/sha1_file.c b/sha1_file.c index 7e06ece5f3..c296b76329 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1237,13 +1237,14 @@ static int sha1_loose_object_info(struct repository *r, return (status < 0) ? status : 0; } -int sha1_object_info_extended_the_repository(const unsigned char *sha1, struct object_info *oi, unsigned flags) +int sha1_object_info_extended(struct repository *r, const unsigned char *sha1, + struct object_info *oi, unsigned flags) { static struct object_info blank_oi = OBJECT_INFO_INIT; struct pack_entry e; int rtype; const unsigned char *real = (flags & OBJECT_INFO_LOOKUP_REPLACE) ? - lookup_replace_object(the_repository, sha1) : + lookup_replace_object(r, sha1) : sha1; if (is_null_sha1(real)) @@ -1272,17 +1273,17 @@ int sha1_object_info_extended_the_repository(const unsigned char *sha1, struct o } } - if (!find_pack_entry(the_repository, real, &e)) { + if (!find_pack_entry(r, real, &e)) { /* Most likely it's a loose object. */ - if (!sha1_loose_object_info(the_repository, real, oi, flags)) + if (!sha1_loose_object_info(r, real, oi, flags)) return 0; /* Not a loose object; someone else may have just packed it. */ if (flags & OBJECT_INFO_QUICK) { return -1; } else { - reprepare_packed_git(the_repository); - if (!find_pack_entry(the_repository, real, &e)) + reprepare_packed_git(r); + if (!find_pack_entry(r, real, &e)) return -1; } } @@ -1294,11 +1295,10 @@ int sha1_object_info_extended_the_repository(const unsigned char *sha1, struct o */ return 0; - rtype = packed_object_info(the_repository, e.p, e.offset, oi); + rtype = packed_object_info(r, e.p, e.offset, oi); if (rtype < 0) { mark_bad_packed_object(e.p, real); - return sha1_object_info_extended(the_repository, real, oi, - 0); + return sha1_object_info_extended(r, real, oi, 0); } else if (oi->whence == OI_PACKED) { oi->u.packed.offset = e.offset; oi->u.packed.pack = e.p; @@ -1310,14 +1310,16 @@ int sha1_object_info_extended_the_repository(const unsigned char *sha1, struct o } /* returns enum object_type or negative */ -int sha1_object_info_the_repository(const unsigned char *sha1, unsigned long *sizep) +int sha1_object_info(struct repository *r, + const unsigned char *sha1, + unsigned long *sizep) { enum object_type type; struct object_info oi = OBJECT_INFO_INIT; oi.typep = &type; oi.sizep = sizep; - if (sha1_object_info_extended(the_repository, sha1, &oi, + if (sha1_object_info_extended(r, sha1, &oi, OBJECT_INFO_LOOKUP_REPLACE) < 0) return -1; return type; -- 2.15.1.433.g936d1b9894.dirty