diff --git a/appview/repo/index.go b/appview/repo/index.go --- a/appview/repo/index.go +++ b/appview/repo/index.go @@ -23,6 +23,7 @@ "tangled.org/core/appview/commitverify" "tangled.org/core/appview/db" "tangled.org/core/appview/models" "tangled.org/core/appview/pages" + "tangled.org/core/appview/pages/markup" "tangled.org/core/orm" "tangled.org/core/types" @@ -317,6 +318,20 @@ errs = errors.Join(errs, fmt.Errorf("failed to call git.GetTree: %w", err)) return } treeResp = resp + + for _, file := range resp.Files { + if markup.IsReadmeFile(file.Name) { + readmeFileName = file.Name + break + } + } + + bytes, err := tangled.GitTempGetBlob(ctx, xrpcc, readmeFileName, ref, repo.RepoDid) + if err != nil { + errs = errors.Join(errs, fmt.Errorf("failed to call git.getBlob: %w", err)) + return + } + readmeContent = string(bytes) }) // commits @@ -357,11 +372,6 @@ } } files = append(files, niceFile) } - } - - if treeResp != nil && treeResp.Readme != nil { - readmeFileName = treeResp.Readme.Filename - readmeContent = treeResp.Readme.Contents } result := &types.RepoIndexResponse{ diff --git a/appview/repo/tree.go b/appview/repo/tree.go --- a/appview/repo/tree.go +++ b/appview/repo/tree.go @@ -4,12 +4,14 @@ import ( "fmt" "net/http" "net/url" + "path" "strings" "time" "tangled.org/core/api/tangled" "tangled.org/core/appview/db" "tangled.org/core/appview/pages" + "tangled.org/core/appview/pages/markup" "tangled.org/core/appview/reporesolver" xrpcclient "tangled.org/core/appview/xrpcclient" "tangled.org/core/types" @@ -41,6 +43,7 @@ l.Error("failed to call XRPC repo.tree", "xrpcerr", xrpcerr, "err", err) rp.pages.Error503(w) return } + var readmeFile *tangled.GitTempGetTree_TreeEntry // Convert XRPC response to internal types.RepoTreeResponse files := make([]types.NiceTree, len(xrpcResp.Files)) for i, xrpcFile := range xrpcResp.Files { @@ -59,6 +62,9 @@ When: commitWhen, } } files[i] = file + if markup.IsReadmeFile(xrpcFile.Name) { + readmeFile = xrpcFile + } } result := types.RepoTreeResponse{ Ref: xrpcResp.Ref, @@ -70,9 +76,15 @@ } if xrpcResp.Dotdot != nil { result.DotDot = *xrpcResp.Dotdot } - if xrpcResp.Readme != nil { - result.ReadmeFileName = xrpcResp.Readme.Filename - result.Readme = xrpcResp.Readme.Contents + if readmeFile != nil { + bytes, err := tangled.GitTempGetBlob(r.Context(), xrpcc, path.Join(treePath, readmeFile.Name), ref, f.RepoAt().String()) + if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { + l.Error("failed to call XRPC git.getBlob", "xrpcerr", xrpcerr, "err", err) + rp.pages.Error503(w) + return + } + result.ReadmeFileName = readmeFile.Name + result.Readme = string(bytes) } ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f) // redirects tree paths trying to access a blob; in this case the result.Files is unpopulated, diff --git a/knotmirror/xrpc/proxy.go b/knotmirror/xrpc/proxy.go --- a/knotmirror/xrpc/proxy.go +++ b/knotmirror/xrpc/proxy.go @@ -5,6 +5,7 @@ "context" "errors" "fmt" "io" + "maps" "net/http" "net/url" "strings" @@ -149,10 +150,11 @@ return false } params := make(url.Values) - for k, v := range r.URL.Query() { - params[k] = v + maps.Copy(params, r.URL.Query()) + params.Set("repo", knot.repoIdentifier) + if mirrorNSID == tangled.GitTempGetBlobNSID { + params.Set("raw", "true") } - params.Set("repo", knot.repoIdentifier) target := fmt.Sprintf("%s/xrpc/%s?%s", knot.baseURL, knotNSID, params.Encode())