Problem
When the parent repository uses an SCP-like URL (e.g., git@github.com:org/repo.git) and a submodule is configured with a relative path (e.g., ../other/submodule.git), envbuilder cannot resolve the submodule URL.
Currently this returns an error:
relative submodule URL "../other/submodule.git" cannot be resolved: parent URL "git@github.com:org/repo.git" uses SCP-like syntax which is not supported for relative submodule resolution
Background
Go's net/url.Parse() cannot properly parse SCP-like URLs - they have no scheme and use : as a path separator instead of /.
We've built a custom ResolveSubmoduleURL function to handle relative submodule paths because go-git's native implementation has bugs with:
- HTTPS URLs losing slashes when using
filepath.Dir()
- Multiple relative paths (
../../submodule.git) not resolving correctly
Workaround
Users can configure submodules with absolute URLs instead of relative paths.
Proposed Solution
Add SCP-like URL handling to ResolveSubmoduleURL:
- Detect SCP-like parent URLs using the existing
scpLikeURLRegex
- Parse into user, host, and path components
- Apply relative path resolution to the path component
- Reconstruct the SCP-like URL
Alternatively, use go-git's transport.NewEndpoint() which can parse SCP-like URLs, but this needs careful testing to ensure it doesn't reintroduce the bugs we worked around.
Related/Blocker
Problem
When the parent repository uses an SCP-like URL (e.g.,
git@github.com:org/repo.git) and a submodule is configured with a relative path (e.g.,../other/submodule.git), envbuilder cannot resolve the submodule URL.Currently this returns an error:
Background
Go's
net/url.Parse()cannot properly parse SCP-like URLs - they have no scheme and use:as a path separator instead of/.We've built a custom
ResolveSubmoduleURLfunction to handle relative submodule paths because go-git's native implementation has bugs with:filepath.Dir()../../submodule.git) not resolving correctlyWorkaround
Users can configure submodules with absolute URLs instead of relative paths.
Proposed Solution
Add SCP-like URL handling to
ResolveSubmoduleURL:scpLikeURLRegexAlternatively, use go-git's
transport.NewEndpoint()which can parse SCP-like URLs, but this needs careful testing to ensure it doesn't reintroduce the bugs we worked around.Related/Blocker