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
This commit is contained in:
Lunny Xiao 2024-12-05 23:39:50 -08:00 committed by Earl Warren
parent 6ac88eab0f
commit 6f2875d3c6
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
2 changed files with 45 additions and 10 deletions

View file

@ -6,6 +6,7 @@ package repo
import ( import (
"bytes" "bytes"
gocontext "context"
"fmt" "fmt"
"io" "io"
"net/http" "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 { if err != nil {
ctx.ServerError("ListEntries", err) ctx.ServerError("ListEntries", err)
return 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)) pages := make([]PageMeta, 0, len(entries))
for _, entry := range entries { for _, entry := range entries {
if !entry.IsRegular() { if !entry.Entry.IsRegular() {
continue continue
} }
c, err := wikiRepo.GetCommitByPath(entry.Name()) wikiName, err := wiki_service.GitPathToWebPath(entry.Entry.Name())
if err != nil {
ctx.ServerError("GetCommit", err)
return
}
wikiName, err := wiki_service.GitPathToWebPath(entry.Name())
if err != nil { if err != nil {
if repo_model.IsErrWikiInvalidFileName(err) { if repo_model.IsErrWikiInvalidFileName(err) {
continue continue
@ -625,8 +636,8 @@ func WikiPages(ctx *context.Context) {
pages = append(pages, PageMeta{ pages = append(pages, PageMeta{
Name: displayName, Name: displayName,
SubURL: wiki_service.WebPathToURLPath(wikiName), SubURL: wiki_service.WebPathToURLPath(wikiName),
GitEntryName: entry.Name(), GitEntryName: entry.Entry.Name(),
UpdatedUnix: timeutil.TimeStamp(c.Author.When.Unix()), UpdatedUnix: timeutil.TimeStamp(entry.Commit.Author.When.Unix()),
}) })
} }
ctx.Data["Pages"] = pages ctx.Data["Pages"] = pages

View file

@ -6,14 +6,18 @@ package integration
import ( import (
"context" "context"
"fmt" "fmt"
"net/http"
"net/url" "net/url"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"testing" "testing"
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/tests"
"github.com/PuerkitoBio/goquery"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "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)
})
}