]> git.ipfire.org Git - thirdparty/git.git/commitdiff
submodule: skip redundant active entries when pattern covers path
authorK Jayatheerth <jayatheerthkulkarni2005@gmail.com>
Sun, 8 Jun 2025 03:27:05 +0000 (08:57 +0530)
committerJunio C Hamano <gitster@pobox.com>
Sun, 8 Jun 2025 20:35:50 +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 9f6df833f0095c8c08b642d8105611ed3bb0cc50..514abe480e60cba303785f778f9fffbf6975be37 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)
@@ -3328,6 +3330,9 @@ static void configure_added_submodule(struct add_data *add_data)
        char *key;
        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);
@@ -3370,20 +3375,25 @@ 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 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 {
+       if (git_config_get("submodule.active") || /* key absent */
+           git_config_get_string_multi("submodule.active", &values)) {
+               /* submodule.active is missing -> force-enable */
                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);
+               }
        }
 }
 
index 9509dc18fde90919fa316fe7aba5d7a5a6a851a9..a42060cac96472920b84b76dbbf26c0f3a4f2350 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 &&
+               ! git config --get submodule.lib/foo.active
+       )
+'
+
 test_done