setup: make ref storage format configurable via config

Similar to the preceding commit, introduce a new "init.defaultRefFormat"
config that allows the user to globally set the ref storage format used
by newly created repositories.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Patrick Steinhardt 2024-08-16 10:57:12 +02:00 committed by Junio C Hamano
parent 0c22e09b73
commit d2511eeae5
3 changed files with 63 additions and 0 deletions

View File

@ -13,3 +13,8 @@ endif::[]
`--object-format=` in linkgit:git-init[1]. Both the command line option `--object-format=` in linkgit:git-init[1]. Both the command line option
and the `GIT_DEFAULT_HASH` environment variable take precedence over and the `GIT_DEFAULT_HASH` environment variable take precedence over
this config. this config.
`init.defaultRefFormat`::
Allows overriding the default ref storage format for new repositories.
See `--ref-format=` in linkgit:git-init[1]. Both the command line
option and the `GIT_DEFAULT_REF_FORMAT` environment variable take
precedence over this config.

14
setup.c
View File

@ -2286,6 +2286,7 @@ static void separate_git_dir(const char *git_dir, const char *git_link)


struct default_format_config { struct default_format_config {
int hash; int hash;
enum ref_storage_format ref_format;
}; };


static int read_default_format_config(const char *key, const char *value, static int read_default_format_config(const char *key, const char *value,
@ -2306,6 +2307,16 @@ static int read_default_format_config(const char *key, const char *value,
goto out; goto out;
} }


if (!strcmp(key, "init.defaultrefformat")) {
ret = git_config_string(&str, key, value);
if (ret)
goto out;
cfg->ref_format = ref_storage_format_by_name(str);
if (cfg->ref_format == REF_STORAGE_FORMAT_UNKNOWN)
warning(_("unknown ref storage format '%s'"), str);
goto out;
}

ret = 0; ret = 0;
out: out:
free(str); free(str);
@ -2317,6 +2328,7 @@ static void repository_format_configure(struct repository_format *repo_fmt,
{ {
struct default_format_config cfg = { struct default_format_config cfg = {
.hash = GIT_HASH_UNKNOWN, .hash = GIT_HASH_UNKNOWN,
.ref_format = REF_STORAGE_FORMAT_UNKNOWN,
}; };
struct config_options opts = { struct config_options opts = {
.respect_includes = 1, .respect_includes = 1,
@ -2359,6 +2371,8 @@ static void repository_format_configure(struct repository_format *repo_fmt,
if (ref_format == REF_STORAGE_FORMAT_UNKNOWN) if (ref_format == REF_STORAGE_FORMAT_UNKNOWN)
die(_("unknown ref storage format '%s'"), env); die(_("unknown ref storage format '%s'"), env);
repo_fmt->ref_storage_format = ref_format; repo_fmt->ref_storage_format = ref_format;
} else if (cfg.ref_format != REF_STORAGE_FORMAT_UNKNOWN) {
repo_fmt->ref_storage_format = cfg.ref_format;
} }
repo_set_ref_storage_format(the_repository, repo_fmt->ref_storage_format); repo_set_ref_storage_format(the_repository, repo_fmt->ref_storage_format);
} }

View File

@ -620,6 +620,19 @@ test_expect_success 'init with GIT_DEFAULT_REF_FORMAT=garbage' '
test_cmp expect err test_cmp expect err
' '


test_expect_success 'init warns about invalid init.defaultRefFormat' '
test_when_finished "rm -rf repo" &&
test_config_global init.defaultRefFormat garbage &&

echo "warning: unknown ref storage format ${SQ}garbage${SQ}" >expect &&
git init repo 2>err &&
test_cmp expect err &&

git -C repo rev-parse --show-ref-format >actual &&
echo $GIT_DEFAULT_REF_FORMAT >expected &&
test_cmp expected actual
'

backends="files reftable" backends="files reftable"
for format in $backends for format in $backends
do do
@ -650,6 +663,27 @@ do
git -C refformat rev-parse --show-ref-format >actual && git -C refformat rev-parse --show-ref-format >actual &&
test_cmp expect actual test_cmp expect actual
' '

test_expect_success "init with init.defaultRefFormat=$format" '
test_when_finished "rm -rf refformat" &&
test_config_global init.defaultRefFormat $format &&
(
sane_unset GIT_DEFAULT_REF_FORMAT &&
git init refformat
) &&

echo $format >expect &&
git -C refformat rev-parse --show-ref-format >actual &&
test_cmp expect actual
'

test_expect_success "--ref-format=$format overrides GIT_DEFAULT_REF_FORMAT" '
test_when_finished "rm -rf refformat" &&
GIT_DEFAULT_REF_FORMAT=garbage git init --ref-format=$format refformat &&
echo $format >expect &&
git -C refformat rev-parse --show-ref-format >actual &&
test_cmp expect actual
'
done done


test_expect_success "--ref-format= overrides GIT_DEFAULT_REF_FORMAT" ' test_expect_success "--ref-format= overrides GIT_DEFAULT_REF_FORMAT" '
@ -660,6 +694,16 @@ test_expect_success "--ref-format= overrides GIT_DEFAULT_REF_FORMAT" '
test_cmp expect actual test_cmp expect actual
' '


test_expect_success "GIT_DEFAULT_REF_FORMAT= overrides init.defaultRefFormat" '
test_when_finished "rm -rf refformat" &&
test_config_global init.defaultRefFormat files &&

GIT_DEFAULT_REF_FORMAT=reftable git init refformat &&
echo reftable >expect &&
git -C refformat rev-parse --show-ref-format >actual &&
test_cmp expect actual
'

for from_format in $backends for from_format in $backends
do do
test_expect_success "re-init with same format ($from_format)" ' test_expect_success "re-init with same format ($from_format)" '