]> git.ipfire.org Git - thirdparty/git.git/commitdiff
scalar: allow reconfiguring an existing enlistment
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 3 Dec 2021 13:34:26 +0000 (13:34 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sun, 5 Dec 2021 05:52:24 +0000 (21:52 -0800)
This comes in handy during Scalar upgrades, or when config settings were
messed up by mistake.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/scalar/scalar.c
contrib/scalar/scalar.txt
contrib/scalar/t/t9099-scalar.sh

index fa900e4373ff757d85db6d58d0725d918cf6903c..d7306b43cae49baf54e5584fab72d89b21ce5e77 100644 (file)
@@ -108,18 +108,20 @@ static int run_git(const char *arg, ...)
        return res;
 }
 
-static int set_recommended_config(void)
+static int set_recommended_config(int reconfigure)
 {
        struct {
                const char *key;
                const char *value;
+               int overwrite_on_reconfigure;
        } config[] = {
-               { "am.keepCR", "true" },
-               { "core.FSCache", "true" },
-               { "core.multiPackIndex", "true" },
-               { "core.preloadIndex", "true" },
+               /* Required */
+               { "am.keepCR", "true", 1 },
+               { "core.FSCache", "true", 1 },
+               { "core.multiPackIndex", "true", 1 },
+               { "core.preloadIndex", "true", 1 },
 #ifndef WIN32
-               { "core.untrackedCache", "true" },
+               { "core.untrackedCache", "true", 1 },
 #else
                /*
                 * Unfortunately, Scalar's Functional Tests demonstrated
@@ -133,28 +135,29 @@ static int set_recommended_config(void)
                 * Therefore, with a sad heart, we disable this very useful
                 * feature on Windows.
                 */
-               { "core.untrackedCache", "false" },
+               { "core.untrackedCache", "false", 1 },
 #endif
-               { "core.logAllRefUpdates", "true" },
-               { "credential.https://dev.azure.com.useHttpPath", "true" },
-               { "credential.validate", "false" }, /* GCM4W-only */
-               { "gc.auto", "0" },
-               { "gui.GCWarning", "false" },
-               { "index.threads", "true" },
-               { "index.version", "4" },
-               { "merge.stat", "false" },
-               { "merge.renames", "true" },
-               { "pack.useBitmaps", "false" },
-               { "pack.useSparse", "true" },
-               { "receive.autoGC", "false" },
-               { "reset.quiet", "true" },
-               { "feature.manyFiles", "false" },
-               { "feature.experimental", "false" },
-               { "fetch.unpackLimit", "1" },
-               { "fetch.writeCommitGraph", "false" },
+               { "core.logAllRefUpdates", "true", 1 },
+               { "credential.https://dev.azure.com.useHttpPath", "true", 1 },
+               { "credential.validate", "false", 1 }, /* GCM4W-only */
+               { "gc.auto", "0", 1 },
+               { "gui.GCWarning", "false", 1 },
+               { "index.threads", "true", 1 },
+               { "index.version", "4", 1 },
+               { "merge.stat", "false", 1 },
+               { "merge.renames", "true", 1 },
+               { "pack.useBitmaps", "false", 1 },
+               { "pack.useSparse", "true", 1 },
+               { "receive.autoGC", "false", 1 },
+               { "reset.quiet", "true", 1 },
+               { "feature.manyFiles", "false", 1 },
+               { "feature.experimental", "false", 1 },
+               { "fetch.unpackLimit", "1", 1 },
+               { "fetch.writeCommitGraph", "false", 1 },
 #ifdef WIN32
-               { "http.sslBackend", "schannel" },
+               { "http.sslBackend", "schannel", 1 },
 #endif
+               /* Optional */
                { "status.aheadBehind", "false" },
                { "commitGraph.generationVersion", "1" },
                { "core.autoCRLF", "false" },
@@ -166,7 +169,8 @@ static int set_recommended_config(void)
        char *value;
 
        for (i = 0; config[i].key; i++) {
-               if (git_config_get_string(config[i].key, &value)) {
+               if ((reconfigure && config[i].overwrite_on_reconfigure) ||
+                   git_config_get_string(config[i].key, &value)) {
                        trace2_data_string("scalar", the_repository, config[i].key, "created");
                        if (git_config_set_gently(config[i].key,
                                                  config[i].value) < 0)
@@ -231,7 +235,7 @@ static int register_dir(void)
        int res = add_or_remove_enlistment(1);
 
        if (!res)
-               res = set_recommended_config();
+               res = set_recommended_config(0);
 
        if (!res)
                res = toggle_maintenance(1);
@@ -419,7 +423,7 @@ static int cmd_clone(int argc, const char **argv)
            (res = run_git("sparse-checkout", "init", "--cone", NULL)))
                goto cleanup;
 
-       if (set_recommended_config())
+       if (set_recommended_config(0))
                return error(_("could not configure '%s'"), dir);
 
        if ((res = run_git("fetch", "--quiet", "origin", NULL))) {
@@ -484,6 +488,24 @@ static int cmd_register(int argc, const char **argv)
        return register_dir();
 }
 
+static int cmd_reconfigure(int argc, const char **argv)
+{
+       struct option options[] = {
+               OPT_END(),
+       };
+       const char * const usage[] = {
+               N_("scalar reconfigure [<enlistment>]"),
+               NULL
+       };
+
+       argc = parse_options(argc, argv, NULL, options,
+                            usage, 0);
+
+       setup_enlistment_directory(argc, argv, usage, options, NULL);
+
+       return set_recommended_config(1);
+}
+
 static int cmd_run(int argc, const char **argv)
 {
        struct option options[] = {
@@ -620,6 +642,7 @@ static struct {
        { "register", cmd_register },
        { "unregister", cmd_unregister },
        { "run", cmd_run },
+       { "reconfigure", cmd_reconfigure },
        { NULL, NULL},
 };
 
index 39143b083246270ffe27567bc5e9dca111a28d0e..89fd7901585ac7ad3ee830a3e3fb639c5e211609 100644 (file)
@@ -13,6 +13,7 @@ scalar list
 scalar register [<enlistment>]
 scalar unregister [<enlistment>]
 scalar run ( all | config | commit-graph | fetch | loose-objects | pack-files ) [<enlistment>]
+scalar reconfigure <enlistment>
 
 DESCRIPTION
 -----------
@@ -117,6 +118,13 @@ opinionated default settings that make Git work more efficiently with
 large repositories. As this task is run as part of `scalar clone`
 automatically, explicit invocations of this task are rarely needed.
 
+Reconfigure
+~~~~~~~~~~~
+
+After a Scalar upgrade, or when the configuration of a Scalar enlistment
+was somehow corrupted or changed by mistake, this subcommand allows to
+reconfigure the enlistment.
+
 SEE ALSO
 --------
 linkgit:git-clone[1], linkgit:git-maintenance[1].
index f60e086d6f9906055c13577d9dcbbbf267124171..fb5e2efee0ae6ef63e4d86c1182e572dcbcff43b 100755 (executable)
@@ -65,4 +65,12 @@ test_expect_success 'scalar clone' '
        )
 '
 
+test_expect_success 'scalar reconfigure' '
+       git init one/src &&
+       scalar register one &&
+       git -C one/src config core.preloadIndex false &&
+       scalar reconfigure one &&
+       test true = "$(git -C one/src config core.preloadIndex)"
+'
+
 test_done