+3
appview/pages/funcmap.go
+3
appview/pages/funcmap.go
-1
appview/pages/templates/repo/index.html
-1
appview/pages/templates/repo/index.html
+48
-12
appview/pages/templates/repo/needsUpgrade.html
+48
-12
appview/pages/templates/repo/needsUpgrade.html
···
1
{{ define "title" }}{{ .RepoInfo.FullName }}{{ end }}
2
-
3
{{ define "extrameta" }}
4
{{ template "repo/fragments/meta" . }}
5
{{ template "repo/fragments/og" (dict "RepoInfo" .RepoInfo) }}
6
{{ end }}
7
-
8
{{ define "repoContent" }}
9
<main>
10
-
<div class="w-full h-full flex place-content-center {{ if .LoggedInUser }} bg-yellow-100 dark:bg-yellow-900 {{ end }}">
11
-
<div class="py-6 w-fit flex flex-col gap-4 text-center">
12
-
{{ if .LoggedInUser }}
13
-
<p class=" text-yellow-800 dark:text-yellow-200 text-center">
14
-
Your knot needs an upgrade. This repository is currently unavailable to users.
15
-
</p>
16
{{ else }}
17
-
<p class="text-gray-400 dark:text-gray-500 py-6 text-center">
18
-
The knot hosting this repository needs an upgrade. This repository is currently unavailable.
19
-
</p>
20
{{ end }}
21
-
</div>
22
</div>
23
</main>
24
{{ end }}
···
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="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">
10
+
<!-- mimic the repo view here, placeholders are LLM generated -->
11
+
<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">
12
+
{{ $files :=
13
+
(list
14
+
"src"
15
+
"docs"
16
+
"config"
17
+
"lib"
18
+
"index.html"
19
+
"log.html"
20
+
"needsUpgrade.html"
21
+
"new.html"
22
+
"tags.html"
23
+
"tree.html")
24
+
}}
25
+
{{ range $files }}
26
+
<span>
27
+
{{ if (contains . ".") }}
28
+
{{ i "file" "size-4 inline-flex" }}
29
{{ else }}
30
+
{{ i "folder" "size-4 inline-flex fill-current" }}
31
{{ end }}
32
+
33
+
{{ . }}
34
+
</span>
35
+
{{ end }}
36
+
</div>
37
+
<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">
38
+
{{ $commits :=
39
+
(list
40
+
"Fix authentication bug in login flow"
41
+
"Add new dashboard widgets for metrics"
42
+
"Implement real-time notifications system")
43
+
}}
44
+
{{ range $commits }}
45
+
<div class="flex flex-col">
46
+
<span>{{ . }}</span>
47
+
<span class="text-xs">{{ . }}</span>
48
+
</div>
49
+
{{ end }}
50
+
</div>
51
</div>
52
+
<div class="absolute inset-0 flex items-center justify-center py-12 text-red-500 dark:text-red-400 backdrop-blur">
53
+
<div class="text-center">
54
+
{{ i "triangle-alert" "size-5 inline-flex items-center align-middle" }}
55
+
The knot hosting this repository needs an upgrade. This repository is currently unavailable.
56
+
</div>
57
+
</div>
58
+
</div>
59
</main>
60
{{ end }}
+22
-50
appview/repo/index.go
+22
-50
appview/repo/index.go
···
47
Host: host,
48
}
49
50
-
var needsKnotUpgrade bool
51
// Build index response from multiple XRPC calls
52
result, err := rp.buildIndexResponse(r.Context(), xrpcc, f, ref)
53
-
if err != nil {
54
-
if errors.Is(err, xrpcclient.ErrXrpcUnsupported) {
55
log.Println("failed to call XRPC repo.index", err)
56
-
needsKnotUpgrade = true
57
return
58
}
59
-
60
-
rp.pages.Error503(w)
61
-
log.Println("failed to build index response", err)
62
-
return
63
}
64
65
tagMap := make(map[string][]string)
···
119
log.Println(err)
120
}
121
122
-
user := rp.oauth.GetUser(r)
123
-
repoInfo := f.RepoInfo(user)
124
-
125
// TODO: a bit dirty
126
languageInfo, err := rp.getLanguageInfo(r.Context(), f, xrpcc, result.Ref, ref == "")
127
if err != nil {
···
141
142
rp.pages.RepoIndexPage(w, pages.RepoIndexParams{
143
LoggedInUser: user,
144
-
NeedsKnotUpgrade: needsKnotUpgrade,
145
RepoInfo: repoInfo,
146
TagMap: tagMap,
147
RepoIndexResponse: *result,
···
243
// first get branches to determine the ref if not specified
244
branchesBytes, err := tangled.RepoBranches(ctx, xrpcc, "", 0, repo)
245
if err != nil {
246
-
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
247
-
log.Println("failed to call XRPC repo.branches", xrpcerr)
248
-
return nil, xrpcerr
249
-
}
250
return nil, err
251
}
252
···
278
279
// now run the remaining queries in parallel
280
var wg sync.WaitGroup
281
-
var mu sync.Mutex
282
-
var errs []error
283
284
var (
285
tagsResp types.RepoTagsResponse
···
295
defer wg.Done()
296
tagsBytes, err := tangled.RepoTags(ctx, xrpcc, "", 0, repo)
297
if err != nil {
298
-
mu.Lock()
299
-
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
300
-
log.Println("failed to call XRPC repo.tags", xrpcerr)
301
-
errs = append(errs, xrpcerr)
302
-
} else {
303
-
errs = append(errs, err)
304
-
}
305
-
mu.Unlock()
306
return
307
}
308
309
if err := json.Unmarshal(tagsBytes, &tagsResp); err != nil {
310
-
mu.Lock()
311
-
errs = append(errs, err)
312
-
mu.Unlock()
313
}
314
}()
315
···
319
defer wg.Done()
320
resp, err := tangled.RepoTree(ctx, xrpcc, "", ref, repo)
321
if err != nil {
322
-
mu.Lock()
323
-
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
324
-
log.Println("failed to call XRPC repo.tree", xrpcerr)
325
-
errs = append(errs, xrpcerr)
326
-
} else {
327
-
errs = append(errs, err)
328
-
}
329
-
mu.Unlock()
330
return
331
}
332
treeResp = resp
···
338
defer wg.Done()
339
logBytes, err := tangled.RepoLog(ctx, xrpcc, "", 50, "", ref, repo)
340
if err != nil {
341
-
mu.Lock()
342
-
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
343
-
log.Println("failed to call XRPC repo.log", xrpcerr)
344
-
errs = append(errs, xrpcerr)
345
-
} else {
346
-
errs = append(errs, err)
347
-
}
348
-
mu.Unlock()
349
return
350
}
351
352
if err := json.Unmarshal(logBytes, &logResp); err != nil {
353
-
mu.Lock()
354
-
errs = append(errs, err)
355
-
mu.Unlock()
356
}
357
}()
358
···
378
379
wg.Wait()
380
381
-
if len(errs) > 0 {
382
-
return nil, errs[0] // return first error
383
}
384
385
var files []types.NiceTree
···
47
Host: host,
48
}
49
50
+
user := rp.oauth.GetUser(r)
51
+
repoInfo := f.RepoInfo(user)
52
+
53
// Build index response from multiple XRPC calls
54
result, err := rp.buildIndexResponse(r.Context(), xrpcc, f, ref)
55
+
if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil {
56
+
if errors.Is(xrpcerr, xrpcclient.ErrXrpcUnsupported) {
57
log.Println("failed to call XRPC repo.index", err)
58
+
rp.pages.RepoIndexPage(w, pages.RepoIndexParams{
59
+
LoggedInUser: user,
60
+
NeedsKnotUpgrade: true,
61
+
RepoInfo: repoInfo,
62
+
})
63
+
return
64
+
} else {
65
+
rp.pages.Error503(w)
66
+
log.Println("failed to build index response", err)
67
return
68
}
69
}
70
71
tagMap := make(map[string][]string)
···
125
log.Println(err)
126
}
127
128
// TODO: a bit dirty
129
languageInfo, err := rp.getLanguageInfo(r.Context(), f, xrpcc, result.Ref, ref == "")
130
if err != nil {
···
144
145
rp.pages.RepoIndexPage(w, pages.RepoIndexParams{
146
LoggedInUser: user,
147
RepoInfo: repoInfo,
148
TagMap: tagMap,
149
RepoIndexResponse: *result,
···
245
// first get branches to determine the ref if not specified
246
branchesBytes, err := tangled.RepoBranches(ctx, xrpcc, "", 0, repo)
247
if err != nil {
248
return nil, err
249
}
250
···
276
277
// now run the remaining queries in parallel
278
var wg sync.WaitGroup
279
+
var errs error
280
281
var (
282
tagsResp types.RepoTagsResponse
···
292
defer wg.Done()
293
tagsBytes, err := tangled.RepoTags(ctx, xrpcc, "", 0, repo)
294
if err != nil {
295
+
errs = errors.Join(errs, err)
296
return
297
}
298
299
if err := json.Unmarshal(tagsBytes, &tagsResp); err != nil {
300
+
errs = errors.Join(errs, err)
301
}
302
}()
303
···
307
defer wg.Done()
308
resp, err := tangled.RepoTree(ctx, xrpcc, "", ref, repo)
309
if err != nil {
310
+
errs = errors.Join(errs, err)
311
return
312
}
313
treeResp = resp
···
319
defer wg.Done()
320
logBytes, err := tangled.RepoLog(ctx, xrpcc, "", 50, "", ref, repo)
321
if err != nil {
322
+
errs = errors.Join(errs, err)
323
return
324
}
325
326
if err := json.Unmarshal(logBytes, &logResp); err != nil {
327
+
errs = errors.Join(errs, err)
328
}
329
}()
330
···
350
351
wg.Wait()
352
353
+
if errs != nil {
354
+
return nil, errs
355
}
356
357
var files []types.NiceTree