Monorepo for Tangled tangled.org
9

Configure Feed

Select the types of activity you want to include in your feed.

appview/repo: detect readme file from appview

Signed-off-by: Seongmin Lee <git@boltless.me>

author
Seongmin Lee
date (May 16, 2026, 7:35 PM +0900) commit e5e5a06d parent 1f5b7ce1 change-id wsuvmxkt
+35 -11
+15 -5
appview/repo/index.go
··· 23 23 "tangled.org/core/appview/db" 24 24 "tangled.org/core/appview/models" 25 25 "tangled.org/core/appview/pages" 26 + "tangled.org/core/appview/pages/markup" 26 27 "tangled.org/core/orm" 27 28 "tangled.org/core/types" 28 29 ··· 317 318 return 318 319 } 319 320 treeResp = resp 321 + 322 + for _, file := range resp.Files { 323 + if markup.IsReadmeFile(file.Name) { 324 + readmeFileName = file.Name 325 + break 326 + } 327 + } 328 + 329 + bytes, err := tangled.GitTempGetBlob(ctx, xrpcc, readmeFileName, ref, repo.RepoDid) 330 + if err != nil { 331 + errs = errors.Join(errs, fmt.Errorf("failed to call git.getBlob: %w", err)) 332 + return 333 + } 334 + readmeContent = string(bytes) 320 335 }) 321 336 322 337 // commits ··· 357 372 } 358 373 files = append(files, niceFile) 359 374 } 360 - } 361 - 362 - if treeResp != nil && treeResp.Readme != nil { 363 - readmeFileName = treeResp.Readme.Filename 364 - readmeContent = treeResp.Readme.Contents 365 375 } 366 376 367 377 result := &types.RepoIndexResponse{
+15 -3
appview/repo/tree.go
··· 4 4 "fmt" 5 5 "net/http" 6 6 "net/url" 7 + "path" 7 8 "strings" 8 9 "time" 9 10 10 11 "tangled.org/core/api/tangled" 11 12 "tangled.org/core/appview/db" 12 13 "tangled.org/core/appview/pages" 14 + "tangled.org/core/appview/pages/markup" 13 15 "tangled.org/core/appview/reporesolver" 14 16 xrpcclient "tangled.org/core/appview/xrpcclient" 15 17 "tangled.org/core/types" ··· 41 43 rp.pages.Error503(w) 42 44 return 43 45 } 46 + var readmeFile *tangled.GitTempGetTree_TreeEntry 44 47 // Convert XRPC response to internal types.RepoTreeResponse 45 48 files := make([]types.NiceTree, len(xrpcResp.Files)) 46 49 for i, xrpcFile := range xrpcResp.Files { ··· 59 62 } 60 63 } 61 64 files[i] = file 65 + if markup.IsReadmeFile(xrpcFile.Name) { 66 + readmeFile = xrpcFile 67 + } 62 68 } 63 69 result := types.RepoTreeResponse{ 64 70 Ref: xrpcResp.Ref, ··· 70 76 if xrpcResp.Dotdot != nil { 71 77 result.DotDot = *xrpcResp.Dotdot 72 78 } 73 - if xrpcResp.Readme != nil { 74 - result.ReadmeFileName = xrpcResp.Readme.Filename 75 - result.Readme = xrpcResp.Readme.Contents 79 + if readmeFile != nil { 80 + bytes, err := tangled.GitTempGetBlob(r.Context(), xrpcc, path.Join(treePath, readmeFile.Name), ref, f.RepoAt().String()) 81 + if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 82 + l.Error("failed to call XRPC git.getBlob", "xrpcerr", xrpcerr, "err", err) 83 + rp.pages.Error503(w) 84 + return 85 + } 86 + result.ReadmeFileName = readmeFile.Name 87 + result.Readme = string(bytes) 76 88 } 77 89 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f) 78 90 // redirects tree paths trying to access a blob; in this case the result.Files is unpopulated,
+5 -3
knotmirror/xrpc/proxy.go
··· 5 5 "errors" 6 6 "fmt" 7 7 "io" 8 + "maps" 8 9 "net/http" 9 10 "net/url" 10 11 "strings" ··· 149 150 } 150 151 151 152 params := make(url.Values) 152 - for k, v := range r.URL.Query() { 153 - params[k] = v 153 + maps.Copy(params, r.URL.Query()) 154 + params.Set("repo", knot.repoIdentifier) 155 + if mirrorNSID == tangled.GitTempGetBlobNSID { 156 + params.Set("raw", "true") 154 157 } 155 - params.Set("repo", knot.repoIdentifier) 156 158 157 159 target := fmt.Sprintf("%s/xrpc/%s?%s", knot.baseURL, knotNSID, params.Encode()) 158 160