From 3a9039bc9516493bafe06e42d3d6a8906680be65 Mon Sep 17 00:00:00 2001 From: Giteabot Date: Sat, 7 Dec 2024 02:54:29 +0800 Subject: [PATCH] Make wiki pages visit fast (#32732) (#32745) Backport #32732 by @lunny Fix #20156 We reuse the code from the repository code view instead of the current code. Previously it took `5653ms` for https://gitea.com/henri/wiki/wiki/?action=_pages in my local machine, now it's about `300ms` . Co-authored-by: Lunny Xiao --- routers/web/repo/wiki.go | 31 +++++++++++++------ .../{git_clone_wiki_test.go => wiki_test.go} | 23 ++++++++++++++ 2 files changed, 44 insertions(+), 10 deletions(-) rename tests/integration/{git_clone_wiki_test.go => wiki_test.go} (69%) diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go index d2056353d8..28728e4e6a 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" @@ -651,22 +652,32 @@ func WikiPages(ctx *context.Context) { return } - 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 @@ -678,8 +689,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 69% rename from tests/integration/git_clone_wiki_test.go rename to tests/integration/wiki_test.go index ef662300f3..bb73f71a45 100644 --- a/tests/integration/git_clone_wiki_test.go +++ b/tests/integration/wiki_test.go @@ -6,15 +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" ) @@ -50,3 +53,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", "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) + }) +}