Skip to content

Commit

Permalink
Merge pull request #184 from mikyk10/master
Browse files Browse the repository at this point in the history
git: worktree, Support relative submodule URL.
  • Loading branch information
mcuadros committed Oct 20, 2020
2 parents 97741e7 + e0bd4e8 commit 15aedd2
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 2 deletions.
28 changes: 27 additions & 1 deletion worktree.go
Expand Up @@ -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.
Expand Down
44 changes: 43 additions & 1 deletion worktree_test.go
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"context"
"errors"
"io"
"io/ioutil"
"os"
"path/filepath"
Expand All @@ -12,7 +13,7 @@ import (
"testing"
"time"

fixtures "github.com/go-git/go-git-fixtures/v4"
"github.com/go-git/go-git-fixtures/v4"
"github.com/go-git/go-git/v5/config"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/filemode"
Expand Down Expand Up @@ -519,6 +520,47 @@ func (s *WorktreeSuite) TestCheckoutSubmoduleInitialized(c *C) {
c.Assert(status.IsClean(), Equals, true)
}


func (s *WorktreeSuite) TestCheckoutRelativePathSubmoduleInitialized(c *C) {
url := "https://github.com/git-fixtures/submodule.git"
r := s.NewRepository(fixtures.ByURL(url).One())

// modify the .gitmodules from original one
file, err := r.wt.OpenFile(".gitmodules", os.O_WRONLY|os.O_TRUNC, 0666)
c.Assert(err, IsNil)

n, err := io.WriteString(file, `[submodule "basic"]
path = basic
url = ../basic.git
[submodule "itself"]
path = itself
url = ../submodule.git`)
c.Assert(err, IsNil)
c.Assert(n, Not(Equals), 0)

w, err := r.Worktree()
c.Assert(err, IsNil)

w.Add(".gitmodules")
w.Commit("test", &CommitOptions{})

// test submodule path
modules, err := w.readGitmodulesFile()

c.Assert(modules.Submodules["basic"].URL, Equals, "git@github.com:git-fixtures/basic.git")
c.Assert(modules.Submodules["itself"].URL, Equals, "git@github.com:git-fixtures/submodule.git")

sub, err := w.Submodules()
c.Assert(err, IsNil)

err = sub.Update(&SubmoduleUpdateOptions{Init: true, RecurseSubmodules:DefaultSubmoduleRecursionDepth})
c.Assert(err, IsNil)

status, err := w.Status()
c.Assert(err, IsNil)
c.Assert(status.IsClean(), Equals, true)
}

func (s *WorktreeSuite) TestCheckoutIndexMem(c *C) {
fs := memfs.New()
w := &Worktree{
Expand Down

0 comments on commit 15aedd2

Please sign in to comment.