const char *old_desc, *reflog_msg;
if (opts->new_branch) {
if (opts->new_orphan_branch) {
- enum log_refs_config log_all_ref_updates =
- repo_settings_get_log_all_ref_updates(the_repository);
+ enum log_refs_config log_all_ref_updates = LOG_REFS_UNSET;
+ const char *value;
char *refname;
+ if (!repo_config_get_string_tmp(the_repository, "core.logallrefupdates", &value))
+ log_all_ref_updates = refs_parse_log_all_ref_updates_config(value);
+
refname = mkpathdup("refs/heads/%s", opts->new_orphan_branch);
if (opts->new_branch_log &&
!should_autocreate_reflog(log_all_ref_updates, refname)) {
return strbuf_detach(&sb, NULL);
}
+enum log_refs_config refs_parse_log_all_ref_updates_config(const char *value)
+{
+ if (value && !strcasecmp(value, "always"))
+ return LOG_REFS_ALWAYS;
+ else if (git_config_bool("core.logallrefupdates", value))
+ return LOG_REFS_NORMAL;
+ return LOG_REFS_NONE;
+}
+
int should_autocreate_reflog(enum log_refs_config log_all_ref_updates,
const char *refname)
{
struct ref_store *refs;
struct ref_store_init_options opts = {
.access_flags = flags,
- .log_all_ref_updates = repo_settings_get_log_all_ref_updates(repo),
};
be = find_ref_storage_backend(format);
int refs_ref_exists(struct ref_store *refs, const char *refname);
+enum log_refs_config {
+ LOG_REFS_UNSET = -1,
+ LOG_REFS_NONE = 0,
+ LOG_REFS_NORMAL,
+ LOG_REFS_ALWAYS
+};
+
+enum log_refs_config refs_parse_log_all_ref_updates_config(const char *value);
+
int should_autocreate_reflog(enum log_refs_config log_all_ref_updates,
const char *refname);
refs->gitcommondir = tmp;
}
+static int files_ref_store_config(const char *var, const char *value,
+ const struct config_context *ctx UNUSED,
+ void *payload)
+{
+ struct files_ref_store *refs = payload;
+
+ if (!strcmp(var, "core.prefersymlinkrefs")) {
+ refs->prefer_symlink_refs = git_config_bool(var, value);
+ } else if (!strcmp(var, "core.logallrefupdates")) {
+ refs->log_all_ref_updates = refs_parse_log_all_ref_updates_config(value);
+ }
+
+ return 0;
+}
+
/*
* Create a new submodule ref cache and add it to the internal
* set of caches.
refs->packed_ref_store =
packed_ref_store_init(repo, NULL, refs->gitcommondir, opts);
refs->store_flags = opts->access_flags;
- refs->log_all_ref_updates = opts->log_all_ref_updates;
-
- repo_config_get_bool(repo, "core.prefersymlinkrefs", &refs->prefer_symlink_refs);
+ refs->log_all_ref_updates = LOG_REFS_UNSET;
+ repo_config(repo, files_ref_store_config, refs);
chdir_notify_register(NULL, files_ref_store_reparent, refs);
strbuf_release(&refdir);
struct ref_store_init_options {
/* The kind of operations that the ref_store is allowed to perform. */
unsigned int access_flags;
-
- /*
- * Denotes under what conditions reflogs should be created when updating
- * references.
- */
- enum log_refs_config log_all_ref_updates;
};
/*
static int reftable_be_config(const char *var, const char *value,
const struct config_context *ctx,
- void *_opts)
+ void *payload)
{
- struct reftable_write_options *opts = _opts;
+ struct reftable_ref_store *refs = payload;
if (!strcmp(var, "reftable.blocksize")) {
unsigned long block_size = git_config_ulong(var, value, ctx->kvi);
if (block_size > 16777215)
die("reftable block size cannot exceed 16MB");
- opts->block_size = block_size;
+ refs->write_options.block_size = block_size;
} else if (!strcmp(var, "reftable.restartinterval")) {
unsigned long restart_interval = git_config_ulong(var, value, ctx->kvi);
if (restart_interval > UINT16_MAX)
die("reftable block size cannot exceed %u", (unsigned)UINT16_MAX);
- opts->restart_interval = restart_interval;
+ refs->write_options.restart_interval = restart_interval;
} else if (!strcmp(var, "reftable.indexobjects")) {
- opts->skip_index_objects = !git_config_bool(var, value);
+ refs->write_options.skip_index_objects = !git_config_bool(var, value);
} else if (!strcmp(var, "reftable.geometricfactor")) {
unsigned long factor = git_config_ulong(var, value, ctx->kvi);
if (factor > UINT8_MAX)
die("reftable geometric factor cannot exceed %u", (unsigned)UINT8_MAX);
- opts->auto_compaction_factor = factor;
+ refs->write_options.auto_compaction_factor = factor;
} else if (!strcmp(var, "reftable.locktimeout")) {
int64_t lock_timeout = git_config_int64(var, value, ctx->kvi);
if (lock_timeout > LONG_MAX)
die("reftable lock timeout cannot exceed %"PRIdMAX, (intmax_t)LONG_MAX);
if (lock_timeout < 0 && lock_timeout != -1)
die("reftable lock timeout does not support negative values other than -1");
- opts->lock_timeout_ms = lock_timeout;
+ refs->write_options.lock_timeout_ms = lock_timeout;
+ } else if (!strcmp(var, "core.logallrefupdates")) {
+ refs->log_all_ref_updates = refs_parse_log_all_ref_updates_config(value);
}
return 0;
base_ref_store_init(&refs->base, repo, refdir.buf, &refs_be_reftable);
strmap_init(&refs->worktree_backends);
- refs->log_all_ref_updates = opts->log_all_ref_updates;
refs->store_flags = opts->access_flags;
switch (repo->hash_algo->format_id) {
refs->write_options.disable_auto_compact =
!git_env_bool("GIT_TEST_REFTABLE_AUTOCOMPACTION", 1);
refs->write_options.lock_timeout_ms = 100;
+ refs->log_all_ref_updates = LOG_REFS_UNSET;
- repo_config(repo, reftable_be_config, &refs->write_options);
+ repo_config(repo, reftable_be_config, refs);
/*
* It is somewhat unfortunate that we have to mirror the default block
repo->settings.big_file_threshold = value;
}
-enum log_refs_config repo_settings_get_log_all_ref_updates(struct repository *repo)
-{
- const char *value;
-
- if (!repo_config_get_string_tmp(repo, "core.logallrefupdates", &value)) {
- if (value && !strcasecmp(value, "always"))
- return LOG_REFS_ALWAYS;
- else if (git_config_bool("core.logallrefupdates", value))
- return LOG_REFS_NORMAL;
- else
- return LOG_REFS_NONE;
- }
-
- return LOG_REFS_UNSET;
-}
-
int repo_settings_get_warn_ambiguous_refs(struct repository *repo)
{
prepare_repo_settings(repo);
FETCH_NEGOTIATION_NOOP,
};
-enum log_refs_config {
- LOG_REFS_UNSET = -1,
- LOG_REFS_NONE = 0,
- LOG_REFS_NORMAL,
- LOG_REFS_ALWAYS
-};
-
struct repo_settings {
int initialized;
void prepare_repo_settings(struct repository *r);
void repo_settings_clear(struct repository *r);
-/* Read the value for "core.logAllRefUpdates". */
-enum log_refs_config repo_settings_get_log_all_ref_updates(struct repository *repo);
/* Read the value for "core.warnAmbiguousRefs". */
int repo_settings_get_warn_ambiguous_refs(struct repository *repo);
/* Read the value for "core.hooksPath". */
if (is_bare_repository())
repo_config_set(repo, "core.bare", "true");
else {
+ const char *value;
+
repo_config_set(repo, "core.bare", "false");
+
/* allow template config file to override the default */
- if (repo_settings_get_log_all_ref_updates(repo) == LOG_REFS_UNSET)
+ if (repo_config_get_string_tmp(repo, "core.logallrefupdates", &value))
repo_config_set(repo, "core.logallrefupdates", "true");
+
if (needs_work_tree_config(original_git_dir, work_tree))
repo_config_set(repo, "core.worktree", work_tree);
}