]> git.ipfire.org Git - thirdparty/git.git/commitdiff
setup: make ref storage format configurable via config
authorPatrick Steinhardt <ps@pks.im>
Fri, 16 Aug 2024 08:57:12 +0000 (10:57 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 16 Aug 2024 16:55:22 +0000 (09:55 -0700)
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>
Documentation/config/init.txt
setup.c
t/t0001-init.sh

index d6f8b6e61b198fba38ede1dbd3770ab05830bdfa..e45b2a812151dc45755b650ecd0839f4029c5c2a 100644 (file)
@@ -13,3 +13,8 @@ endif::[]
        `--object-format=` in linkgit:git-init[1]. Both the command line option
        and the `GIT_DEFAULT_HASH` environment variable take precedence over
        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.
diff --git a/setup.c b/setup.c
index 770ad1393f36ec82fbd11940862af4029ab5936d..dd2251f655de873cf1194e48035f59eef7dd654b 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -2286,6 +2286,7 @@ static void separate_git_dir(const char *git_dir, const char *git_link)
 
 struct default_format_config {
        int hash;
+       enum ref_storage_format ref_format;
 };
 
 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;
        }
 
+       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;
 out:
        free(str);
@@ -2317,6 +2328,7 @@ static void repository_format_configure(struct repository_format *repo_fmt,
 {
        struct default_format_config cfg = {
                .hash = GIT_HASH_UNKNOWN,
+               .ref_format = REF_STORAGE_FORMAT_UNKNOWN,
        };
        struct config_options opts = {
                .respect_includes = 1,
@@ -2359,6 +2371,8 @@ static void repository_format_configure(struct repository_format *repo_fmt,
                if (ref_format == REF_STORAGE_FORMAT_UNKNOWN)
                        die(_("unknown ref storage format '%s'"), env);
                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);
 }
index cd34710f32a44a93ce5d4b912b51bea4afac1af9..0178aa62a41f1606f2382a4a10ab593ccf11e0e8 100755 (executable)
@@ -620,6 +620,19 @@ test_expect_success 'init with GIT_DEFAULT_REF_FORMAT=garbage' '
        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"
 for format in $backends
 do
@@ -650,6 +663,27 @@ do
                git -C refformat rev-parse --show-ref-format >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
 
 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_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
 do
        test_expect_success "re-init with same format ($from_format)" '