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}