From 6f2875d3c65ccf3f303a9771005324b7190e0e76 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 5 Dec 2024 23:39:50 -0800 Subject: [PATCH] Make wiki pages visit fast (#32732) (cherry picked from commit b32f0cdfa05c3a0e34425e1b8a5dfa8b63914a01) Conflicts: tests/integration/wiki_test.go "Long-Page" is missing as well as the tests package --- routers/web/repo/wiki.go | 31 +++++++++++++------ .../{git_clone_wiki_test.go => wiki_test.go} | 24 ++++++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) rename tests/integration/{git_clone_wiki_test.go => wiki_test.go} (66%) diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go index 1fd080021d..3d55afe294 100644 --- a/routers/web/repo/wiki.go +++ b/routers/web/repo/wiki.go @@ -6,6 +6,7 @@ package repo import ( "bytes" + gocontext "context" "fmt" "io" "net/http" @@ -598,22 +599,32 @@ func WikiPages(ctx *context.Context) { } }() - entries, err := commit.ListEntries() + treePath := "" // To support list sub folders' pages in the future + tree, err := commit.SubTree(treePath) + if err != nil { + ctx.ServerError("SubTree", err) + return + } + + allEntries, err := tree.ListEntries() if err != nil { ctx.ServerError("ListEntries", err) return } + allEntries.CustomSort(base.NaturalSortLess) + + entries, _, err := allEntries.GetCommitsInfo(gocontext.Context(ctx), commit, treePath) + if err != nil { + ctx.ServerError("GetCommitsInfo", err) + return + } + pages := make([]PageMeta, 0, len(entries)) for _, entry := range entries { - if !entry.IsRegular() { + if !entry.Entry.IsRegular() { continue } - c, err := wikiRepo.GetCommitByPath(entry.Name()) - if err != nil { - ctx.ServerError("GetCommit", err) - return - } - wikiName, err := wiki_service.GitPathToWebPath(entry.Name()) + wikiName, err := wiki_service.GitPathToWebPath(entry.Entry.Name()) if err != nil { if repo_model.IsErrWikiInvalidFileName(err) { continue @@ -625,8 +636,8 @@ func WikiPages(ctx *context.Context) { pages = append(pages, PageMeta{ Name: displayName, SubURL: wiki_service.WebPathToURLPath(wikiName), - GitEntryName: entry.Name(), - UpdatedUnix: timeutil.TimeStamp(c.Author.When.Unix()), + GitEntryName: entry.Entry.Name(), + UpdatedUnix: timeutil.TimeStamp(entry.Commit.Author.When.Unix()), }) } ctx.Data["Pages"] = pages diff --git a/tests/integration/git_clone_wiki_test.go b/tests/integration/wiki_test.go similarity index 66% rename from tests/integration/git_clone_wiki_test.go rename to tests/integration/wiki_test.go index df260258de..3e30b94486 100644 --- a/tests/integration/git_clone_wiki_test.go +++ b/tests/integration/wiki_test.go @@ -6,14 +6,18 @@ package integration import ( "context" "fmt" + "net/http" "net/url" "os" "path/filepath" + "strings" "testing" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/tests" + "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -47,3 +51,23 @@ func TestRepoCloneWiki(t *testing.T) { }) }) } + +func Test_RepoWikiPages(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + url := "/user2/repo1/wiki/?action=_pages" + req := NewRequest(t, "GET", url) + resp := MakeRequest(t, req, http.StatusOK) + + doc := NewHTMLParser(t, resp.Body) + expectedPagePaths := []string{ + "Home", "Long-Page", "Page-With-Image", "Page-With-Spaced-Name", "Unescaped-File", + } + doc.Find("tr").Each(func(i int, s *goquery.Selection) { + firstAnchor := s.Find("a").First() + href, _ := firstAnchor.Attr("href") + pagePath := strings.TrimPrefix(href, "/user2/repo1/wiki/") + + assert.EqualValues(t, expectedPagePaths[i], pagePath) + }) +}