aboutsummaryrefslogtreecommitdiff
path: root/http_handle_repo_index.go
diff options
context:
space:
mode:
Diffstat (limited to 'http_handle_repo_index.go')
-rw-r--r--http_handle_repo_index.go63
1 files changed, 54 insertions, 9 deletions
diff --git a/http_handle_repo_index.go b/http_handle_repo_index.go
index 7dc7826..44151a0 100644
--- a/http_handle_repo_index.go
+++ b/http_handle_repo_index.go
@@ -4,22 +4,48 @@
package main
import (
+ "html/template"
"iter"
"net/http"
"strings"
+ "time"
+ "github.com/dgraph-io/ristretto/v2"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
"github.com/go-git/go-git/v5/plumbing/storer"
+ "go.lindenii.runxiyu.org/lindenii-common/clog"
)
+type indexPageCacheEntry struct {
+ DisplayTree []displayTreeEntry
+ ReadmeFilename string
+ ReadmeRendered template.HTML
+}
+
+var indexPageCache *ristretto.Cache[[]byte, indexPageCacheEntry]
+
+func init() {
+ var err error
+ indexPageCache, err = ristretto.NewCache(&ristretto.Config[[]byte, indexPageCacheEntry]{
+ NumCounters: 1e4,
+ MaxCost: 1 << 30,
+ BufferItems: 64,
+ })
+ if err != nil {
+ clog.Fatal(1, "Error initializing indexPageCache: "+err.Error())
+ }
+}
+
func httpHandleRepoIndex(writer http.ResponseWriter, _ *http.Request, params map[string]any) {
var repo *git.Repository
var repoName string
var groupPath []string
var refHash plumbing.Hash
+ var refHashSlice []byte
var err error
+ var logOptions git.LogOptions
var commitIter object.CommitIter
var commitIterSeq iter.Seq[*object.Commit]
var commitObj *object.Commit
@@ -27,7 +53,6 @@ func httpHandleRepoIndex(writer http.ResponseWriter, _ *http.Request, params map
var notes []string
var branches []string
var branchesIter storer.ReferenceIter
- var logOptions git.LogOptions
repo, repoName, groupPath = params["repo"].(*git.Repository), params["repo_name"].(string), params["group_path"].([]string)
@@ -39,6 +64,7 @@ func httpHandleRepoIndex(writer http.ResponseWriter, _ *http.Request, params map
if err != nil {
goto no_ref
}
+ refHashSlice = refHash[:]
branchesIter, err = repo.Branches()
if err == nil {
@@ -49,6 +75,7 @@ func httpHandleRepoIndex(writer http.ResponseWriter, _ *http.Request, params map
}
params["branches"] = branches
+ // TODO: Cache
logOptions = git.LogOptions{From: refHash} //exhaustruct:ignore
if commitIter, err = repo.Log(&logOptions); err != nil {
goto no_ref
@@ -56,16 +83,34 @@ func httpHandleRepoIndex(writer http.ResponseWriter, _ *http.Request, params map
commitIterSeq, params["commits_err"] = commitIterSeqErr(commitIter)
params["commits"] = iterSeqLimit(commitIterSeq, 3)
- if commitObj, err = repo.CommitObject(refHash); err != nil {
- goto no_ref
- }
+ if value, found := indexPageCache.Get(refHashSlice); found {
+ params["files"] = value.DisplayTree
+ params["readme_filename"] = value.ReadmeFilename
+ params["readme"] = value.ReadmeRendered
+ } else {
+ start := time.Now()
+ if commitObj, err = repo.CommitObject(refHash); err != nil {
+ goto no_ref
+ }
- if tree, err = commitObj.Tree(); err != nil {
- goto no_ref
- }
+ if tree, err = commitObj.Tree(); err != nil {
+ goto no_ref
+ }
+ displayTree := makeDisplayTree(tree)
+ readmeFilename, readmeRendered := renderReadmeAtTree(tree)
+ cost := time.Since(start).Nanoseconds()
- params["files"] = makeDisplayTree(tree)
- params["readme_filename"], params["readme"] = renderReadmeAtTree(tree)
+ params["files"] = displayTree
+ params["readme_filename"] = readmeFilename
+ params["readme"] = readmeRendered
+
+ entry := indexPageCacheEntry{
+ DisplayTree: displayTree,
+ ReadmeFilename: readmeFilename,
+ ReadmeRendered: readmeRendered,
+ }
+ indexPageCache.Set(refHashSlice, entry, cost)
+ }
no_ref: