Skip to content

Commit

Permalink
refs: refactor logic to look up storage backends
Browse files Browse the repository at this point in the history
In order to look up ref storage backends, we're currently using a linked
list of backends, where each backend is expected to set up its `next`
pointer to the next ref storage backend. This is kind of a weird setup
as backends need to be aware of other backends without much of a reason.

Refactor the code so that the array of backends is centrally defined in
"refs.c", where each backend is now identified by an integer constant.
Expose functions to translate from those integer constants to the name
and vice versa, which will be required by subsequent patches.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
pks-t authored and gitster committed Jan 2, 2024
1 parent 465a22b commit 0fcc285
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 13 deletions.
34 changes: 25 additions & 9 deletions refs.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,33 @@
/*
* List of all available backends
*/
static struct ref_storage_be *refs_backends = &refs_be_files;
static const struct ref_storage_be *refs_backends[] = {
[REF_STORAGE_FORMAT_FILES] = &refs_be_files,
};

static struct ref_storage_be *find_ref_storage_backend(const char *name)
static const struct ref_storage_be *find_ref_storage_backend(unsigned int ref_storage_format)
{
struct ref_storage_be *be;
for (be = refs_backends; be; be = be->next)
if (!strcmp(be->name, name))
return be;
if (ref_storage_format < ARRAY_SIZE(refs_backends))
return refs_backends[ref_storage_format];
return NULL;
}

unsigned int ref_storage_format_by_name(const char *name)
{
for (unsigned int i = 0; i < ARRAY_SIZE(refs_backends); i++)
if (refs_backends[i] && !strcmp(refs_backends[i]->name, name))
return i;
return REF_STORAGE_FORMAT_UNKNOWN;
}

const char *ref_storage_format_to_name(unsigned int ref_storage_format)
{
const struct ref_storage_be *be = find_ref_storage_backend(ref_storage_format);
if (!be)
return "unknown";
return be->name;
}

/*
* How to handle various characters in refnames:
* 0: An acceptable character for refs
Expand Down Expand Up @@ -2029,12 +2045,12 @@ static struct ref_store *ref_store_init(struct repository *repo,
const char *gitdir,
unsigned int flags)
{
const char *be_name = "files";
struct ref_storage_be *be = find_ref_storage_backend(be_name);
unsigned int format = REF_STORAGE_FORMAT_FILES;
const struct ref_storage_be *be = find_ref_storage_backend(format);
struct ref_store *refs;

if (!be)
BUG("reference backend %s is unknown", be_name);
BUG("reference backend is unknown");

refs = be->init(repo, gitdir, flags);
return refs;
Expand Down
3 changes: 3 additions & 0 deletions refs.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ struct string_list;
struct string_list_item;
struct worktree;

unsigned int ref_storage_format_by_name(const char *name);
const char *ref_storage_format_to_name(unsigned int ref_storage_format);

/*
* Resolve a reference, recursively following symbolic refererences.
*
Expand Down
1 change: 0 additions & 1 deletion refs/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,6 @@ static int debug_reflog_expire(struct ref_store *ref_store, const char *refname,
}

struct ref_storage_be refs_be_debug = {
.next = NULL,
.name = "debug",
.init = NULL,
.init_db = debug_init_db,
Expand Down
1 change: 0 additions & 1 deletion refs/files-backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -3241,7 +3241,6 @@ static int files_init_db(struct ref_store *ref_store, struct strbuf *err UNUSED)
}

struct ref_storage_be refs_be_files = {
.next = NULL,
.name = "files",
.init = files_ref_store_create,
.init_db = files_init_db,
Expand Down
1 change: 0 additions & 1 deletion refs/packed-backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -1705,7 +1705,6 @@ static struct ref_iterator *packed_reflog_iterator_begin(struct ref_store *ref_s
}

struct ref_storage_be refs_be_packed = {
.next = NULL,
.name = "packed",
.init = packed_ref_store_create,
.init_db = packed_init_db,
Expand Down
1 change: 0 additions & 1 deletion refs/refs-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,6 @@ typedef int read_symbolic_ref_fn(struct ref_store *ref_store, const char *refnam
struct strbuf *referent);

struct ref_storage_be {
struct ref_storage_be *next;
const char *name;
ref_store_init_fn *init;
ref_init_db_fn *init_db;
Expand Down
3 changes: 3 additions & 0 deletions repository.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ enum fetch_negotiation_setting {
FETCH_NEGOTIATION_NOOP,
};

#define REF_STORAGE_FORMAT_UNKNOWN 0
#define REF_STORAGE_FORMAT_FILES 1

struct repo_settings {
int initialized;

Expand Down

0 comments on commit 0fcc285

Please sign in to comment.