sha1_file: introduce an nth_packed_object_oid function
There are places in the code where we would like to provide a struct object_id *, yet read the hash directly from the pack. Provide an nth_packed_object_oid function that is similar to the nth_packed_object_sha1 function. In order to avoid a potentially invalid cast, nth_packed_object_oid provides a variable into which to store the value, which it returns on success; on error, it returns NULL, as nth_packed_object_sha1 does. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
43bc3b6cee
commit
068f85e313
6
cache.h
6
cache.h
@ -1608,6 +1608,12 @@ extern void check_pack_index_ptr(const struct packed_git *p, const void *ptr);
|
|||||||
* error.
|
* error.
|
||||||
*/
|
*/
|
||||||
extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t n);
|
extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t n);
|
||||||
|
/*
|
||||||
|
* Like nth_packed_object_sha1, but write the data into the object specified by
|
||||||
|
* the the first argument. Returns the first argument on success, and NULL on
|
||||||
|
* error.
|
||||||
|
*/
|
||||||
|
extern const struct object_id *nth_packed_object_oid(struct object_id *, struct packed_git *, uint32_t n);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the offset of the nth object within the specified packfile.
|
* Return the offset of the nth object within the specified packfile.
|
||||||
|
17
sha1_file.c
17
sha1_file.c
@ -2628,6 +2628,17 @@ const unsigned char *nth_packed_object_sha1(struct packed_git *p,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct object_id *nth_packed_object_oid(struct object_id *oid,
|
||||||
|
struct packed_git *p,
|
||||||
|
uint32_t n)
|
||||||
|
{
|
||||||
|
const unsigned char *hash = nth_packed_object_sha1(p, n);
|
||||||
|
if (!hash)
|
||||||
|
return NULL;
|
||||||
|
hashcpy(oid->hash, hash);
|
||||||
|
return oid;
|
||||||
|
}
|
||||||
|
|
||||||
void check_pack_index_ptr(const struct packed_git *p, const void *vptr)
|
void check_pack_index_ptr(const struct packed_git *p, const void *vptr)
|
||||||
{
|
{
|
||||||
const unsigned char *ptr = vptr;
|
const unsigned char *ptr = vptr;
|
||||||
@ -3788,13 +3799,13 @@ static int for_each_object_in_pack(struct packed_git *p, each_packed_object_fn c
|
|||||||
int r = 0;
|
int r = 0;
|
||||||
|
|
||||||
for (i = 0; i < p->num_objects; i++) {
|
for (i = 0; i < p->num_objects; i++) {
|
||||||
const unsigned char *sha1 = nth_packed_object_sha1(p, i);
|
struct object_id oid;
|
||||||
|
|
||||||
if (!sha1)
|
if (!nth_packed_object_oid(&oid, p, i))
|
||||||
return error("unable to get sha1 of object %u in %s",
|
return error("unable to get sha1 of object %u in %s",
|
||||||
i, p->pack_name);
|
i, p->pack_name);
|
||||||
|
|
||||||
r = cb(sha1, p, i, data);
|
r = cb(oid.hash, p, i, data);
|
||||||
if (r)
|
if (r)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user