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)