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.RefNotFoundError, http.StatusNotFound)
26 return
27 }
28
29 diff, err := gr.Diff()
30 if err != nil {
31 x.Logger.Error("getting diff", "error", err.Error())
32 writeError(w, xrpcerr.RefNotFoundError, http.StatusInternalServerError)
33 return
34 }
35
36 resp := types.RepoCommitResponse{
37 Ref: ref,
38 Diff: diff,
39 }
40
41 w.Header().Set("Content-Type", "application/json")
42 if err := json.NewEncoder(w).Encode(resp); err != nil {
43 x.Logger.Error("failed to encode response", "error", err)
44 writeError(w, xrpcerr.NewXrpcError(
45 xrpcerr.WithTag("InternalServerError"),
46 xrpcerr.WithMessage("failed to encode response"),
47 ), http.StatusInternalServerError)
48 return
49 }
50}