aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cache.go14
-rw-r--r--http_handle_repo_raw.go32
2 files changed, 45 insertions, 1 deletions
diff --git a/cache.go b/cache.go
index 7259e38..59c4004 100644
--- a/cache.go
+++ b/cache.go
@@ -58,3 +58,17 @@ func init() {
clog.Fatal(1, "Error initializing commitPathFileHTMLCache: "+err.Error())
}
}
+
+var commitPathFileRawCache *ristretto.Cache[[]byte, string]
+
+func init() {
+ var err error
+ commitPathFileRawCache, err = ristretto.NewCache(&ristretto.Config[[]byte, string]{
+ NumCounters: 1e4,
+ MaxCost: 1 << 60,
+ BufferItems: 8192,
+ })
+ if err != nil {
+ clog.Fatal(1, "Error initializing commitPathFileRawCache: "+err.Error())
+ }
+}
diff --git a/http_handle_repo_raw.go b/http_handle_repo_raw.go
index 6b69720..36e59d7 100644
--- a/http_handle_repo_raw.go
+++ b/http_handle_repo_raw.go
@@ -7,6 +7,7 @@ import (
"fmt"
"net/http"
"strings"
+ "time"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
@@ -17,6 +18,7 @@ func httpHandleRepoRaw(writer http.ResponseWriter, request *http.Request, params
var rawPathSpec, pathSpec string
var repo *git.Repository
var refHash plumbing.Hash
+ var refHashSlice []byte
var commitObj *object.Commit
var tree *object.Tree
var err error
@@ -29,6 +31,19 @@ func httpHandleRepoRaw(writer http.ResponseWriter, request *http.Request, params
errorPage500(writer, params, "Error getting ref hash: "+err.Error())
return
}
+ refHashSlice = refHash[:]
+
+ cacheHandle := append(refHashSlice, []byte(pathSpec)...)
+
+ if value, found := treeReadmeCache.Get(cacheHandle); found {
+ params["files"] = value.DisplayTree
+ renderTemplate(writer, "repo_raw_dir", params)
+ return
+ }
+ if value, found := commitPathFileRawCache.Get(cacheHandle); found {
+ fmt.Fprint(writer, value)
+ return
+ }
if commitObj, err = repo.CommitObject(refHash); err != nil {
errorPage500(writer, params, "Error getting commit object: "+err.Error())
@@ -39,6 +54,7 @@ func httpHandleRepoRaw(writer http.ResponseWriter, request *http.Request, params
return
}
+ start := time.Now()
var target *object.Tree
if pathSpec == "" {
target = tree
@@ -57,6 +73,8 @@ func httpHandleRepoRaw(writer http.ResponseWriter, request *http.Request, params
errorPage500(writer, params, "Error reading file: "+err.Error())
return
}
+ cost := time.Since(start).Nanoseconds()
+ commitPathFileRawCache.Set(cacheHandle, fileContent, cost)
fmt.Fprint(writer, fileContent)
return
}
@@ -66,7 +84,19 @@ func httpHandleRepoRaw(writer http.ResponseWriter, request *http.Request, params
return
}
- params["files"] = makeDisplayTree(target)
+ displayTree := makeDisplayTree(target)
+ readmeFilename, readmeRendered := renderReadmeAtTree(target)
+ cost := time.Since(start).Nanoseconds()
+
+ params["files"] = displayTree
+ params["readme_filename"] = readmeFilename
+ params["readme"] = readmeRendered
+
+ treeReadmeCache.Set(cacheHandle, treeReadmeCacheEntry{
+ DisplayTree: displayTree,
+ ReadmeFilename: readmeFilename,
+ ReadmeRendered: readmeRendered,
+ }, cost)
renderTemplate(writer, "repo_raw_dir", params)
}