blob: 01fb913abf78fc2320e8276a08115dc65457a0a6 [file]
#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)
{
struct packfile_list_entry *entry;
entry = 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;
}