| #include "git-compat-util.h" | |
| #include "packfile.h" | |
| #include "packfile-list.h" | |
| void packfile_list_clear(struct packfile_list *list) | |
| { | |
| struct packfile_list_entry *e, *next; | |
| for (e = list->head; e; e = next) { | |
| next = e->next; | |
| free(e); | |
| } | |
| list->head = list->tail = NULL; | |
| } | |
| static struct packfile_list_entry *packfile_list_remove_internal(struct packfile_list *list, | |
| struct packed_git *pack) | |
| { | |
| struct packfile_list_entry *e, *prev; | |
| for (e = list->head, prev = NULL; e; prev = e, e = e->next) { | |
| if (e->pack != pack) | |
| continue; | |
| if (prev) | |
| prev->next = e->next; | |
| if (list->head == e) | |
| list->head = e->next; | |
| if (list->tail == e) | |
| list->tail = prev; | |
| return e; | |
| } | |
| return NULL; | |
| } | |
| void packfile_list_remove(struct packfile_list *list, struct packed_git *pack) | |
| { | |
| free(packfile_list_remove_internal(list, pack)); | |
| } | |
| void packfile_list_prepend(struct packfile_list *list, struct packed_git *pack) | |
| { | |
| struct packfile_list_entry *entry; | |
| entry = packfile_list_remove_internal(list, pack); | |
| if (!entry) { | |
| entry = xmalloc(sizeof(*entry)); | |
| entry->pack = pack; | |
| } | |
| entry->next = list->head; | |
| list->head = entry; | |
| if (!list->tail) | |
| list->tail = entry; | |
| } | |
| void packfile_list_append(struct packfile_list *list, struct packed_git *pack, | |
| int skip_dup_check) | |
| { | |
| struct packfile_list_entry *entry; | |
| entry = skip_dup_check ? NULL : packfile_list_remove_internal(list, pack); | |
| if (!entry) { | |
| entry = xmalloc(sizeof(*entry)); | |
| entry->pack = pack; | |
| } | |
| entry->next = NULL; | |
| if (list->tail) { | |
| list->tail->next = entry; | |
| list->tail = entry; | |
| } else { | |
| list->head = list->tail = entry; | |
| } | |
| } | |
| struct packed_git *packfile_list_find_oid(struct packfile_list_entry *packs, | |
| const struct object_id *oid) | |
| { | |
| for (; packs; packs = packs->next) | |
| if (find_pack_entry_one(oid, packs->pack)) | |
| return packs->pack; | |
| return NULL; | |
| } |