diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go index 582ee0bb..10cac92b 100644 --- a/appview/pages/funcmap.go +++ b/appview/pages/funcmap.go @@ -29,6 +29,9 @@ func (p *Pages) funcMap() template.FuncMap { "split": func(s string) []string { return strings.Split(s, "\n") }, + "contains": func(s string, target string) bool { + return strings.Contains(s, target) + }, "resolve": func(s string) string { identity, err := p.resolver.ResolveIdent(context.Background(), s) diff --git a/appview/pages/templates/repo/index.html b/appview/pages/templates/repo/index.html index 72c483d5..98549e1e 100644 --- a/appview/pages/templates/repo/index.html +++ b/appview/pages/templates/repo/index.html @@ -64,7 +64,6 @@ {{ end }} - {{ define "branchSelector" }}
diff --git a/appview/pages/templates/repo/needsUpgrade.html b/appview/pages/templates/repo/needsUpgrade.html index c84d9cab..f905967b 100644 --- a/appview/pages/templates/repo/needsUpgrade.html +++ b/appview/pages/templates/repo/needsUpgrade.html @@ -1,24 +1,60 @@ {{ define "title" }}{{ .RepoInfo.FullName }}{{ end }} - {{ define "extrameta" }} {{ template "repo/fragments/meta" . }} {{ template "repo/fragments/og" (dict "RepoInfo" .RepoInfo) }} {{ end }} - {{ define "repoContent" }}
-
-
- {{ if .LoggedInUser }} -

- Your knot needs an upgrade. This repository is currently unavailable to users. -

+
+
+ +
+ {{ $files := + (list + "src" + "docs" + "config" + "lib" + "index.html" + "log.html" + "needsUpgrade.html" + "new.html" + "tags.html" + "tree.html") + }} + {{ range $files }} + + {{ if (contains . ".") }} + {{ i "file" "size-4 inline-flex" }} {{ else }} -

- The knot hosting this repository needs an upgrade. This repository is currently unavailable. -

+ {{ i "folder" "size-4 inline-flex fill-current" }} {{ end }} -
+ + {{ . }} + + {{ end }} +
+ +
+
+
+ {{ i "triangle-alert" "size-5 inline-flex items-center align-middle" }} + The knot hosting this repository needs an upgrade. This repository is currently unavailable. +
+
{{ end }} diff --git a/appview/repo/index.go b/appview/repo/index.go index bbc00113..40a9ff5b 100644 --- a/appview/repo/index.go +++ b/appview/repo/index.go @@ -47,19 +47,25 @@ func (rp *Repo) RepoIndex(w http.ResponseWriter, r *http.Request) { Host: host, } - var needsKnotUpgrade bool + user := rp.oauth.GetUser(r) + repoInfo := f.RepoInfo(user) + // Build index response from multiple XRPC calls result, err := rp.buildIndexResponse(r.Context(), xrpcc, f, ref) - if err != nil { - if errors.Is(err, xrpcclient.ErrXrpcUnsupported) { + if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { + if errors.Is(xrpcerr, xrpcclient.ErrXrpcUnsupported) { log.Println("failed to call XRPC repo.index", err) - needsKnotUpgrade = true + rp.pages.RepoIndexPage(w, pages.RepoIndexParams{ + LoggedInUser: user, + NeedsKnotUpgrade: true, + RepoInfo: repoInfo, + }) + return + } else { + rp.pages.Error503(w) + log.Println("failed to build index response", err) return } - - rp.pages.Error503(w) - log.Println("failed to build index response", err) - return } tagMap := make(map[string][]string) @@ -119,9 +125,6 @@ func (rp *Repo) RepoIndex(w http.ResponseWriter, r *http.Request) { log.Println(err) } - user := rp.oauth.GetUser(r) - repoInfo := f.RepoInfo(user) - // TODO: a bit dirty languageInfo, err := rp.getLanguageInfo(r.Context(), f, xrpcc, result.Ref, ref == "") if err != nil { @@ -141,7 +144,6 @@ func (rp *Repo) RepoIndex(w http.ResponseWriter, r *http.Request) { rp.pages.RepoIndexPage(w, pages.RepoIndexParams{ LoggedInUser: user, - NeedsKnotUpgrade: needsKnotUpgrade, RepoInfo: repoInfo, TagMap: tagMap, RepoIndexResponse: *result, @@ -243,10 +245,6 @@ func (rp *Repo) buildIndexResponse(ctx context.Context, xrpcc *indigoxrpc.Client // first get branches to determine the ref if not specified branchesBytes, err := tangled.RepoBranches(ctx, xrpcc, "", 0, repo) if err != nil { - if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { - log.Println("failed to call XRPC repo.branches", xrpcerr) - return nil, xrpcerr - } return nil, err } @@ -278,8 +276,7 @@ func (rp *Repo) buildIndexResponse(ctx context.Context, xrpcc *indigoxrpc.Client // now run the remaining queries in parallel var wg sync.WaitGroup - var mu sync.Mutex - var errs []error + var errs error var ( tagsResp types.RepoTagsResponse @@ -295,21 +292,12 @@ func (rp *Repo) buildIndexResponse(ctx context.Context, xrpcc *indigoxrpc.Client defer wg.Done() tagsBytes, err := tangled.RepoTags(ctx, xrpcc, "", 0, repo) if err != nil { - mu.Lock() - if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { - log.Println("failed to call XRPC repo.tags", xrpcerr) - errs = append(errs, xrpcerr) - } else { - errs = append(errs, err) - } - mu.Unlock() + errs = errors.Join(errs, err) return } if err := json.Unmarshal(tagsBytes, &tagsResp); err != nil { - mu.Lock() - errs = append(errs, err) - mu.Unlock() + errs = errors.Join(errs, err) } }() @@ -319,14 +307,7 @@ func (rp *Repo) buildIndexResponse(ctx context.Context, xrpcc *indigoxrpc.Client defer wg.Done() resp, err := tangled.RepoTree(ctx, xrpcc, "", ref, repo) if err != nil { - mu.Lock() - if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { - log.Println("failed to call XRPC repo.tree", xrpcerr) - errs = append(errs, xrpcerr) - } else { - errs = append(errs, err) - } - mu.Unlock() + errs = errors.Join(errs, err) return } treeResp = resp @@ -338,21 +319,12 @@ func (rp *Repo) buildIndexResponse(ctx context.Context, xrpcc *indigoxrpc.Client defer wg.Done() logBytes, err := tangled.RepoLog(ctx, xrpcc, "", 50, "", ref, repo) if err != nil { - mu.Lock() - if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { - log.Println("failed to call XRPC repo.log", xrpcerr) - errs = append(errs, xrpcerr) - } else { - errs = append(errs, err) - } - mu.Unlock() + errs = errors.Join(errs, err) return } if err := json.Unmarshal(logBytes, &logResp); err != nil { - mu.Lock() - errs = append(errs, err) - mu.Unlock() + errs = errors.Join(errs, err) } }() @@ -378,8 +350,8 @@ func (rp *Repo) buildIndexResponse(ctx context.Context, xrpcc *indigoxrpc.Client wg.Wait() - if len(errs) > 0 { - return nil, errs[0] // return first error + if errs != nil { + return nil, errs } var files []types.NiceTree