A vibe coded tangled fork which supports pijul.
at sl/knotmirror 88 lines 2.3 kB view raw
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}