mirror of
https://github.com/git-for-windows/git.git
synced 2026-06-19 07:12:51 -05:00
packfile: split out packfile list logic
In the next commit we're about to introduce the "packed" object database source. This source will embed a packfile list, and consequently we'll have to include "packfile.h" to make the struct definition available. This will unfortunately lead to a cyclic dependency that we cannot resolve with a forward declaration. Split out the code that relates to the packfile list into a separate compilation unit so that both "packfile.h" and "odb/source-packed.h" can include it. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
e2fb4ba003
commit
cf86a18ac3
1
Makefile
1
Makefile
@@ -1233,6 +1233,7 @@ LIB_OBJS += pack-refs.o
|
||||
LIB_OBJS += pack-revindex.o
|
||||
LIB_OBJS += pack-write.o
|
||||
LIB_OBJS += packfile.o
|
||||
LIB_OBJS += packfile-list.o
|
||||
LIB_OBJS += pager.o
|
||||
LIB_OBJS += parallel-checkout.o
|
||||
LIB_OBJS += parse.o
|
||||
|
||||
@@ -421,6 +421,7 @@ libgit_sources = [
|
||||
'pack-revindex.c',
|
||||
'pack-write.c',
|
||||
'packfile.c',
|
||||
'packfile-list.c',
|
||||
'pager.c',
|
||||
'parallel-checkout.c',
|
||||
'parse.c',
|
||||
|
||||
86
packfile-list.c
Normal file
86
packfile-list.c
Normal file
@@ -0,0 +1,86 @@
|
||||
#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;
|
||||
}
|
||||
28
packfile-list.h
Normal file
28
packfile-list.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#ifndef PACKFILE_LIST_H
|
||||
#define PACKFILE_LIST_H
|
||||
|
||||
struct object_id;
|
||||
|
||||
struct packfile_list {
|
||||
struct packfile_list_entry *head, *tail;
|
||||
};
|
||||
|
||||
struct packfile_list_entry {
|
||||
struct packfile_list_entry *next;
|
||||
struct packed_git *pack;
|
||||
};
|
||||
|
||||
void packfile_list_clear(struct packfile_list *list);
|
||||
void packfile_list_remove(struct packfile_list *list, struct packed_git *pack);
|
||||
void packfile_list_prepend(struct packfile_list *list, struct packed_git *pack);
|
||||
void packfile_list_append(struct packfile_list *list, struct packed_git *pack);
|
||||
|
||||
/*
|
||||
* Find the pack within the "packs" list whose index contains the object
|
||||
* "oid". For general object lookups, you probably don't want this; use
|
||||
* find_pack_entry() instead.
|
||||
*/
|
||||
struct packed_git *packfile_list_find_oid(struct packfile_list_entry *packs,
|
||||
const struct object_id *oid);
|
||||
|
||||
#endif
|
||||
83
packfile.c
83
packfile.c
@@ -48,89 +48,6 @@ static size_t pack_mapped;
|
||||
#define SZ_FMT PRIuMAX
|
||||
static inline uintmax_t sz_fmt(size_t s) { return s; }
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
void pack_report(struct repository *repo)
|
||||
{
|
||||
fprintf(stderr,
|
||||
|
||||
23
packfile.h
23
packfile.h
@@ -6,6 +6,7 @@
|
||||
#include "odb.h"
|
||||
#include "odb/source-files.h"
|
||||
#include "oidset.h"
|
||||
#include "packfile-list.h"
|
||||
#include "repository.h"
|
||||
#include "strmap.h"
|
||||
|
||||
@@ -54,28 +55,6 @@ struct packed_git {
|
||||
char pack_name[FLEX_ARRAY]; /* more */
|
||||
};
|
||||
|
||||
struct packfile_list {
|
||||
struct packfile_list_entry *head, *tail;
|
||||
};
|
||||
|
||||
struct packfile_list_entry {
|
||||
struct packfile_list_entry *next;
|
||||
struct packed_git *pack;
|
||||
};
|
||||
|
||||
void packfile_list_clear(struct packfile_list *list);
|
||||
void packfile_list_remove(struct packfile_list *list, struct packed_git *pack);
|
||||
void packfile_list_prepend(struct packfile_list *list, struct packed_git *pack);
|
||||
void packfile_list_append(struct packfile_list *list, struct packed_git *pack);
|
||||
|
||||
/*
|
||||
* Find the pack within the "packs" list whose index contains the object
|
||||
* "oid". For general object lookups, you probably don't want this; use
|
||||
* find_pack_entry() instead.
|
||||
*/
|
||||
struct packed_git *packfile_list_find_oid(struct packfile_list_entry *packs,
|
||||
const struct object_id *oid);
|
||||
|
||||
/*
|
||||
* A store that manages packfiles for a given object database.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user