···1919const (2020 // RendererTypeRepoMarkdown is for repository documentation markdown files2121 RendererTypeRepoMarkdown RendererType = iota2222- // RendererTypeIssueComment is for issue comments2323- RendererTypeIssueComment2424- // RendererTypePullComment is for pull request comments2525- RendererTypePullComment2626- // RendererTypeDefault is the default renderer with minimal transformations2727- RendererTypeDefault2822)29233024// RenderContext holds the contextual data for rendering markdown.3131-// It can be initialized empty, and that'll skip any transformations3232-// and use the default renderer (RendererTypeDefault).2525+// It can be initialized empty, and that'll skip any transformations.3326type RenderContext struct {3427 Ref string3528 FullRepoName string···66736774 switch a.rctx.RendererType {6875 case RendererTypeRepoMarkdown:6969- a.rctx.relativeLinkTransformer(n.(*ast.Link))7070- case RendererTypeDefault:7171- a.rctx.relativeLinkTransformer(n.(*ast.Link))7676+ if v, ok := n.(*ast.Link); ok {7777+ a.rctx.relativeLinkTransformer(v)7878+ }7279 // more types here like RendererTypeIssue/Pull etc.7380 }7481
···3030 switch r.Method {3131 case http.MethodGet:3232 user := s.auth.GetUser(r)3333- f, err := fullyResolvedRepo(r)3333+ f, err := s.fullyResolvedRepo(r)3434 if err != nil {3535 log.Println("failed to get repo and knot", err)3636 return···74747575func (s *State) RepoSinglePull(w http.ResponseWriter, r *http.Request) {7676 user := s.auth.GetUser(r)7777- f, err := fullyResolvedRepo(r)7777+ f, err := s.fullyResolvedRepo(r)7878 if err != nil {7979 log.Println("failed to get repo and knot", err)8080 return···251251252252func (s *State) RepoPullPatch(w http.ResponseWriter, r *http.Request) {253253 user := s.auth.GetUser(r)254254- f, err := fullyResolvedRepo(r)254254+ f, err := s.fullyResolvedRepo(r)255255 if err != nil {256256 log.Println("failed to get repo and knot", err)257257 return···300300func (s *State) RepoPullInterdiff(w http.ResponseWriter, r *http.Request) {301301 user := s.auth.GetUser(r)302302303303- f, err := fullyResolvedRepo(r)303303+ f, err := s.fullyResolvedRepo(r)304304 if err != nil {305305 log.Println("failed to get repo and knot", err)306306 return···408408 state = db.PullMerged409409 }410410411411- f, err := fullyResolvedRepo(r)411411+ f, err := s.fullyResolvedRepo(r)412412 if err != nil {413413 log.Println("failed to get repo and knot", err)414414 return···462462463463func (s *State) PullComment(w http.ResponseWriter, r *http.Request) {464464 user := s.auth.GetUser(r)465465- f, err := fullyResolvedRepo(r)465465+ f, err := s.fullyResolvedRepo(r)466466 if err != nil {467467 log.Println("failed to get repo and knot", err)468468 return···569569570570func (s *State) NewPull(w http.ResponseWriter, r *http.Request) {571571 user := s.auth.GetUser(r)572572- f, err := fullyResolvedRepo(r)572572+ f, err := s.fullyResolvedRepo(r)573573 if err != nil {574574 log.Println("failed to get repo and knot", err)575575 return···904904}905905906906func (s *State) ValidatePatch(w http.ResponseWriter, r *http.Request) {907907- _, err := fullyResolvedRepo(r)907907+ _, err := s.fullyResolvedRepo(r)908908 if err != nil {909909 log.Println("failed to get repo and knot", err)910910 return···930930931931func (s *State) PatchUploadFragment(w http.ResponseWriter, r *http.Request) {932932 user := s.auth.GetUser(r)933933- f, err := fullyResolvedRepo(r)933933+ f, err := s.fullyResolvedRepo(r)934934 if err != nil {935935 log.Println("failed to get repo and knot", err)936936 return···943943944944func (s *State) CompareBranchesFragment(w http.ResponseWriter, r *http.Request) {945945 user := s.auth.GetUser(r)946946- f, err := fullyResolvedRepo(r)946946+ f, err := s.fullyResolvedRepo(r)947947 if err != nil {948948 log.Println("failed to get repo and knot", err)949949 return···983983984984func (s *State) CompareForksFragment(w http.ResponseWriter, r *http.Request) {985985 user := s.auth.GetUser(r)986986- f, err := fullyResolvedRepo(r)986986+ f, err := s.fullyResolvedRepo(r)987987 if err != nil {988988 log.Println("failed to get repo and knot", err)989989 return···10041004func (s *State) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Request) {10051005 user := s.auth.GetUser(r)1006100610071007- f, err := fullyResolvedRepo(r)10071007+ f, err := s.fullyResolvedRepo(r)10081008 if err != nil {10091009 log.Println("failed to get repo and knot", err)10101010 return···1082108210831083func (s *State) ResubmitPull(w http.ResponseWriter, r *http.Request) {10841084 user := s.auth.GetUser(r)10851085- f, err := fullyResolvedRepo(r)10851085+ f, err := s.fullyResolvedRepo(r)10861086 if err != nil {10871087 log.Println("failed to get repo and knot", err)10881088 return···11261126 return11271127 }1128112811291129- f, err := fullyResolvedRepo(r)11291129+ f, err := s.fullyResolvedRepo(r)11301130 if err != nil {11311131 log.Println("failed to get repo and knot", err)11321132 return···12091209 return12101210 }1211121112121212- f, err := fullyResolvedRepo(r)12121212+ f, err := s.fullyResolvedRepo(r)12131213 if err != nil {12141214 log.Println("failed to get repo and knot", err)12151215 return···13221322 return13231323 }1324132413251325- f, err := fullyResolvedRepo(r)13251325+ f, err := s.fullyResolvedRepo(r)13261326 if err != nil {13271327 log.Println("failed to get repo and knot", err)13281328 return···14701470}1471147114721472func (s *State) MergePull(w http.ResponseWriter, r *http.Request) {14731473- f, err := fullyResolvedRepo(r)14731473+ f, err := s.fullyResolvedRepo(r)14741474 if err != nil {14751475 log.Println("failed to resolve repo:", err)14761476 s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")···15351535func (s *State) ClosePull(w http.ResponseWriter, r *http.Request) {15361536 user := s.auth.GetUser(r)1537153715381538- f, err := fullyResolvedRepo(r)15381538+ f, err := s.fullyResolvedRepo(r)15391539 if err != nil {15401540 log.Println("malformed middleware")15411541 return···15891589func (s *State) ReopenPull(w http.ResponseWriter, r *http.Request) {15901590 user := s.auth.GetUser(r)1591159115921592- f, err := fullyResolvedRepo(r)15921592+ f, err := s.fullyResolvedRepo(r)15931593 if err != nil {15941594 log.Println("failed to resolve repo", err)15951595 s.pages.Notice(w, "pull-reopen", "Failed to reopen pull.")
+35-40
appview/state/repo.go
···37373838func (s *State) RepoIndex(w http.ResponseWriter, r *http.Request) {3939 ref := chi.URLParam(r, "ref")4040- f, err := fullyResolvedRepo(r)4040+ f, err := s.fullyResolvedRepo(r)4141 if err != nil {4242 log.Println("failed to fully resolve repo", err)4343 return···129129}130130131131func (s *State) RepoLog(w http.ResponseWriter, r *http.Request) {132132- f, err := fullyResolvedRepo(r)132132+ f, err := s.fullyResolvedRepo(r)133133 if err != nil {134134 log.Println("failed to fully resolve repo", err)135135 return···210210}211211212212func (s *State) RepoDescriptionEdit(w http.ResponseWriter, r *http.Request) {213213- f, err := fullyResolvedRepo(r)213213+ f, err := s.fullyResolvedRepo(r)214214 if err != nil {215215 log.Println("failed to get repo and knot", err)216216 w.WriteHeader(http.StatusBadRequest)···225225}226226227227func (s *State) RepoDescription(w http.ResponseWriter, r *http.Request) {228228- f, err := fullyResolvedRepo(r)228228+ f, err := s.fullyResolvedRepo(r)229229 if err != nil {230230 log.Println("failed to get repo and knot", err)231231 w.WriteHeader(http.StatusBadRequest)···304304}305305306306func (s *State) RepoCommit(w http.ResponseWriter, r *http.Request) {307307- f, err := fullyResolvedRepo(r)307307+ f, err := s.fullyResolvedRepo(r)308308 if err != nil {309309 log.Println("failed to fully resolve repo", err)310310 return···350350}351351352352func (s *State) RepoTree(w http.ResponseWriter, r *http.Request) {353353- f, err := fullyResolvedRepo(r)353353+ f, err := s.fullyResolvedRepo(r)354354 if err != nil {355355 log.Println("failed to fully resolve repo", err)356356 return···381381 return382382 }383383384384+ // redirects tree paths trying to access a blob; in this case the result.Files is unpopulated,385385+ // so we can safely redirect to the "parent" (which is the same file).386386+ if len(result.Files) == 0 && result.Parent == treePath {387387+ http.Redirect(w, r, fmt.Sprintf("/%s/blob/%s/%s", f.OwnerSlashRepo(), ref, result.Parent), http.StatusFound)388388+ return389389+ }390390+384391 user := s.auth.GetUser(r)385392386393 var breadcrumbs [][]string···413406}414407415408func (s *State) RepoTags(w http.ResponseWriter, r *http.Request) {416416- f, err := fullyResolvedRepo(r)409409+ f, err := s.fullyResolvedRepo(r)417410 if err != nil {418411 log.Println("failed to get repo and knot", err)419412 return···454447}455448456449func (s *State) RepoBranches(w http.ResponseWriter, r *http.Request) {457457- f, err := fullyResolvedRepo(r)450450+ f, err := s.fullyResolvedRepo(r)458451 if err != nil {459452 log.Println("failed to get repo and knot", err)460453 return···509502}510503511504func (s *State) RepoBlob(w http.ResponseWriter, r *http.Request) {512512- f, err := fullyResolvedRepo(r)505505+ f, err := s.fullyResolvedRepo(r)513506 if err != nil {514507 log.Println("failed to get repo and knot", err)515508 return···569562}570563571564func (s *State) RepoBlobRaw(w http.ResponseWriter, r *http.Request) {572572- f, err := fullyResolvedRepo(r)565565+ f, err := s.fullyResolvedRepo(r)573566 if err != nil {574567 log.Println("failed to get repo and knot", err)575568 return···613606}614607615608func (s *State) AddCollaborator(w http.ResponseWriter, r *http.Request) {616616- f, err := fullyResolvedRepo(r)609609+ f, err := s.fullyResolvedRepo(r)617610 if err != nil {618611 log.Println("failed to get repo and knot", err)619612 return···704697func (s *State) DeleteRepo(w http.ResponseWriter, r *http.Request) {705698 user := s.auth.GetUser(r)706699707707- f, err := fullyResolvedRepo(r)700700+ f, err := s.fullyResolvedRepo(r)708701 if err != nil {709702 log.Println("failed to get repo and knot", err)710703 return···808801}809802810803func (s *State) SetDefaultBranch(w http.ResponseWriter, r *http.Request) {811811- f, err := fullyResolvedRepo(r)804804+ f, err := s.fullyResolvedRepo(r)812805 if err != nil {813806 log.Println("failed to get repo and knot", err)814807 return···847840}848841849842func (s *State) RepoSettings(w http.ResponseWriter, r *http.Request) {850850- f, err := fullyResolvedRepo(r)843843+ f, err := s.fullyResolvedRepo(r)851844 if err != nil {852845 log.Println("failed to get repo and knot", err)853846 return···898891 }899892 }900893901901- resp, err = us.DefaultBranch(f.OwnerDid(), f.RepoName)894894+ defaultBranchResp, err := us.DefaultBranch(f.OwnerDid(), f.RepoName)902895 if err != nil {903896 log.Println("failed to reach knotserver", err)904897 } else {905905- defer resp.Body.Close()906906-907907- body, err := io.ReadAll(resp.Body)908908- if err != nil {909909- log.Printf("Error reading response body: %v", err)910910- } else {911911- var result types.RepoDefaultBranchResponse912912- err = json.Unmarshal(body, &result)913913- if err != nil {914914- log.Println("failed to parse response:", err)915915- } else {916916- defaultBranch = result.Branch917917- }918918- }898898+ defaultBranch = defaultBranchResp.Branch919899 }920900 }921921-922901 s.pages.RepoSettings(w, pages.RepoSettingsParams{923902 LoggedInUser: user,924903 RepoInfo: f.RepoInfo(s, user),···923930 RepoAt syntax.ATURI924931 Description string925932 CreatedAt string933933+ Ref string926934}927935928936func (f *FullyResolvedRepo) OwnerDid() string {···10761082 Name: f.RepoName,10771083 RepoAt: f.RepoAt,10781084 Description: f.Description,10851085+ Ref: f.Ref,10791086 IsStarred: isStarred,10801087 Knot: knot,10811088 Roles: RolesInRepo(s, u, f),···1098110310991104func (s *State) RepoSingleIssue(w http.ResponseWriter, r *http.Request) {11001105 user := s.auth.GetUser(r)11011101- f, err := fullyResolvedRepo(r)11061106+ f, err := s.fullyResolvedRepo(r)11021107 if err != nil {11031108 log.Println("failed to get repo and knot", err)11041109 return···1152115711531158func (s *State) CloseIssue(w http.ResponseWriter, r *http.Request) {11541159 user := s.auth.GetUser(r)11551155- f, err := fullyResolvedRepo(r)11601160+ f, err := s.fullyResolvedRepo(r)11561161 if err != nil {11571162 log.Println("failed to get repo and knot", err)11581163 return···1224122912251230func (s *State) ReopenIssue(w http.ResponseWriter, r *http.Request) {12261231 user := s.auth.GetUser(r)12271227- f, err := fullyResolvedRepo(r)12321232+ f, err := s.fullyResolvedRepo(r)12281233 if err != nil {12291234 log.Println("failed to get repo and knot", err)12301235 return···1272127712731278func (s *State) NewIssueComment(w http.ResponseWriter, r *http.Request) {12741279 user := s.auth.GetUser(r)12751275- f, err := fullyResolvedRepo(r)12801280+ f, err := s.fullyResolvedRepo(r)12761281 if err != nil {12771282 log.Println("failed to get repo and knot", err)12781283 return···1351135613521357func (s *State) IssueComment(w http.ResponseWriter, r *http.Request) {13531358 user := s.auth.GetUser(r)13541354- f, err := fullyResolvedRepo(r)13591359+ f, err := s.fullyResolvedRepo(r)13551360 if err != nil {13561361 log.Println("failed to get repo and knot", err)13571362 return···1410141514111416func (s *State) EditIssueComment(w http.ResponseWriter, r *http.Request) {14121417 user := s.auth.GetUser(r)14131413- f, err := fullyResolvedRepo(r)14181418+ f, err := s.fullyResolvedRepo(r)14141419 if err != nil {14151420 log.Println("failed to get repo and knot", err)14161421 return···1535154015361541func (s *State) DeleteIssueComment(w http.ResponseWriter, r *http.Request) {15371542 user := s.auth.GetUser(r)15381538- f, err := fullyResolvedRepo(r)15431543+ f, err := s.fullyResolvedRepo(r)15391544 if err != nil {15401545 log.Println("failed to get repo and knot", err)15411546 return···16401645 }1641164616421647 user := s.auth.GetUser(r)16431643- f, err := fullyResolvedRepo(r)16481648+ f, err := s.fullyResolvedRepo(r)16441649 if err != nil {16451650 log.Println("failed to get repo and knot", err)16461651 return···16811686func (s *State) NewIssue(w http.ResponseWriter, r *http.Request) {16821687 user := s.auth.GetUser(r)1683168816841684- f, err := fullyResolvedRepo(r)16891689+ f, err := s.fullyResolvedRepo(r)16851690 if err != nil {16861691 log.Println("failed to get repo and knot", err)16871692 return···1763176817641769func (s *State) ForkRepo(w http.ResponseWriter, r *http.Request) {17651770 user := s.auth.GetUser(r)17661766- f, err := fullyResolvedRepo(r)17711771+ f, err := s.fullyResolvedRepo(r)17671772 if err != nil {17681773 log.Printf("failed to resolve source repo: %v", err)17691774 return
+18-1
appview/state/repo_util.go
···1717 "tangled.sh/tangled.sh/core/appview/pages"1818)19192020-func fullyResolvedRepo(r *http.Request) (*FullyResolvedRepo, error) {2020+func (s *State) fullyResolvedRepo(r *http.Request) (*FullyResolvedRepo, error) {2121 repoName := chi.URLParam(r, "repo")2222 knot, ok := r.Context().Value("knot").(string)2323 if !ok {···4242 return nil, fmt.Errorf("malformed middleware")4343 }44444545+ ref := chi.URLParam(r, "ref")4646+4747+ if ref == "" {4848+ us, err := NewUnsignedClient(knot, s.config.Dev)4949+ if err != nil {5050+ return nil, err5151+ }5252+5353+ defaultBranch, err := us.DefaultBranch(id.DID.String(), repoName)5454+ if err != nil {5555+ return nil, err5656+ }5757+5858+ ref = defaultBranch.Branch5959+ }6060+4561 // pass through values from the middleware4662 description, ok := r.Context().Value("repoDescription").(string)4763 addedAt, ok := r.Context().Value("repoAddedAt").(string)···6953 RepoAt: parsedRepoAt,7054 Description: description,7155 CreatedAt: addedAt,5656+ Ref: ref,7257 }, nil7358}7459