]> git.ipfire.org Git - thirdparty/git.git/commitdiff
scalar: teach 'reconfigure' to optionally handle all registered enlistments
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 3 Dec 2021 13:34:27 +0000 (13:34 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sun, 5 Dec 2021 05:52:24 +0000 (21:52 -0800)
After a Scalar upgrade, it can come in really handy if there is an easy
way to reconfigure all Scalar enlistments. This new option offers this
functionality.

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 d7306b43cae49baf54e5584fab72d89b21ce5e77..305b080663bb83958cc971634cf2f1d7ee3d4dc5 100644 (file)
@@ -488,22 +488,77 @@ static int cmd_register(int argc, const char **argv)
        return register_dir();
 }
 
+static int get_scalar_repos(const char *key, const char *value, void *data)
+{
+       struct string_list *list = data;
+
+       if (!strcmp(key, "scalar.repo"))
+               string_list_append(list, value);
+
+       return 0;
+}
+
 static int cmd_reconfigure(int argc, const char **argv)
 {
+       int all = 0;
        struct option options[] = {
+               OPT_BOOL('a', "all", &all,
+                        N_("reconfigure all registered enlistments")),
                OPT_END(),
        };
        const char * const usage[] = {
-               N_("scalar reconfigure [<enlistment>]"),
+               N_("scalar reconfigure [--all | <enlistment>]"),
                NULL
        };
+       struct string_list scalar_repos = STRING_LIST_INIT_DUP;
+       int i, res = 0;
+       struct repository r = { NULL };
+       struct strbuf commondir = STRBUF_INIT, gitdir = STRBUF_INIT;
 
        argc = parse_options(argc, argv, NULL, options,
                             usage, 0);
 
-       setup_enlistment_directory(argc, argv, usage, options, NULL);
+       if (!all) {
+               setup_enlistment_directory(argc, argv, usage, options, NULL);
+
+               return set_recommended_config(1);
+       }
+
+       if (argc > 0)
+               usage_msg_opt(_("--all or <enlistment>, but not both"),
+                             usage, options);
+
+       git_config(get_scalar_repos, &scalar_repos);
 
-       return set_recommended_config(1);
+       for (i = 0; i < scalar_repos.nr; i++) {
+               const char *dir = scalar_repos.items[i].string;
+
+               strbuf_reset(&commondir);
+               strbuf_reset(&gitdir);
+
+               if (chdir(dir) < 0) {
+                       warning_errno(_("could not switch to '%s'"), dir);
+                       res = -1;
+               } else if (discover_git_directory(&commondir, &gitdir) < 0) {
+                       warning_errno(_("git repository gone in '%s'"), dir);
+                       res = -1;
+               } else {
+                       git_config_clear();
+
+                       the_repository = &r;
+                       r.commondir = commondir.buf;
+                       r.gitdir = gitdir.buf;
+
+                       if (set_recommended_config(1) < 0)
+                               res = -1;
+               }
+       }
+
+       string_list_clear(&scalar_repos, 1);
+       strbuf_release(&commondir);
+       strbuf_release(&gitdir);
+
+       return res;
 }
 
 static int cmd_run(int argc, const char **argv)
index 89fd7901585ac7ad3ee830a3e3fb639c5e211609..737cf563c1a511cff4dd28005e9147398b48b3c9 100644 (file)
@@ -13,7 +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>
+scalar reconfigure [ --all | <enlistment> ]
 
 DESCRIPTION
 -----------
@@ -32,8 +32,8 @@ an existing Git worktree with Scalar whose name is not `src`, the enlistment
 will be identical to the worktree.
 
 The `scalar` command implements various subcommands, and different options
-depending on the subcommand. With the exception of `clone` and `list`, all
-subcommands expect to be run in an enlistment.
+depending on the subcommand. With the exception of `clone`, `list` and
+`reconfigure --all`, all subcommands expect to be run in an enlistment.
 
 COMMANDS
 --------
@@ -125,6 +125,9 @@ 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.
 
+With the `--all` option, all enlistments currently registered with Scalar
+will be reconfigured. Use this option after each Scalar upgrade.
+
 SEE ALSO
 --------
 linkgit:git-clone[1], linkgit:git-maintenance[1].
index fb5e2efee0ae6ef63e4d86c1182e572dcbcff43b..58af546fd840cb9b4bf2dc5331f9c6ab5a3827af 100755 (executable)
@@ -70,6 +70,9 @@ test_expect_success 'scalar reconfigure' '
        scalar register one &&
        git -C one/src config core.preloadIndex false &&
        scalar reconfigure one &&
+       test true = "$(git -C one/src config core.preloadIndex)" &&
+       git -C one/src config core.preloadIndex false &&
+       scalar reconfigure -a &&
        test true = "$(git -C one/src config core.preloadIndex)"
 '