bidet

commit c62aec9222632225087f3c10021fb97c7505efc2

tree

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
 			}
 		}