From 677a0b051f025992b74fe01ebd282df9fe4dd2ee Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Tue, 25 Mar 2025 02:40:58 +0800 Subject: [PATCH] Cache dir view in tree view --- cache.go | 1 + http_handle_repo_tree.go | 75 +++++++++++++++++++++++++++++++++-------------------- diff --git a/cache.go b/cache.go index 72c6458bd3170172f6902ca2c0d5bb067bbcc7fc..8f9781b9e81b69871542bddf276a0b075c65ce49 100644 --- a/cache.go +++ b/cache.go @@ -16,6 +16,7 @@ ReadmeFilename string ReadmeRendered template.HTML } +// key = commit hash + path var treeReadmeCache *ristretto.Cache[[]byte, treeReadmeCacheEntry] func init() { diff --git a/http_handle_repo_tree.go b/http_handle_repo_tree.go index 91d7e68fe5a70391313890b7249f730232f44003..41ae93e777fd41b4cfe5e7023d907678d0b2a45d 100644 --- a/http_handle_repo_tree.go +++ b/http_handle_repo_tree.go @@ -5,6 +5,7 @@ package main import ( "bytes" + "fmt" "html/template" "net/http" "path" @@ -39,38 +40,44 @@ return } refHashSlice = refHash[:] + cacheHandle := append(refHashSlice, []byte(pathSpec)...) + + fmt.Printf("%#v", string(cacheHandle)) + + if value, found := treeReadmeCache.Get(cacheHandle); found { + params["files"] = value.DisplayTree + params["readme_filename"] = value.ReadmeFilename + params["readme"] = value.ReadmeRendered + renderTemplate(writer, "repo_tree_dir", params) + return + } + var target *object.Tree if pathSpec == "" { - if value, found := treeReadmeCache.Get(refHashSlice); found { - params["files"] = value.DisplayTree - params["readme_filename"] = value.ReadmeFilename - params["readme"] = value.ReadmeRendered - } else { - if commitObject, err = repo.CommitObject(refHash); err != nil { - errorPage500(writer, params, "Error getting commit object: "+err.Error()) - return - } - if tree, err = commitObject.Tree(); err != nil { - errorPage500(writer, params, "Error getting file tree: "+err.Error()) - return - } + if commitObject, err = repo.CommitObject(refHash); err != nil { + errorPage500(writer, params, "Error getting commit object: "+err.Error()) + return + } + if tree, err = commitObject.Tree(); err != nil { + errorPage500(writer, params, "Error getting file tree: "+err.Error()) + return + } - start := time.Now() - displayTree := makeDisplayTree(tree) - readmeFilename, readmeRendered := renderReadmeAtTree(tree) - cost := time.Since(start).Nanoseconds() + start := time.Now() + displayTree := makeDisplayTree(tree) + readmeFilename, readmeRendered := renderReadmeAtTree(tree) + cost := time.Since(start).Nanoseconds() - params["files"] = displayTree - params["readme_filename"] = readmeFilename - params["readme"] = readmeRendered + params["files"] = displayTree + params["readme_filename"] = readmeFilename + params["readme"] = readmeRendered - entry := treeReadmeCacheEntry{ - DisplayTree: displayTree, - ReadmeFilename: readmeFilename, - ReadmeRendered: readmeRendered, - } - treeReadmeCache.Set(refHashSlice, entry, cost) + entry := treeReadmeCacheEntry{ + DisplayTree: displayTree, + ReadmeFilename: readmeFilename, + ReadmeRendered: readmeRendered, } + treeReadmeCache.Set(cacheHandle, entry, cost) renderTemplate(writer, "repo_tree_dir", params) return @@ -131,8 +138,20 @@ http.Redirect(writer, request, path.Base(pathSpec)+"/", http.StatusSeeOther) return } - params["readme_filename"], params["readme"] = renderReadmeAtTree(target) - params["files"] = makeDisplayTree(target) + start := time.Now() + displayTree := makeDisplayTree(target) + readmeFilename, readmeRendered := renderReadmeAtTree(target) + cost := time.Since(start).Nanoseconds() + + entry := treeReadmeCacheEntry{ + DisplayTree: displayTree, + ReadmeFilename: readmeFilename, + ReadmeRendered: readmeRendered, + } + treeReadmeCache.Set(cacheHandle, entry, cost) + + params["readme_filename"], params["readme"] = readmeFilename, readmeRendered + params["files"] = displayTree renderTemplate(writer, "repo_tree_dir", params) } -- 2.48.1