diff --git a/.gitignore b/.gitignore index ef96859..0fd4137 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /dehub +*/git-http-server diff --git a/cmd/git-http-server/main.go b/cmd/git-http-server/main.go index 0430c23..7a842b4 100644 --- a/cmd/git-http-server/main.go +++ b/cmd/git-http-server/main.go @@ -25,6 +25,32 @@ type handler struct { tpl *template.Template } +func (h handler) getTree(r *http.Request) (*object.Tree, int, error) { + rev := plumbing.Revision(r.FormValue("rev")) + if rev == "" { + rev = plumbing.Revision(h.branch) + } + + hashPtr, err := h.repo.ResolveRevision(rev) + if err != nil { + return nil, 404, fmt.Errorf("resolving revision %q: %w", rev, err) + } + hash := *hashPtr // I don't know why ResolveRevision returns a pointer + + commit, err := h.repo.CommitObject(hash) + if err != nil { + return nil, 404, fmt.Errorf("retrieving commit for revision %q (%q): %w", + rev, hash, err) + } + + tree, err := h.repo.TreeObject(commit.TreeHash) + if err != nil { + return nil, 500, fmt.Errorf("fetching tree %q of commit %q: %v", + commit.TreeHash, hash, err) + } + return tree, 0, nil +} + func (h handler) ServeHTTP(rw http.ResponseWriter, r *http.Request) { path := r.URL.Path var mdPath string @@ -42,28 +68,9 @@ func (h handler) ServeHTTP(rw http.ResponseWriter, r *http.Request) { path = strings.TrimPrefix(path, "/") mdPath = strings.TrimPrefix(mdPath, "/") - ref, err := h.repo.Reference(h.branch, true) - if errors.Is(err, plumbing.ErrReferenceNotFound) { - http.Error(rw, "branch does not exist", 404) - return - } else if err != nil { - log.Printf("resolving reference %q: %v", h.branch, err) - http.Error(rw, "internal error", 500) - return - } - - hash := ref.Hash() - commit, err := h.repo.CommitObject(hash) + tree, errStatusCode, err := h.getTree(r) if err != nil { - log.Printf("fetching commit %q: %v", hash, err) - http.Error(rw, "internal error", 500) - return - } - - tree, err := h.repo.TreeObject(commit.TreeHash) - if err != nil { - log.Printf("fetching tree %q of commit %q: %v", commit.TreeHash, hash, err) - http.Error(rw, "internal error", 500) + http.Error(rw, err.Error(), errStatusCode) return }