mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-20 20:07:03 +01:00
Fix: return correct type in GetSubModule
- `GetSubModules` already solely stores the URL of the submodule and not
a `*SubModule` entry, so don't try to type assert it to be a struct.
- I am not able to pinpoint when this was regressed but if I had to
guess it might be #4941.
- Added integration test.
(cherry picked from commit e7cffc378f
)
This commit is contained in:
parent
eeb3451a89
commit
532c35c25a
4 changed files with 46 additions and 12 deletions
|
@ -395,20 +395,20 @@ func parseSubmoduleContent(bs []byte) (*ObjectCache, error) {
|
||||||
return submoduleCache, nil
|
return submoduleCache, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSubModule get the sub module according entryname
|
// GetSubModule returns the URL to the submodule according entryname
|
||||||
func (c *Commit) GetSubModule(entryname string) (*SubModule, error) {
|
func (c *Commit) GetSubModule(entryname string) (string, error) {
|
||||||
modules, err := c.GetSubModules()
|
modules, err := c.GetSubModules()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
if modules != nil {
|
if modules != nil {
|
||||||
module, has := modules.Get(entryname)
|
module, has := modules.Get(entryname)
|
||||||
if has {
|
if has {
|
||||||
return module.(*SubModule), nil
|
return module.(string), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetBranchName gets the closest branch name (as returned by 'git name-rev --name-only')
|
// GetBranchName gets the closest branch name (as returned by 'git name-rev --name-only')
|
||||||
|
|
|
@ -72,17 +72,15 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, commit *Commit, treePath
|
||||||
|
|
||||||
// If the entry if a submodule add a submodule file for this
|
// If the entry if a submodule add a submodule file for this
|
||||||
if entry.IsSubModule() {
|
if entry.IsSubModule() {
|
||||||
subModuleURL := ""
|
|
||||||
var fullPath string
|
var fullPath string
|
||||||
if len(treePath) > 0 {
|
if len(treePath) > 0 {
|
||||||
fullPath = treePath + "/" + entry.Name()
|
fullPath = treePath + "/" + entry.Name()
|
||||||
} else {
|
} else {
|
||||||
fullPath = entry.Name()
|
fullPath = entry.Name()
|
||||||
}
|
}
|
||||||
if subModule, err := commit.GetSubModule(fullPath); err != nil {
|
subModuleURL, err := commit.GetSubModule(fullPath)
|
||||||
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
} else if subModule != nil {
|
|
||||||
subModuleURL = subModule.URL
|
|
||||||
}
|
}
|
||||||
subModuleFile := NewSubModuleFile(commitsInfo[i].Commit, subModuleURL, entry.ID.String())
|
subModuleFile := NewSubModuleFile(commitsInfo[i].Commit, subModuleURL, entry.ID.String())
|
||||||
commitsInfo[i].SubModuleFile = subModuleFile
|
commitsInfo[i].SubModuleFile = subModuleFile
|
||||||
|
|
|
@ -211,12 +211,12 @@ func GetContents(ctx context.Context, repo *repo_model.Repository, treePath, ref
|
||||||
contentsResponse.Target = &targetFromContent
|
contentsResponse.Target = &targetFromContent
|
||||||
} else if entry.IsSubModule() {
|
} else if entry.IsSubModule() {
|
||||||
contentsResponse.Type = string(ContentTypeSubmodule)
|
contentsResponse.Type = string(ContentTypeSubmodule)
|
||||||
submodule, err := commit.GetSubModule(treePath)
|
submoduleURL, err := commit.GetSubModule(treePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if submodule != nil && submodule.URL != "" {
|
if submoduleURL != "" {
|
||||||
contentsResponse.SubmoduleGitURL = &submodule.URL
|
contentsResponse.SubmoduleGitURL = &submoduleURL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Handle links
|
// Handle links
|
||||||
|
|
|
@ -1377,3 +1377,39 @@ func TestRepoIssueFilterLinks(t *testing.T) {
|
||||||
assert.True(t, called)
|
assert.True(t, called)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRepoSubmoduleView(t *testing.T) {
|
||||||
|
onGiteaRun(t, func(t *testing.T, u *url.URL) {
|
||||||
|
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
|
||||||
|
repo, _, f := tests.CreateDeclarativeRepo(t, user2, "", []unit_model.Type{unit_model.TypeCode}, nil, nil)
|
||||||
|
defer f()
|
||||||
|
|
||||||
|
// Clone the repository, add a submodule and push it.
|
||||||
|
dstPath := t.TempDir()
|
||||||
|
|
||||||
|
uClone := *u
|
||||||
|
uClone.Path = repo.FullName()
|
||||||
|
uClone.User = url.UserPassword(user2.Name, userPassword)
|
||||||
|
|
||||||
|
t.Run("Clone", doGitClone(dstPath, &uClone))
|
||||||
|
|
||||||
|
_, _, err := git.NewCommand(git.DefaultContext, "submodule", "add").AddDynamicArguments(u.JoinPath("/user2/repo1").String()).RunStdString(&git.RunOpts{Dir: dstPath})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, _, err = git.NewCommand(git.DefaultContext, "add", "repo1", ".gitmodules").RunStdString(&git.RunOpts{Dir: dstPath})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, _, err = git.NewCommand(git.DefaultContext, "commit", "-m", "add submodule").RunStdString(&git.RunOpts{Dir: dstPath})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, _, err = git.NewCommand(git.DefaultContext, "push").RunStdString(&git.RunOpts{Dir: dstPath})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Check that the submodule entry exist and the link is correct.
|
||||||
|
req := NewRequest(t, "GET", "/"+repo.FullName())
|
||||||
|
resp := MakeRequest(t, req, http.StatusOK)
|
||||||
|
|
||||||
|
htmlDoc := NewHTMLParser(t, resp.Body)
|
||||||
|
htmlDoc.AssertElement(t, fmt.Sprintf(`tr[data-entryname="repo1"] a[href="%s"]`, u.JoinPath("/user2/repo1").String()), true)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue