Monorepo for Tangled
tangled.org
1package repo
2
3import (
4 "encoding/json"
5 "fmt"
6 "net/http"
7
8 "tangled.org/core/api/tangled"
9 "tangled.org/core/appview/oauth"
10 "tangled.org/core/appview/pages"
11 xrpcclient "tangled.org/core/appview/xrpcclient"
12 "tangled.org/core/types"
13
14 indigoxrpc "github.com/bluesky-social/indigo/xrpc"
15)
16
17func (rp *Repo) Branches(w http.ResponseWriter, r *http.Request) {
18 l := rp.logger.With("handler", "RepoBranches")
19 f, err := rp.repoResolver.Resolve(r)
20 if err != nil {
21 l.Error("failed to get repo and knot", "err", err)
22 return
23 }
24 xrpcc := &indigoxrpc.Client{Host: rp.config.KnotMirror.Url}
25
26 xrpcBytes, err := tangled.GitTempListBranches(r.Context(), xrpcc, "", 0, f.RepoDid)
27 if err != nil {
28 l.Error("failed to call XRPC repo.branches", "err", err)
29 rp.pages.Error503(w)
30 return
31 }
32 var result types.RepoBranchesResponse
33 if err := json.Unmarshal(xrpcBytes, &result); err != nil {
34 l.Error("failed to decode XRPC response", "err", err)
35 rp.pages.Error503(w)
36 return
37 }
38 sortBranches(result.Branches)
39 user := rp.oauth.GetMultiAccountUser(r)
40 rp.pages.RepoBranches(w, pages.RepoBranchesParams{
41 BaseParams: pages.BaseParamsFromContext(r.Context()),
42 RepoInfo: rp.repoResolver.GetRepoInfo(r, user),
43 RepoBranchesResponse: result,
44 })
45}
46
47func (rp *Repo) DeleteBranch(w http.ResponseWriter, r *http.Request) {
48 l := rp.logger.With("handler", "DeleteBranch")
49 f, err := rp.repoResolver.Resolve(r)
50 if err != nil {
51 l.Error("failed to get repo and knot", "err", err)
52 return
53 }
54 noticeId := "delete-branch-error"
55 branch := r.FormValue("branch")
56 if branch == "" {
57 rp.pages.Notice(w, noticeId, "No branch provided.")
58 return
59 }
60 client, err := rp.oauth.ServiceClient(
61 r,
62 oauth.WithService(f.Knot),
63 oauth.WithLxm(tangled.RepoDeleteBranchNSID),
64 oauth.WithDev(rp.config.Core.Dev),
65 )
66 if err != nil {
67 l.Warn("Failed to connect to knotserver", "err", err)
68 rp.pages.Notice(w, noticeId, "Failed to connect to knotserver")
69 return
70 }
71 err = tangled.RepoDeleteBranch(
72 r.Context(),
73 client,
74 &tangled.RepoDeleteBranch_Input{
75 Branch: branch,
76 Repo: f.RepoAt().String(),
77 },
78 )
79 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
80 l.Error("Failed to delete branch", "xrpcerr", xrpcerr, "err", err)
81 rp.pages.Notice(w, noticeId, fmt.Sprintf("Failed to delete branch: %s", xrpcerr))
82 return
83 }
84 l.Error("deleted branch from knot", "branch", branch, "repo", f.RepoAt())
85 rp.pages.HxRefresh(w)
86}