···175175 return176176}177177178178+func (s *State) RepoTags(w http.ResponseWriter, r *http.Request) {179179+ repoName, knot, id, err := repoKnotAndId(r)180180+ if err != nil {181181+ log.Println("failed to get repo and knot", err)182182+ return183183+ }184184+185185+ resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/tags", knot, id.DID.String(), repoName))186186+ if err != nil {187187+ log.Println("failed to reach knotserver", err)188188+ return189189+ }190190+191191+ body, err := io.ReadAll(resp.Body)192192+ if err != nil {193193+ log.Fatalf("Error reading response body: %v", err)194194+ return195195+ }196196+197197+ var result types.RepoTagsResponse198198+ err = json.Unmarshal(body, &result)199199+ if err != nil {200200+ log.Println("failed to parse response:", err)201201+ return202202+ }203203+204204+ s.pages.RepoTags(w, pages.RepoTagsParams{205205+ LoggedInUser: s.auth.GetUser(r),206206+ RepoInfo: pages.RepoInfo{207207+ OwnerDid: id.DID.String(),208208+ OwnerHandle: id.Handle.String(),209209+ Name: repoName,210210+ },211211+ RepoTagsResponse: result,212212+ })213213+ return214214+}215215+216216+func (s *State) RepoBranches(w http.ResponseWriter, r *http.Request) {217217+ repoName, knot, id, err := repoKnotAndId(r)218218+ if err != nil {219219+ log.Println("failed to get repo and knot", err)220220+ return221221+ }222222+223223+ resp, err := http.Get(fmt.Sprintf("http://%s/%s/%s/branches", knot, id.DID.String(), repoName))224224+ if err != nil {225225+ log.Println("failed to reach knotserver", err)226226+ return227227+ }228228+229229+ body, err := io.ReadAll(resp.Body)230230+ if err != nil {231231+ log.Fatalf("Error reading response body: %v", err)232232+ return233233+ }234234+235235+ var result types.RepoBranchesResponse236236+ err = json.Unmarshal(body, &result)237237+ if err != nil {238238+ log.Println("failed to parse response:", err)239239+ return240240+ }241241+242242+ s.pages.RepoBranches(w, pages.RepoBranchesParams{243243+ LoggedInUser: s.auth.GetUser(r),244244+ RepoInfo: pages.RepoInfo{245245+ OwnerDid: id.DID.String(),246246+ OwnerHandle: id.Handle.String(),247247+ Name: repoName,248248+ },249249+ RepoBranchesResponse: result,250250+ })251251+ return252252+}253253+178254func repoKnotAndId(r *http.Request) (string, string, identity.Identity, error) {179255 repoName := chi.URLParam(r, "repo")180256 knot, ok := r.Context().Value("knot").(string)
+2
appview/state/state.go
···614614 r.Get("/*", s.RepoTree)615615 })616616 r.Get("/commit/{ref}", s.RepoCommit)617617+ r.Get("/branches", s.RepoBranches)618618+ r.Get("/tags", s.RepoTags)617619618620 // These routes get proxied to the knot619621 r.Get("/info/refs", s.InfoRefs)