]> git.ipfire.org Git - thirdparty/git.git/commitdiff
submodule--helper update-clone: learn --init
authorGlen Choo <chooglen@google.com>
Sat, 5 Mar 2022 00:13:58 +0000 (16:13 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sat, 5 Mar 2022 00:39:12 +0000 (16:39 -0800)
Teach "git submodule--helper update-clone" the --init flag and remove
the corresponding shell code.

When the `--init` flag is passed to the subcommand, we do not spawn a
new subprocess and call `submodule--helper init` on the submodule paths,
because the Git machinery is not able to pick up the configuration
changes introduced by that init call. So we instead run the
`init_submodule_cb()` callback over each submodule in the same process.

[1] https://lore.kernel.org/git/CAP8UFD0NCQ5w_3GtT_xHr35i7h8BuLX4UcHNY6VHPGREmDVObA@mail.gmail.com/

Signed-off-by: Glen Choo <chooglen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/submodule--helper.c
git-submodule.sh

index c6df64bf6a58b732765637e49708e7cf2ed379f0..17dabf3d1278af245a87833ad5f0188e45d0dbc5 100644 (file)
@@ -2000,6 +2000,7 @@ struct submodule_update_clone {
        int failed_clones_nr, failed_clones_alloc;
 
        int max_jobs;
+       unsigned int init;
 };
 #define SUBMODULE_UPDATE_CLONE_INIT { \
        .list = MODULE_LIST_INIT, \
@@ -2509,6 +2510,8 @@ static int update_clone(int argc, const char **argv, const char *prefix)
        int ret;
 
        struct option module_update_clone_options[] = {
+               OPT_BOOL(0, "init", &suc.init,
+                        N_("initialize uninitialized submodules before update")),
                OPT_STRING(0, "prefix", &prefix,
                           N_("path"),
                           N_("path into the working tree")),
@@ -2567,6 +2570,29 @@ static int update_clone(int argc, const char **argv, const char *prefix)
        if (pathspec.nr)
                suc.warn_if_uninitialized = 1;
 
+       if (suc.init) {
+               struct module_list list = MODULE_LIST_INIT;
+               struct init_cb info = INIT_CB_INIT;
+
+               if (module_list_compute(argc, argv, suc.prefix,
+                                       &pathspec, &list) < 0)
+                       return 1;
+
+               /*
+                * If there are no path args and submodule.active is set then,
+                * by default, only initialize 'active' modules.
+                */
+               if (!argc && git_config_get_value_multi("submodule.active"))
+                       module_list_active(&list);
+
+               info.prefix = suc.prefix;
+               info.superprefix = suc.recursive_prefix;
+               if (suc.quiet)
+                       info.flags |= OPT_QUIET;
+
+               for_each_listed_submodule(&list, init_submodule_cb, &info);
+       }
+
        ret = update_submodules(&suc);
        list_objects_filter_release(&filter_options);
        return ret;
index 882bf097d53d833ea2964a1a35dafacf7c94aa5d..16dea0ca596b81e86d63ce6451487025a5891188 100755 (executable)
@@ -361,14 +361,11 @@ cmd_update()
                usage
        fi
 
-       if test -n "$init"
-       then
-               cmd_init "--" "$@" || return
-       fi
-
        {
-       git submodule--helper update-clone ${GIT_QUIET:+--quiet} \
+       git ${wt_prefix:+-C "$wt_prefix"} submodule--helper update-clone \
+               ${GIT_QUIET:+--quiet} \
                ${progress:+"--progress"} \
+               ${init:+--init} \
                ${wt_prefix:+--prefix "$wt_prefix"} \
                ${prefix:+--recursive-prefix "$prefix"} \
                ${update:+--update "$update"} \