forked from tangled.org/core
this repo has no description

appview/index: improve repo-index for outdated knots

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

oppi.li 7f516681 665c097b

verified
Changed files
+73 -63
appview
pages
repo
+3
appview/pages/funcmap.go
···
"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)
-1
appview/pages/templates/repo/index.html
···
</details>
{{ end }}
-
{{ define "branchSelector" }}
<div class="flex gap-2 items-center justify-between w-full">
<div class="flex gap-2 items-center">
+48 -12
appview/pages/templates/repo/needsUpgrade.html
···
{{ define "title" }}{{ .RepoInfo.FullName }}{{ end }}
-
{{ define "extrameta" }}
{{ template "repo/fragments/meta" . }}
{{ template "repo/fragments/og" (dict "RepoInfo" .RepoInfo) }}
{{ end }}
-
{{ define "repoContent" }}
<main>
-
<div class="w-full h-full flex place-content-center {{ if .LoggedInUser }} bg-yellow-100 dark:bg-yellow-900 {{ end }}">
-
<div class="py-6 w-fit flex flex-col gap-4 text-center">
-
{{ if .LoggedInUser }}
-
<p class=" text-yellow-800 dark:text-yellow-200 text-center">
-
Your knot needs an upgrade. This repository is currently unavailable to users.
-
</p>
+
<div class="relative w-full h-96 flex items-center justify-center">
+
<div class="w-full h-full grid grid-cols-1 md:grid-cols-2 gap-4 md:divide-x divide-gray-300 dark:divide-gray-600 text-gray-300 dark:text-gray-600">
+
<!-- mimic the repo view here, placeholders are LLM generated -->
+
<div id="file-list" class="flex flex-col gap-2 col-span-1 w-full h-full p-4 items-start justify-start text-left">
+
{{ $files :=
+
(list
+
"src"
+
"docs"
+
"config"
+
"lib"
+
"index.html"
+
"log.html"
+
"needsUpgrade.html"
+
"new.html"
+
"tags.html"
+
"tree.html")
+
}}
+
{{ range $files }}
+
<span>
+
{{ if (contains . ".") }}
+
{{ i "file" "size-4 inline-flex" }}
{{ else }}
-
<p class="text-gray-400 dark:text-gray-500 py-6 text-center">
-
The knot hosting this repository needs an upgrade. This repository is currently unavailable.
-
</p>
+
{{ i "folder" "size-4 inline-flex fill-current" }}
{{ end }}
-
</div>
+
+
{{ . }}
+
</span>
+
{{ end }}
+
</div>
+
<div id="commit-list" class="hidden md:flex md:flex-col gap-4 col-span-1 w-full h-full p-4 items-start justify-start text-left">
+
{{ $commits :=
+
(list
+
"Fix authentication bug in login flow"
+
"Add new dashboard widgets for metrics"
+
"Implement real-time notifications system")
+
}}
+
{{ range $commits }}
+
<div class="flex flex-col">
+
<span>{{ . }}</span>
+
<span class="text-xs">{{ . }}</span>
+
</div>
+
{{ end }}
+
</div>
</div>
+
<div class="absolute inset-0 flex items-center justify-center py-12 text-red-500 dark:text-red-400 backdrop-blur">
+
<div class="text-center">
+
{{ i "triangle-alert" "size-5 inline-flex items-center align-middle" }}
+
The knot hosting this repository needs an upgrade. This repository is currently unavailable.
+
</div>
+
</div>
+
</div>
</main>
{{ end }}
+22 -50
appview/repo/index.go
···
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)
···
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 {
···
rp.pages.RepoIndexPage(w, pages.RepoIndexParams{
LoggedInUser: user,
-
NeedsKnotUpgrade: needsKnotUpgrade,
RepoInfo: repoInfo,
TagMap: tagMap,
RepoIndexResponse: *result,
···
// 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
}
···
// 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
···
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)
}
}()
···
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
···
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)
}
}()
···
wg.Wait()
-
if len(errs) > 0 {
-
return nil, errs[0] // return first error
+
if errs != nil {
+
return nil, errs
}
var files []types.NiceTree