]> git.ipfire.org Git - thirdparty/git.git/commitdiff
submodule: skip redundant active entries when pattern covers path
authorK Jayatheerth <jayatheerthkulkarni2005@gmail.com>
Thu, 24 Jul 2025 15:24:18 +0000 (20:54 +0530)
committerJunio C Hamano <gitster@pobox.com>
Thu, 24 Jul 2025 20:35:08 +0000 (13:35 -0700)
configure_added_submodule always writes an explicit
submodule.<name>.active entry, even when the new
path is already matched by submodule.active
patterns. This leads to unnecessary and cluttered configuration.

change the logic to centralize wildmatch-based pattern lookup,
in configure_added_submodule. Wrap the active-entry write in a conditional
that only fires when that helper reports no existing pattern covers the
submodule’s path.

Signed-off-by: K Jayatheerth <jayatheerthkulkarni2005@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/submodule--helper.c
t/t7413-submodule-is-active.sh

index 5f85b169c539ac8dbe588fd84cfc8d6ba8ce64a8..ca6f6fe1d13b60dd939c1e74193fad6c1709e033 100644 (file)
@@ -32,6 +32,8 @@
 #include "advice.h"
 #include "branch.h"
 #include "list-objects-filter-options.h"
+#include "wildmatch.h"
+#include "strbuf.h"
 
 #define OPT_QUIET (1 << 0)
 #define OPT_CACHED (1 << 1)
@@ -3329,6 +3331,9 @@ static void configure_added_submodule(struct add_data *add_data)
        struct child_process add_submod = CHILD_PROCESS_INIT;
        struct child_process add_gitmodules = CHILD_PROCESS_INIT;
 
+       const struct string_list *values;
+       size_t i;
+       int matched = 0;
        key = xstrfmt("submodule.%s.url", add_data->sm_name);
        git_config_set_gently(key, add_data->realrepo);
        free(key);
@@ -3370,20 +3375,28 @@ static void configure_added_submodule(struct add_data *add_data)
         * is_submodule_active(), since that function needs to find
         * out the value of "submodule.active" again anyway.
         */
-       if (!git_config_get("submodule.active")) {
+       if (git_config_get("submodule.active") || /* key absent */
+           git_config_get_string_multi("submodule.active", &values)) {
                /*
                 * If the submodule being added isn't already covered by the
                 * current configured pathspec, set the submodule's active flag
                 */
-               if (!is_submodule_active(the_repository, add_data->sm_path)) {
+               key = xstrfmt("submodule.%s.active", add_data->sm_name);
+               git_config_set_gently(key, "true");
+               free(key);
+       } else {
+               for (i = 0; i < values->nr; i++) {
+                       const char *pat = values->items[i].string;
+                       if (!wildmatch(pat, add_data->sm_path, 0)) { /* match found */
+                               matched = 1;
+                               break;
+                       }
+               }
+               if (!matched) { /* no pattern matched -> force-enable */
                        key = xstrfmt("submodule.%s.active", add_data->sm_name);
                        git_config_set_gently(key, "true");
                        free(key);
                }
-       } else {
-               key = xstrfmt("submodule.%s.active", add_data->sm_name);
-               git_config_set_gently(key, "true");
-               free(key);
        }
 }
 
index 9509dc18fde90919fa316fe7aba5d7a5a6a851a9..6fd3b870dec777df67f8d925c153a22b96eae426 100755 (executable)
@@ -124,4 +124,19 @@ test_expect_success 'is-active, submodule.active and submodule add' '
        git -C super2 config --get submodule.mod.active
 '
 
+test_expect_success 'submodule add skips redundant active entry' '
+       git init repo &&
+       (
+               cd repo &&
+               git config submodule.active "lib/*" &&
+               git commit --allow-empty -m init &&
+
+               git init ../lib-origin &&
+               git -C ../lib-origin commit --allow-empty -m init &&
+
+               git submodule add ../lib-origin lib/foo &&
+               test_must_fail git config --get submodule.lib/foo.active
+       )
+'
+
 test_done