A vibe coded tangled fork which supports pijul.
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.RepoAt().String())
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 LoggedInUser: user,
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 fail := func(msg string, err error) {
56 l.Error(msg, "err", err)
57 rp.pages.Notice(w, noticeId, msg)
58 }
59 branch := r.FormValue("branch")
60 if branch == "" {
61 fail("No branch provided.", nil)
62 return
63 }
64 client, err := rp.oauth.ServiceClient(
65 r,
66 oauth.WithService(f.Knot),
67 oauth.WithLxm(tangled.RepoDeleteBranchNSID),
68 oauth.WithDev(rp.config.Core.Dev),
69 )
70 if err != nil {
71 fail("Failed to connect to knotserver", nil)
72 return
73 }
74 err = tangled.RepoDeleteBranch(
75 r.Context(),
76 client,
77 &tangled.RepoDeleteBranch_Input{
78 Branch: branch,
79 Repo: f.RepoAt().String(),
80 },
81 )
82 if err := xrpcclient.HandleXrpcErr(err); err != nil {
83 fail(fmt.Sprintf("Failed to delete branch: %s", err), err)
84 return
85 }
86 l.Error("deleted branch from knot", "branch", branch, "repo", f.RepoAt())
87 rp.pages.HxRefresh(w)
88}