diff options
author | Mitsutaka Naito <4987502+mikyk10@users.noreply.github.com> | 2020-10-13 09:54:44 +0900 |
---|---|---|
committer | Mitsutaka Naito <4987502+mikyk10@users.noreply.github.com> | 2020-10-13 09:54:44 +0900 |
commit | e0bd4e88b649faf6ed4196a9d02913110f6974d0 (patch) | |
tree | 2faa36ae9fe2bfa6c0a7b864fd1a5f0b642f79f7 /worktree.go | |
parent | 97741e72346716fd90e534a1b9bd9f7643cd0c80 (diff) | |
download | go-git-e0bd4e88b649faf6ed4196a9d02913110f6974d0.tar.gz |
git: worktree, Support relative submodule URL.
Diffstat (limited to 'worktree.go')
-rw-r--r-- | worktree.go | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/worktree.go b/worktree.go index 62ad03b..c79e715 100644 --- a/worktree.go +++ b/worktree.go @@ -716,7 +716,33 @@ func (w *Worktree) readGitmodulesFile() (*config.Modules, error) { } m := config.NewModules() - return m, m.Unmarshal(input) + if err := m.Unmarshal(input); err != nil { + return m, err + } + + w.resolveRelativeSubmodulePaths(m) + + return m, nil +} + + +// resolveRelativeSubmodulePaths is to replace any relative submodule URL (../foobar.git) in .gitmodules +// to the accessible repository URL +func (w *Worktree) resolveRelativeSubmodulePaths(m *config.Modules) { + origin, err := w.r.Remotes() + // remote is not associated with this worktree. we don't need to process any futher more + if err != nil { + return + } + + parentURL := filepath.Dir(origin[0].c.URLs[0]) + + for i := range m.Submodules { + if strings.HasPrefix(m.Submodules[i].URL, "../") { + child := strings.Replace(m.Submodules[i].URL, "../", "", 1) + m.Submodules[i].URL = fmt.Sprintf("%s/%s", parentURL, child) + } + } } // Clean the worktree by removing untracked files. |