this repo has no description
1package xrpc 2 3import ( 4 "encoding/json" 5 "net/http" 6 7 "tangled.sh/tangled.sh/core/knotserver/git" 8 "tangled.sh/tangled.sh/core/types" 9 xrpcerr "tangled.sh/tangled.sh/core/xrpc/errors" 10) 11 12func (x *Xrpc) RepoDiff(w http.ResponseWriter, r *http.Request) { 13 repo := r.URL.Query().Get("repo") 14 repoPath, err := x.parseRepoParam(repo) 15 if err != nil { 16 writeError(w, err.(xrpcerr.XrpcError), http.StatusBadRequest) 17 return 18 } 19 20 ref := r.URL.Query().Get("ref") 21 // ref can be empty (git.Open handles this) 22 23 gr, err := git.Open(repoPath, ref) 24 if err != nil { 25 writeError(w, xrpcerr.NewXrpcError( 26 xrpcerr.WithTag("RefNotFound"), 27 xrpcerr.WithMessage("repository or ref not found"), 28 ), http.StatusNotFound) 29 return 30 } 31 32 diff, err := gr.Diff() 33 if err != nil { 34 x.Logger.Error("getting diff", "error", err.Error()) 35 writeError(w, xrpcerr.NewXrpcError( 36 xrpcerr.WithTag("RefNotFound"), 37 xrpcerr.WithMessage("failed to generate diff"), 38 ), http.StatusInternalServerError) 39 return 40 } 41 42 resp := types.RepoCommitResponse{ 43 Ref: ref, 44 Diff: diff, 45 } 46 47 w.Header().Set("Content-Type", "application/json") 48 if err := json.NewEncoder(w).Encode(resp); err != nil { 49 x.Logger.Error("failed to encode response", "error", err) 50 writeError(w, xrpcerr.NewXrpcError( 51 xrpcerr.WithTag("InternalServerError"), 52 xrpcerr.WithMessage("failed to encode response"), 53 ), http.StatusInternalServerError) 54 return 55 } 56}