aboutsummaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorAdrian Ratiu <adrian.ratiu@collabora.com>2026-01-12 20:46:29 +0200
committerJunio C Hamano <gitster@pobox.com>2026-01-12 11:56:56 -0800
commit920fbe4d4ee8d4e191d33dde05a16ee0e74bdd44 (patch)
tree7c34bcb0415a2e96f886b20e106bd244c6753b98 /builtin
parent226694bdf4aaecd18f6cd4df12656cc61b213d16 (diff)
downloadgit-920fbe4d4ee8d4e191d33dde05a16ee0e74bdd44.tar.xz
submodule--helper: fix filesystem collisions by encoding gitdir paths
Fix nested filesystem collisions by url-encoding gitdir paths stored in submodule.%s.gitdir, when extensions.submodulePathConfig is enabled. Credit goes to Junio and Patrick for coming up with this design: the encoding is only applied when necessary, to newly added submodules. Existing modules don't need the encoding because git already errors out when detecting nested gitdirs before this patch. This commit adds the basic url-encoding and some tests. Next commits extend the encode -> validate -> retry loop to fix more conflicts. Suggested-by: Junio C Hamano <gitster@pobox.com> Suggested-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
-rw-r--r--builtin/submodule--helper.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index fa4f5cc159..361542d678 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -34,6 +34,7 @@
#include "list-objects-filter-options.h"
#include "wildmatch.h"
#include "strbuf.h"
+#include "url.h"
#define OPT_QUIET (1 << 0)
#define OPT_CACHED (1 << 1)
@@ -465,12 +466,23 @@ static void create_default_gitdir_config(const char *submodule_name)
{
struct strbuf gitdir_path = STRBUF_INIT;
+ /* Case 1: try the plain module name */
repo_git_path_append(the_repository, &gitdir_path, "modules/%s", submodule_name);
if (!validate_and_set_submodule_gitdir(&gitdir_path, submodule_name)) {
strbuf_release(&gitdir_path);
return;
}
+ /* Case 2: Try URI-safe (RFC3986) encoding first, this fixes nested gitdirs */
+ strbuf_reset(&gitdir_path);
+ repo_git_path_append(the_repository, &gitdir_path, "modules/");
+ strbuf_addstr_urlencode(&gitdir_path, submodule_name, is_rfc3986_unreserved);
+ if (!validate_and_set_submodule_gitdir(&gitdir_path, submodule_name)) {
+ strbuf_release(&gitdir_path);
+ return;
+ }
+
+ /* Case 3: nothing worked, error out */
die(_("failed to set a valid default config for 'submodule.%s.gitdir'. "
"Please ensure it is set, for example by running something like: "
"'git config submodule.%s.gitdir .git/modules/%s'"),