This new function will register all known ref storage backends... once there are any other than the default. For now, it's a no-op. Signed-off-by: David Turner <dturner@xxxxxxxxxxxxxxxx> --- builtin/init-db.c | 3 +++ config.c | 25 +++++++++++++++++++++++++ refs.c | 13 +++++++++---- refs.h | 2 ++ 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/builtin/init-db.c b/builtin/init-db.c index 753cb1c..9bd98eb 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -225,6 +225,7 @@ static int create_default_files(const char *template_path) if (strcmp(ref_storage_backend, "files")) { git_config_set("extensions.refStorage", ref_storage_backend); git_config_set("core.repositoryformatversion", ref_storage_backend); + register_ref_storage_backends(); if (set_ref_storage_backend(ref_storage_backend)) die(_("Unknown ref storage backend %s"), ref_storage_backend); @@ -502,6 +503,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, init_db_options, init_db_usage, 0); + register_ref_storage_backends(); + if (requested_ref_storage_backend && !ref_storage_backend_exists(requested_ref_storage_backend)) die(_("Unknown ref storage backend %s"), diff --git a/config.c b/config.c index b95ac3a..025a1ee 100644 --- a/config.c +++ b/config.c @@ -11,6 +11,7 @@ #include "strbuf.h" #include "quote.h" #include "hashmap.h" +#include "refs.h" #include "string-list.h" #include "utf8.h" @@ -1207,6 +1208,30 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config) } if (repo_config && !access_or_die(repo_config, R_OK, 0)) { + char *storage = NULL; + + /* + * make sure we always read the ref storage config + * from the extensions section on startup + */ + ret += git_config_from_file(ref_storage_backend_config, + repo_config, &storage); + + register_ref_storage_backends(); + if (!storage) + storage = xstrdup(""); + + if (!*storage || + !strcmp(storage, "files")) { + /* default backend, nothing to do */ + free(storage); + } else { + ref_storage_backend = storage; + if (set_ref_storage_backend(ref_storage_backend)) + die(_("Unknown ref storage backend %s"), + ref_storage_backend); + } + ret += git_config_from_file(fn, repo_config, data); found += 1; } diff --git a/refs.c b/refs.c index ea7e0eb..dec7b5c 100644 --- a/refs.c +++ b/refs.c @@ -14,14 +14,11 @@ static const char split_transaction_fail_warning[] = N_( "transaction succeeded, but then the update to the per-worktree refs " "failed. Your repository may be in an inconsistent state."); -/* - * We always have a files backend and it is the default. - */ static struct ref_storage_be *the_refs_backend = &refs_be_files; /* * List of all available backends */ -static struct ref_storage_be *refs_backends = &refs_be_files; +static struct ref_storage_be *refs_backends = NULL; const char *ref_storage_backend = "files"; @@ -1580,3 +1577,11 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg) } return the_refs_backend->rename_ref(oldref, newref, logmsg); } + +void register_ref_storage_backends(void) { + /* + * Add register_ref_storage_backend(ptr-to-backend) + * entries below when you add a new backend. + */ + register_ref_storage_backend(&refs_be_files); +} diff --git a/refs.h b/refs.h index e659882..363c6ee 100644 --- a/refs.h +++ b/refs.h @@ -525,4 +525,6 @@ int ref_storage_backend_exists(const char *name); void register_ref_storage_backend(struct ref_storage_be *be); +void register_ref_storage_backends(void); + #endif /* REFS_H */ -- 2.4.2.767.g62658d5-twtrsrc -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html