pack-redundant: convert linked lists to use struct object_id

Convert struct llist_item and the rest of the linked list code to use
struct object_id.  Add a use of GIT_MAX_HEXSZ to avoid a dependency on a
hard-coded constant.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
brian m. carlson
2018-05-02 00:25:45 +00:00
committed by Junio C Hamano
parent 75691ea345
commit 6390fe20eb

View File

@ -20,7 +20,7 @@ static int load_all_packs, verbose, alt_odb;
struct llist_item { struct llist_item {
struct llist_item *next; struct llist_item *next;
const unsigned char *sha1; const struct object_id *oid;
}; };
static struct llist { static struct llist {
struct llist_item *front; struct llist_item *front;
@ -90,14 +90,14 @@ static struct llist * llist_copy(struct llist *list)
return ret; return ret;
new_item = ret->front = llist_item_get(); new_item = ret->front = llist_item_get();
new_item->sha1 = list->front->sha1; new_item->oid = list->front->oid;
old_item = list->front->next; old_item = list->front->next;
while (old_item) { while (old_item) {
prev = new_item; prev = new_item;
new_item = llist_item_get(); new_item = llist_item_get();
prev->next = new_item; prev->next = new_item;
new_item->sha1 = old_item->sha1; new_item->oid = old_item->oid;
old_item = old_item->next; old_item = old_item->next;
} }
new_item->next = NULL; new_item->next = NULL;
@ -108,10 +108,10 @@ static struct llist * llist_copy(struct llist *list)
static inline struct llist_item *llist_insert(struct llist *list, static inline struct llist_item *llist_insert(struct llist *list,
struct llist_item *after, struct llist_item *after,
const unsigned char *sha1) const struct object_id *oid)
{ {
struct llist_item *new_item = llist_item_get(); struct llist_item *new_item = llist_item_get();
new_item->sha1 = sha1; new_item->oid = oid;
new_item->next = NULL; new_item->next = NULL;
if (after != NULL) { if (after != NULL) {
@ -131,21 +131,21 @@ static inline struct llist_item *llist_insert(struct llist *list,
} }
static inline struct llist_item *llist_insert_back(struct llist *list, static inline struct llist_item *llist_insert_back(struct llist *list,
const unsigned char *sha1) const struct object_id *oid)
{ {
return llist_insert(list, list->back, sha1); return llist_insert(list, list->back, oid);
} }
static inline struct llist_item *llist_insert_sorted_unique(struct llist *list, static inline struct llist_item *llist_insert_sorted_unique(struct llist *list,
const unsigned char *sha1, struct llist_item *hint) const struct object_id *oid, struct llist_item *hint)
{ {
struct llist_item *prev = NULL, *l; struct llist_item *prev = NULL, *l;
l = (hint == NULL) ? list->front : hint; l = (hint == NULL) ? list->front : hint;
while (l) { while (l) {
int cmp = hashcmp(l->sha1, sha1); int cmp = oidcmp(l->oid, oid);
if (cmp > 0) { /* we insert before this entry */ if (cmp > 0) { /* we insert before this entry */
return llist_insert(list, prev, sha1); return llist_insert(list, prev, oid);
} }
if (!cmp) { /* already exists */ if (!cmp) { /* already exists */
return l; return l;
@ -154,11 +154,11 @@ static inline struct llist_item *llist_insert_sorted_unique(struct llist *list,
l = l->next; l = l->next;
} }
/* insert at the end */ /* insert at the end */
return llist_insert_back(list, sha1); return llist_insert_back(list, oid);
} }
/* returns a pointer to an item in front of sha1 */ /* returns a pointer to an item in front of sha1 */
static inline struct llist_item * llist_sorted_remove(struct llist *list, const unsigned char *sha1, struct llist_item *hint) static inline struct llist_item * llist_sorted_remove(struct llist *list, const struct object_id *oid, struct llist_item *hint)
{ {
struct llist_item *prev, *l; struct llist_item *prev, *l;
@ -166,7 +166,7 @@ redo_from_start:
l = (hint == NULL) ? list->front : hint; l = (hint == NULL) ? list->front : hint;
prev = NULL; prev = NULL;
while (l) { while (l) {
int cmp = hashcmp(l->sha1, sha1); int cmp = oidcmp(l->oid, oid);
if (cmp > 0) /* not in list, since sorted */ if (cmp > 0) /* not in list, since sorted */
return prev; return prev;
if (!cmp) { /* found */ if (!cmp) { /* found */
@ -201,7 +201,7 @@ static void llist_sorted_difference_inplace(struct llist *A,
b = B->front; b = B->front;
while (b) { while (b) {
hint = llist_sorted_remove(A, b->sha1, hint); hint = llist_sorted_remove(A, b->oid, hint);
b = b->next; b = b->next;
} }
} }
@ -268,9 +268,11 @@ static void cmp_two_packs(struct pack_list *p1, struct pack_list *p2)
/* cmp ~ p1 - p2 */ /* cmp ~ p1 - p2 */
if (cmp == 0) { if (cmp == 0) {
p1_hint = llist_sorted_remove(p1->unique_objects, p1_hint = llist_sorted_remove(p1->unique_objects,
p1_base + p1_off, p1_hint); (const struct object_id *)(p1_base + p1_off),
p1_hint);
p2_hint = llist_sorted_remove(p2->unique_objects, p2_hint = llist_sorted_remove(p2->unique_objects,
p1_base + p1_off, p2_hint); (const struct object_id *)(p1_base + p1_off),
p2_hint);
p1_off += p1_step; p1_off += p1_step;
p2_off += p2_step; p2_off += p2_step;
continue; continue;
@ -501,7 +503,7 @@ static void load_all_objects(void)
l = pl->all_objects->front; l = pl->all_objects->front;
while (l) { while (l) {
hint = llist_insert_sorted_unique(all_objects, hint = llist_insert_sorted_unique(all_objects,
l->sha1, hint); l->oid, hint);
l = l->next; l = l->next;
} }
pl = pl->next; pl = pl->next;
@ -562,7 +564,7 @@ static struct pack_list * add_pack(struct packed_git *p)
base += 256 * 4 + ((p->index_version < 2) ? 4 : 8); base += 256 * 4 + ((p->index_version < 2) ? 4 : 8);
step = the_hash_algo->rawsz + ((p->index_version < 2) ? 4 : 0); step = the_hash_algo->rawsz + ((p->index_version < 2) ? 4 : 0);
while (off < p->num_objects * step) { while (off < p->num_objects * step) {
llist_insert_back(l.all_objects, base + off); llist_insert_back(l.all_objects, (const struct object_id *)(base + off));
off += step; off += step;
} }
/* this list will be pruned in cmp_two_packs later */ /* this list will be pruned in cmp_two_packs later */
@ -603,8 +605,8 @@ int cmd_pack_redundant(int argc, const char **argv, const char *prefix)
int i; int i;
struct pack_list *min, *red, *pl; struct pack_list *min, *red, *pl;
struct llist *ignore; struct llist *ignore;
unsigned char *sha1; struct object_id *oid;
char buf[42]; /* 40 byte sha1 + \n + \0 */ char buf[GIT_MAX_HEXSZ + 2]; /* hex hash + \n + \0 */
if (argc == 2 && !strcmp(argv[1], "-h")) if (argc == 2 && !strcmp(argv[1], "-h"))
usage(pack_redundant_usage); usage(pack_redundant_usage);
@ -652,10 +654,10 @@ int cmd_pack_redundant(int argc, const char **argv, const char *prefix)
llist_init(&ignore); llist_init(&ignore);
if (!isatty(0)) { if (!isatty(0)) {
while (fgets(buf, sizeof(buf), stdin)) { while (fgets(buf, sizeof(buf), stdin)) {
sha1 = xmalloc(20); oid = xmalloc(sizeof(*oid));
if (get_sha1_hex(buf, sha1)) if (get_oid_hex(buf, oid))
die("Bad sha1 on stdin: %s", buf); die("Bad object ID on stdin: %s", buf);
llist_insert_sorted_unique(ignore, sha1, NULL); llist_insert_sorted_unique(ignore, oid, NULL);
} }
} }
llist_sorted_difference_inplace(all_objects, ignore); llist_sorted_difference_inplace(all_objects, ignore);