bidet

commit c88633ca734e83e2c7ebadcc342db9166f8c14e6

tree

parent:
1d4c973b9311fd7523b2414d8464db45ba2907cb

nmyk <nick@nmyk.io>

2026-02-18T07:32:59-05:00

error handling

diff --git a/internal/core/git.go b/internal/core/git.go
index 46aa7a5b796c20158e13b1ac96220343c850e1b1..86f040d0a3e02429556e785b80108a6a81195e9a 100644
--- a/internal/core/git.go
+++ b/internal/core/git.go
@@ -71,9 +71,9 @@ 	Hash    plumbing.Hash
 	RefName string
 }
 
-func (repo *Repo) ParseRoute(route string) (*Commit, string) {
+func (repo *Repo) ParseRoute(route string) (*Commit, string, error) {
 	if route == "" {
-		return nil, ""
+		return nil, "", errors.New("empty route")
 	}
 	candidate := strings.TrimPrefix(route, "/")
 	for {
@@ -85,14 +85,14 @@ 				relPath = strings.TrimPrefix(route[len(candidate):], "/")
 			}
 			refName := ref.Name().Short()
 			commit, _ := repo.resolveCommit(refName)
-			return &Commit{commit, commit.Hash, refName}, relPath
+			return &Commit{commit, commit.Hash, refName}, relPath, nil
 		}
 		commit, err := repo.resolveCommit(candidate)
 		if err == nil { // candidate is a commit hash
 			if len(candidate) < len(route) {
 				relPath = strings.TrimPrefix(route[len(candidate):], "/")
 			}
-			return &Commit{commit, commit.Hash, ""}, relPath
+			return &Commit{commit, commit.Hash, ""}, relPath, nil
 		}
 		parent := path.Dir(candidate)
 		if parent == "." || parent == candidate {
@@ -100,7 +100,7 @@ 			break
 		}
 		candidate = parent
 	}
-	return nil, ""
+	return nil, "", errors.New("no commit found")
 }
 
 func (repo *Repo) resolveCommit(name string) (*object.Commit, error) {
diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go
index 6d25a5f2c88f707f0b5339e5f48ad4abeeb5c9f6..bc68e8daebbdbc647bc623ad4e73a74d5425c099 100644
--- a/internal/handlers/handlers.go
+++ b/internal/handlers/handlers.go
@@ -127,6 +127,7 @@ 	}
 	branchIter, err := repo.Branches()
 	if err != nil {
 		http.Error(w, err.Error(), 500)
+		return
 	}
 	var branches []BranchMeta
 	err = branchIter.ForEach(func(ref *plumbing.Reference) error {
@@ -135,10 +136,12 @@ 		return nil
 	})
 	if err != nil {
 		http.Error(w, err.Error(), 500)
+		return
 	}
 	tagIter, err := repo.Tags()
 	if err != nil {
 		http.Error(w, err.Error(), 500)
+		return
 	}
 	var tags []TagMeta
 	err = tagIter.ForEach(func(ref *plumbing.Reference) error {
@@ -147,6 +150,7 @@ 		return nil
 	})
 	if err != nil {
 		http.Error(w, err.Error(), 500)
+		return
 	}
 	refType := r.PathValue("type")
 	if !slices.Contains([]string{"branches", "tags"}, refType) {
@@ -181,12 +185,17 @@ 	if err != nil {
 		http.Error(w, err.Error(), 500)
 		return
 	}
-	commit, _ := repo.ParseRoute(r.PathValue("path"))
+	commit, _, err := repo.ParseRoute(r.PathValue("path"))
+	if err != nil {
+		http.NotFound(w, nil)
+		return
+	}
 	iter, err := repo.Log(&git.LogOptions{
 		From: commit.Hash,
 	})
 	if err != nil {
 		http.Error(w, err.Error(), 500)
+		return
 	}
 	commits := []CommitMeta{}
 	err = iter.ForEach(func(c *object.Commit) error {
@@ -200,6 +209,7 @@ 		return nil
 	})
 	if err != nil {
 		http.Error(w, err.Error(), 500)
+		return
 	}
 	data := CommitsData{
 		Repo:    repoName,
@@ -249,6 +259,7 @@ 		return nil
 	})
 	if err != nil {
 		http.Error(w, err.Error(), 500)
+		return
 	}
 	data := CommitData{
 		CommitMeta: CommitMeta{
@@ -279,7 +290,11 @@ 	if err != nil {
 		http.Error(w, err.Error(), 500)
 		return
 	}
-	commit, filePath := repo.ParseRoute(r.PathValue("path"))
+	commit, filePath, err := repo.ParseRoute(r.PathValue("path"))
+	if err != nil {
+		http.NotFound(w, nil)
+		return
+	}
 	tree, err := commit.Tree()
 	if err != nil {
 		http.Error(w, err.Error(), 500)
@@ -293,6 +308,7 @@ 	}
 	content, err := repo.Load(entry)
 	if err != nil {
 		http.Error(w, err.Error(), 500)
+		return
 	}
 	var refLabel string
 	if commit.RefName != "" {
@@ -338,10 +354,15 @@ 		http.Error(w, err.Error(), 500)
 		return
 	}
 	urlPath := r.PathValue("path")
-	commit, treePath := repo.ParseRoute(urlPath)
+	commit, treePath, err := repo.ParseRoute(urlPath)
+	if err != nil {
+		http.NotFound(w, nil)
+		return
+	}
 	head, err := repo.Head()
 	if err != nil {
 		http.Error(w, "Cannot resolve HEAD state", 500)
+		return
 	}
 	headRef := head.Name().Short()
 	if commit.RefName == headRef && treePath == "" {
@@ -363,6 +384,7 @@ 		}
 		tree, err = repo.TreeObject(treeEntry.Hash)
 		if err != nil {
 			http.Error(w, err.Error(), 500)
+			return
 		}
 	} else {
 		tree = rootTree
@@ -391,6 +413,7 @@ 			var err error
 			readme, err = repo.Load(&e)
 			if err != nil {
 				http.Error(w, err.Error(), 500)
+				return
 			}
 		}
 		entries = append(entries, em)
@@ -453,6 +476,7 @@ 			var err error
 			readme, err = repo.Load(&e)
 			if err != nil {
 				http.Error(w, err.Error(), 500)
+				return
 			}
 		}
 		entries = append(entries, em)