parent:
b283f1af81a23d60c77f4f569d74cbb747059049
nmyk <nick@nmyk.io>
2026-02-21T18:59:46-05:00
standardize error handling
diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go
index 5666168639d56995f9ea1232687a61195fd278ef..6b28420ad0a1c06b7d4e43a0c072c8b6606987b2 100644
--- a/internal/handlers/handlers.go
+++ b/internal/handlers/handlers.go
@@ -67,6 +67,10 @@
//go:embed static/style.css
var defaultCSS []byte
+func (s Server) error(w http.ResponseWriter, err error) {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+}
+
func (s Server) Serve(w http.ResponseWriter, tmplName string, data any) {
tmpl := template.Must(template.New("").
Funcs(template.FuncMap{
@@ -82,7 +86,7 @@ ),
)
var buf bytes.Buffer
if err := tmpl.ExecuteTemplate(&buf, tmplName, data); err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
w.WriteHeader(http.StatusOK)
@@ -98,7 +102,7 @@
func (s Server) ListRepos(w http.ResponseWriter, _ *http.Request) {
repos, err := core.List(s.Dir)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
data := IndexData{
@@ -132,12 +136,12 @@ func (s Server) Refs(w http.ResponseWriter, r *http.Request) {
repoName := r.PathValue("name")
repo, err := s.open(repoName)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
branchIter, err := repo.Branches()
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
var branches []BranchMeta
@@ -146,12 +150,12 @@ branches = append(branches, BranchMeta{ref.Name().Short()})
return nil
})
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
tagIter, err := repo.Tags()
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
var tags []TagMeta
@@ -160,7 +164,7 @@ tags = append(tags, TagMeta{ref.Name().Short()})
return nil
})
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
refType := r.PathValue("type")
@@ -193,7 +197,7 @@ func (s Server) Commits(w http.ResponseWriter, r *http.Request) {
repoName := r.PathValue("name")
repo, err := s.open(repoName)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
commit, _, err := repo.ParseRoute(r.PathValue("path"))
@@ -205,7 +209,7 @@ iter, err := repo.Log(&git.LogOptions{
From: commit.Hash,
})
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
commits := []CommitMeta{}
@@ -219,7 +223,7 @@ })
return nil
})
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
data := CommitsData{
@@ -241,14 +245,14 @@ func (s Server) Commit(w http.ResponseWriter, r *http.Request) {
repoName := r.PathValue("name")
repo, err := s.open(repoName)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
hashStr := r.PathValue("hash")
hash := plumbing.NewHash(hashStr)
commit, err := repo.CommitObject(hash)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
var (
@@ -269,7 +273,7 @@ parents = append(parents, string(c.Hash.String()))
return nil
})
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
data := CommitData{
@@ -298,7 +302,7 @@ func (s Server) Blob(w http.ResponseWriter, r *http.Request) {
repoName := r.PathValue("name")
repo, err := s.open(repoName)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
commit, filePath, err := repo.ParseRoute(r.PathValue("path"))
@@ -308,7 +312,7 @@ return
}
tree, err := commit.Tree()
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
entry, err := tree.FindEntry(filePath)
@@ -318,7 +322,7 @@ return
}
content, err := repo.Load(entry)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
var refLabel string
@@ -361,7 +365,7 @@ func (s Server) Tree(w http.ResponseWriter, r *http.Request) {
repoName := r.PathValue("name")
repo, err := s.open(repoName)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
urlPath := r.PathValue("path")
@@ -372,7 +376,7 @@ return
}
head, err := repo.Head()
if err != nil {
- http.Error(w, "Cannot resolve HEAD state", 500)
+ s.error(w, err)
return
}
headRef := head.Name().Short()
@@ -382,7 +386,7 @@ return
}
rootTree, err := commit.Tree()
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
var tree *object.Tree
@@ -394,7 +398,7 @@ return
}
tree, err = repo.TreeObject(treeEntry.Hash)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
} else {
@@ -423,7 +427,7 @@ readmeName = e.Name
var err error
readme, err = repo.Load(&e)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
}
@@ -480,7 +484,7 @@ func (s Server) InfoRefs(w http.ResponseWriter, r *http.Request) {
repoName := r.PathValue("name")
repo, err := git.PlainOpen(repoName)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
storage := repo.Storer
@@ -489,7 +493,7 @@ w.Header().Add("Content-Type", fmt.Sprintf("application/x-%s-advertisement", service))
w.Header().Add("Cache-Control", "no-cache")
w.WriteHeader(http.StatusOK)
if err := transport.AdvertiseReferences(r.Context(), storage, w, service, true); err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
}
@@ -502,7 +506,7 @@ case "gzip":
var err error
bodyReader, err = gzip.NewReader(r.Body)
if err != nil {
- http.Error(w, fmt.Sprintf("Internal Server Error: %v", err), http.StatusInternalServerError)
+ s.error(w, err)
return
}
defer bodyReader.Close()
@@ -513,7 +517,7 @@ w.Header().Add("Content-Type", fmt.Sprintf("application/x-%s-result", r.PathValue("path")))
w.Header().Add("Cache-Control", "no-cache")
w.WriteHeader(http.StatusOK)
if err := core.UploadPack(repoName, bodyReader, w); err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
}
}
@@ -521,22 +525,22 @@ func (s Server) RepoTree(w http.ResponseWriter, r *http.Request) {
repoName := r.PathValue("name")
repo, err := core.Open(repoName)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
ref, err := repo.Head()
if err != nil {
- http.Error(w, "Cannot resolve HEAD", 500)
+ s.error(w, err)
return
}
commit, err := repo.CommitObject(ref.Hash())
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
tree, err := commit.Tree()
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
refName := ref.Name().Short()
@@ -553,7 +557,7 @@ readmeName = e.Name
var err error
readme, err = repo.Load(&e)
if err != nil {
- http.Error(w, err.Error(), 500)
+ s.error(w, err)
return
}
}