diff options
Diffstat (limited to 'http_handle_repo_index.go')
-rw-r--r-- | http_handle_repo_index.go | 63 |
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: |