diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index b7a7a3f042..bea002f690 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -1044,7 +1044,15 @@ func renderHomeCode(ctx *context.Context) { return } - if entry.IsDir() { + if entry.IsSubModule() { + subModuleURL, err := ctx.Repo.Commit.GetSubModule(entry.Name()) + if err != nil { + HandleGitError(ctx, "Repo.Commit.GetSubModule", err) + return + } + subModuleFile := git.NewSubModuleFile(ctx.Repo.Commit, subModuleURL, entry.ID.String()) + ctx.Redirect(subModuleFile.RefURL(setting.AppURL, ctx.Repo.Repository.FullName(), setting.SSH.Domain)) + } else if entry.IsDir() { renderDirectory(ctx) } else { renderFile(ctx, entry) diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go index 59cf642719..19e8553bb2 100644 --- a/tests/integration/repo_test.go +++ b/tests/integration/repo_test.go @@ -1426,6 +1426,12 @@ func TestRepoSubmoduleView(t *testing.T) { htmlDoc := NewHTMLParser(t, resp.Body) htmlDoc.AssertElement(t, fmt.Sprintf(`tr[data-entryname="repo1"] a[href="%s"]`, u.JoinPath("/user2/repo1").String()), true) + + // Check that a link to the submodule returns a redirect and that the redirect link is correct. + req = NewRequest(t, "GET", "/"+repo.FullName()+"/src/branch/"+repo.DefaultBranch+"/repo1") + resp = MakeRequest(t, req, http.StatusSeeOther) + + assert.Equal(t, u.JoinPath("/user2/repo1").String(), resp.Header().Get("Location")) }) }