Something went wrong. Try again.
Monorepo for Tangled
Something went wrong. Try again.
2.1 kB · 85 lines
Go
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586package xrpc
import ( "net/http" "net/url" "time"
"tangled.org/core/api/tangled" "tangled.org/core/knotserver/git" xrpcerr "tangled.org/core/xrpc/errors")
func (x *Xrpc) RepoBranch(w http.ResponseWriter, r *http.Request) { repo := r.URL.Query().Get("repo") repoPath, err := x.parseRepoParam(repo) if err != nil { writeError(w, err.(xrpcerr.XrpcError), http.StatusBadRequest) return }
name := r.URL.Query().Get("name") if name == "" { writeError(w, xrpcerr.NewXrpcError( xrpcerr.WithTag("InvalidRequest"), xrpcerr.WithMessage("missing name parameter"), ), http.StatusBadRequest) return }
branchName, _ := url.PathUnescape(name)
gr, err := git.PlainOpen(repoPath) if err != nil { writeError(w, xrpcerr.RepoNotFoundError, http.StatusNoContent) return }
ref, err := gr.Branch(branchName) if err != nil { x.Logger.Error("getting branch", "error", err.Error()) writeError(w, xrpcerr.NewXrpcError( xrpcerr.WithTag("BranchNotFound"), xrpcerr.WithMessage("branch not found"), ), http.StatusNotFound) return }
commit, err := gr.Commit(ref.Hash()) if err != nil { x.Logger.Error("getting commit object", "error", err.Error()) writeError(w, xrpcerr.NewXrpcError( xrpcerr.WithTag("BranchNotFound"), xrpcerr.WithMessage("failed to get commit object"), ), http.StatusInternalServerError) return }
defaultBranch, err := gr.FindMainBranch() isDefault := false if err != nil { x.Logger.Error("getting default branch", "error", err.Error()) } else if defaultBranch == branchName { isDefault = true }
response := tangled.RepoBranch_Output{ Name: ref.Name().Short(), Hash: ref.Hash().String(), ShortHash: &[]string{ref.Hash().String()[:7]}[0], When: commit.Author.When.Format(time.RFC3339), IsDefault: &isDefault, }
if commit.Message != "" { response.Message = &commit.Message }
response.Author = &tangled.RepoBranch_Signature{ Name: commit.Author.Name, Email: commit.Author.Email, When: commit.Author.When.Format(time.RFC3339), }
x.writeJson(w, response)}