Monorepo for Tangled tangled.org

appview/repo: allow viewing unreachable repos

instead of showing a 503 indiscriminately, we now indicate that the knot
is unreachable and display a warning. the user is still free to browse
issues and pulls.

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li 15a45ae1 7615cf12

verified
+39 -22
+5
appview/pages/pages.go
··· 697 697 Languages []types.RepoLanguageDetails 698 698 Pipelines map[string]models.Pipeline 699 699 NeedsKnotUpgrade bool 700 + KnotUnreachable bool 700 701 types.RepoIndexResponse 701 702 } 702 703 ··· 708 709 709 710 if params.NeedsKnotUpgrade { 710 711 return p.executeRepo("repo/needsUpgrade", w, params) 712 + } 713 + 714 + if params.KnotUnreachable { 715 + return p.executeRepo("repo/knotUnreachable", w, params) 711 716 } 712 717 713 718 p.rctx.RepoInfo = params.RepoInfo
+18
appview/pages/templates/repo/knotUnreachable.html
··· 1 + {{ define "title" }}{{ .RepoInfo.FullName }}{{ end }} 2 + {{ define "extrameta" }} 3 + {{ template "repo/fragments/meta" . }} 4 + {{ template "repo/fragments/og" (dict "RepoInfo" .RepoInfo) }} 5 + {{ end }} 6 + {{ define "repoContent" }} 7 + <main> 8 + <div class="relative w-full h-96 flex items-center justify-center"> 9 + <div class="absolute inset-0 flex items-center justify-center py-12 text-red-500 dark:text-red-400 backdrop-blur"> 10 + <div class="text-center"> 11 + {{ i "triangle-alert" "size-5 inline-flex items-center align-middle" }} 12 + The knot hosting this repository is unreachable. 13 + </div> 14 + </div> 15 + </div> 16 + </main> 17 + {{ end }} 18 +
+14 -16
appview/repo/index.go
··· 64 64 RepoInfo: rp.repoResolver.GetRepoInfo(r, user), 65 65 }) 66 66 return 67 + } else { 68 + l.Error("failed to build index response", "err", err) 69 + rp.pages.RepoIndexPage(w, pages.RepoIndexParams{ 70 + LoggedInUser: user, 71 + KnotUnreachable: true, 72 + RepoInfo: rp.repoResolver.GetRepoInfo(r, user), 73 + }) 74 + return 67 75 } 68 - 69 - rp.pages.Error503(w) 70 - l.Error("failed to build index response", "err", err) 71 - return 72 76 } 73 77 74 78 tagMap := make(map[string][]string) ··· 299 303 ) 300 304 301 305 // tags 302 - wg.Add(1) 303 - go func() { 304 - defer wg.Done() 306 + wg.Go(func() { 305 307 tagsBytes, err := tangled.RepoTags(ctx, xrpcc, "", 0, didSlashRepo) 306 308 if err != nil { 307 309 errs = errors.Join(errs, fmt.Errorf("failed to call repoTags: %w", err)) ··· 311 313 if err := json.Unmarshal(tagsBytes, &tagsResp); err != nil { 312 314 errs = errors.Join(errs, fmt.Errorf("failed to unmarshal repoTags: %w", err)) 313 315 } 314 - }() 316 + }) 315 317 316 318 // tree/files 317 - wg.Add(1) 318 - go func() { 319 - defer wg.Done() 319 + wg.Go(func() { 320 320 resp, err := tangled.RepoTree(ctx, xrpcc, "", ref, didSlashRepo) 321 321 if err != nil { 322 322 errs = errors.Join(errs, fmt.Errorf("failed to call repoTree: %w", err)) 323 323 return 324 324 } 325 325 treeResp = resp 326 - }() 326 + }) 327 327 328 328 // commits 329 - wg.Add(1) 330 - go func() { 331 - defer wg.Done() 329 + wg.Go(func() { 332 330 logBytes, err := tangled.RepoLog(ctx, xrpcc, "", 50, "", ref, didSlashRepo) 333 331 if err != nil { 334 332 errs = errors.Join(errs, fmt.Errorf("failed to call repoLog: %w", err)) ··· 338 336 if err := json.Unmarshal(logBytes, &logResp); err != nil { 339 337 errs = errors.Join(errs, fmt.Errorf("failed to unmarshal repoLog: %w", err)) 340 338 } 341 - }() 339 + }) 342 340 343 341 wg.Wait() 344 342
+2 -6
appview/repo/settings.go
··· 190 190 191 191 repo := fmt.Sprintf("%s/%s", f.Did, f.Name) 192 192 xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) 193 + var result types.RepoBranchesResponse 193 194 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 194 195 l.Error("failed to call XRPC repo.branches", "err", xrpcerr) 195 - rp.pages.Error503(w) 196 - return 197 - } 198 - 199 - var result types.RepoBranchesResponse 200 - if err := json.Unmarshal(xrpcBytes, &result); err != nil { 196 + } else if err := json.Unmarshal(xrpcBytes, &result); err != nil { 201 197 l.Error("failed to decode XRPC response", "err", err) 202 198 rp.pages.Error503(w) 203 199 return