From 04e2bc407a5a4243cf7dff60a3ea4cf102a4506e Mon Sep 17 00:00:00 2001 From: Anirudh Oppiliappan Date: Thu, 1 May 2025 19:48:23 +0300 Subject: [PATCH] appview: pages/markup: resolve relative links in markdown --- appview/pages/funcmap.go | 3 +- appview/pages/markup/markdown.go | 15 ++----- appview/pages/pages.go | 15 ++++++- appview/state/middleware.go | 4 +- appview/state/pull.go | 38 ++++++++-------- appview/state/repo.go | 75 +++++++++++++++----------------- appview/state/repo_util.go | 19 +++++++- appview/state/signer.go | 15 ++++++- 8 files changed, 106 insertions(+), 78 deletions(-) diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go index 490b98ab..9024cc7a 100644 --- a/appview/pages/funcmap.go +++ b/appview/pages/funcmap.go @@ -143,7 +143,8 @@ func funcMap() template.FuncMap { return v.Slice(start, end).Interface() }, "markdown": func(text string) template.HTML { - return template.HTML(markup.RenderMarkdown(text)) + rctx := &markup.RenderContext{} + return template.HTML(rctx.RenderMarkdown(text)) }, "isNil": func(t any) bool { // returns false for other "zero" values diff --git a/appview/pages/markup/markdown.go b/appview/pages/markup/markdown.go index 191074d3..6b19bad6 100644 --- a/appview/pages/markup/markdown.go +++ b/appview/pages/markup/markdown.go @@ -19,17 +19,10 @@ type RendererType int const ( // RendererTypeRepoMarkdown is for repository documentation markdown files RendererTypeRepoMarkdown RendererType = iota - // RendererTypeIssueComment is for issue comments - RendererTypeIssueComment - // RendererTypePullComment is for pull request comments - RendererTypePullComment - // RendererTypeDefault is the default renderer with minimal transformations - RendererTypeDefault ) // RenderContext holds the contextual data for rendering markdown. -// It can be initialized empty, and that'll skip any transformations -// and use the default renderer (RendererTypeDefault). +// It can be initialized empty, and that'll skip any transformations. type RenderContext struct { Ref string FullRepoName string @@ -73,9 +66,9 @@ func (a *MarkdownTransformer) Transform(node *ast.Document, reader text.Reader, switch a.rctx.RendererType { case RendererTypeRepoMarkdown: - a.rctx.relativeLinkTransformer(n.(*ast.Link)) - case RendererTypeDefault: - a.rctx.relativeLinkTransformer(n.(*ast.Link)) + if v, ok := n.(*ast.Link); ok { + a.rctx.relativeLinkTransformer(v) + } // more types here like RendererTypeIssue/Pull etc. } diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 2bf3cee0..1d0375d3 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -366,6 +366,7 @@ type RepoInfo struct { Roles RolesInRepo Source *db.Repo SourceHandle string + Ref string DisableFork bool } @@ -478,12 +479,17 @@ func (p *Pages) RepoIndexPage(w io.Writer, params RepoIndexParams) error { return p.executeRepo("repo/empty", w, params) } + rctx := markup.RenderContext{ + Ref: params.RepoInfo.Ref, + FullRepoName: params.RepoInfo.FullName(), + } + if params.ReadmeFileName != "" { var htmlString string ext := filepath.Ext(params.ReadmeFileName) switch ext { case ".md", ".markdown", ".mdown", ".mkdn", ".mkd": - htmlString = markup.RenderMarkdown(params.Readme) + htmlString = rctx.RenderMarkdown(params.Readme) params.Raw = false params.HTMLReadme = template.HTML(bluemonday.UGCPolicy().Sanitize(htmlString)) default: @@ -601,7 +607,12 @@ func (p *Pages) RepoBlob(w io.Writer, params RepoBlobParams) error { if params.ShowRendered { switch markup.GetFormat(params.Path) { case markup.FormatMarkdown: - params.RenderedContents = template.HTML(markup.RenderMarkdown(params.Contents)) + rctx := markup.RenderContext{ + Ref: params.RepoInfo.Ref, + FullRepoName: params.RepoInfo.FullName(), + RendererType: markup.RendererTypeRepoMarkdown, + } + params.RenderedContents = template.HTML(rctx.RenderMarkdown(params.Contents)) } } diff --git a/appview/state/middleware.go b/appview/state/middleware.go index 6bafbe1d..c3c5cdbe 100644 --- a/appview/state/middleware.go +++ b/appview/state/middleware.go @@ -61,7 +61,7 @@ func RepoPermissionMiddleware(s *State, requiredPerm string) middleware.Middlewa http.Error(w, "Forbiden", http.StatusUnauthorized) return } - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { http.Error(w, "malformed url", http.StatusBadRequest) return @@ -148,7 +148,7 @@ func ResolveRepo(s *State) middleware.Middleware { func ResolvePull(s *State) middleware.Middleware { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to fully resolve repo", err) http.Error(w, "invalid repo url", http.StatusNotFound) diff --git a/appview/state/pull.go b/appview/state/pull.go index 128b5585..db6667dc 100644 --- a/appview/state/pull.go +++ b/appview/state/pull.go @@ -30,7 +30,7 @@ func (s *State) PullActions(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -74,7 +74,7 @@ func (s *State) PullActions(w http.ResponseWriter, r *http.Request) { func (s *State) RepoSinglePull(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -251,7 +251,7 @@ func (s *State) resubmitCheck(f *FullyResolvedRepo, pull *db.Pull) pages.Resubmi func (s *State) RepoPullPatch(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -300,7 +300,7 @@ func (s *State) RepoPullPatch(w http.ResponseWriter, r *http.Request) { func (s *State) RepoPullInterdiff(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -408,7 +408,7 @@ func (s *State) RepoPulls(w http.ResponseWriter, r *http.Request) { state = db.PullMerged } - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -462,7 +462,7 @@ func (s *State) RepoPulls(w http.ResponseWriter, r *http.Request) { func (s *State) PullComment(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -569,7 +569,7 @@ func (s *State) PullComment(w http.ResponseWriter, r *http.Request) { func (s *State) NewPull(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -904,7 +904,7 @@ func (s *State) createPullRequest( } func (s *State) ValidatePatch(w http.ResponseWriter, r *http.Request) { - _, err := fullyResolvedRepo(r) + _, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -930,7 +930,7 @@ func (s *State) ValidatePatch(w http.ResponseWriter, r *http.Request) { func (s *State) PatchUploadFragment(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -943,7 +943,7 @@ func (s *State) PatchUploadFragment(w http.ResponseWriter, r *http.Request) { func (s *State) CompareBranchesFragment(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -983,7 +983,7 @@ func (s *State) CompareBranchesFragment(w http.ResponseWriter, r *http.Request) func (s *State) CompareForksFragment(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1004,7 +1004,7 @@ func (s *State) CompareForksFragment(w http.ResponseWriter, r *http.Request) { func (s *State) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1082,7 +1082,7 @@ func (s *State) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Requ func (s *State) ResubmitPull(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1126,7 +1126,7 @@ func (s *State) resubmitPatch(w http.ResponseWriter, r *http.Request) { return } - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1209,7 +1209,7 @@ func (s *State) resubmitBranch(w http.ResponseWriter, r *http.Request) { return } - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1322,7 +1322,7 @@ func (s *State) resubmitFork(w http.ResponseWriter, r *http.Request) { return } - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1470,7 +1470,7 @@ func validateResubmittedPatch(pull *db.Pull, patch string) error { } func (s *State) MergePull(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to resolve repo:", err) s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.") @@ -1535,7 +1535,7 @@ func (s *State) MergePull(w http.ResponseWriter, r *http.Request) { func (s *State) ClosePull(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("malformed middleware") return @@ -1589,7 +1589,7 @@ func (s *State) ClosePull(w http.ResponseWriter, r *http.Request) { func (s *State) ReopenPull(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to resolve repo", err) s.pages.Notice(w, "pull-reopen", "Failed to reopen pull.") diff --git a/appview/state/repo.go b/appview/state/repo.go index 88edeedc..dd0d14db 100644 --- a/appview/state/repo.go +++ b/appview/state/repo.go @@ -37,7 +37,7 @@ import ( func (s *State) RepoIndex(w http.ResponseWriter, r *http.Request) { ref := chi.URLParam(r, "ref") - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to fully resolve repo", err) return @@ -129,7 +129,7 @@ func (s *State) RepoIndex(w http.ResponseWriter, r *http.Request) { } func (s *State) RepoLog(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to fully resolve repo", err) return @@ -210,7 +210,7 @@ func (s *State) RepoLog(w http.ResponseWriter, r *http.Request) { } func (s *State) RepoDescriptionEdit(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) w.WriteHeader(http.StatusBadRequest) @@ -225,7 +225,7 @@ func (s *State) RepoDescriptionEdit(w http.ResponseWriter, r *http.Request) { } func (s *State) RepoDescription(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) w.WriteHeader(http.StatusBadRequest) @@ -304,7 +304,7 @@ func (s *State) RepoDescription(w http.ResponseWriter, r *http.Request) { } func (s *State) RepoCommit(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to fully resolve repo", err) return @@ -350,7 +350,7 @@ func (s *State) RepoCommit(w http.ResponseWriter, r *http.Request) { } func (s *State) RepoTree(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to fully resolve repo", err) return @@ -381,6 +381,13 @@ func (s *State) RepoTree(w http.ResponseWriter, r *http.Request) { return } + // redirects tree paths trying to access a blob; in this case the result.Files is unpopulated, + // so we can safely redirect to the "parent" (which is the same file). + if len(result.Files) == 0 && result.Parent == treePath { + http.Redirect(w, r, fmt.Sprintf("/%s/blob/%s/%s", f.OwnerSlashRepo(), ref, result.Parent), http.StatusFound) + return + } + user := s.auth.GetUser(r) var breadcrumbs [][]string @@ -406,7 +413,7 @@ func (s *State) RepoTree(w http.ResponseWriter, r *http.Request) { } func (s *State) RepoTags(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -447,7 +454,7 @@ func (s *State) RepoTags(w http.ResponseWriter, r *http.Request) { } func (s *State) RepoBranches(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -502,7 +509,7 @@ func (s *State) RepoBranches(w http.ResponseWriter, r *http.Request) { } func (s *State) RepoBlob(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -562,7 +569,7 @@ func (s *State) RepoBlob(w http.ResponseWriter, r *http.Request) { } func (s *State) RepoBlobRaw(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -606,7 +613,7 @@ func (s *State) RepoBlobRaw(w http.ResponseWriter, r *http.Request) { } func (s *State) AddCollaborator(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -697,7 +704,7 @@ func (s *State) AddCollaborator(w http.ResponseWriter, r *http.Request) { func (s *State) DeleteRepo(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -801,7 +808,7 @@ func (s *State) DeleteRepo(w http.ResponseWriter, r *http.Request) { } func (s *State) SetDefaultBranch(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -840,7 +847,7 @@ func (s *State) SetDefaultBranch(w http.ResponseWriter, r *http.Request) { } func (s *State) RepoSettings(w http.ResponseWriter, r *http.Request) { - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -891,27 +898,13 @@ func (s *State) RepoSettings(w http.ResponseWriter, r *http.Request) { } } - resp, err = us.DefaultBranch(f.OwnerDid(), f.RepoName) + defaultBranchResp, err := us.DefaultBranch(f.OwnerDid(), f.RepoName) if err != nil { log.Println("failed to reach knotserver", err) } else { - defer resp.Body.Close() - - body, err := io.ReadAll(resp.Body) - if err != nil { - log.Printf("Error reading response body: %v", err) - } else { - var result types.RepoDefaultBranchResponse - err = json.Unmarshal(body, &result) - if err != nil { - log.Println("failed to parse response:", err) - } else { - defaultBranch = result.Branch - } - } + defaultBranch = defaultBranchResp.Branch } } - s.pages.RepoSettings(w, pages.RepoSettingsParams{ LoggedInUser: user, RepoInfo: f.RepoInfo(s, user), @@ -930,6 +923,7 @@ type FullyResolvedRepo struct { RepoAt syntax.ATURI Description string CreatedAt string + Ref string } func (f *FullyResolvedRepo) OwnerDid() string { @@ -1082,6 +1076,7 @@ func (f *FullyResolvedRepo) RepoInfo(s *State, u *auth.User) pages.RepoInfo { Name: f.RepoName, RepoAt: f.RepoAt, Description: f.Description, + Ref: f.Ref, IsStarred: isStarred, Knot: knot, Roles: RolesInRepo(s, u, f), @@ -1103,7 +1098,7 @@ func (f *FullyResolvedRepo) RepoInfo(s *State, u *auth.User) pages.RepoInfo { func (s *State) RepoSingleIssue(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1157,7 +1152,7 @@ func (s *State) RepoSingleIssue(w http.ResponseWriter, r *http.Request) { func (s *State) CloseIssue(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1229,7 +1224,7 @@ func (s *State) CloseIssue(w http.ResponseWriter, r *http.Request) { func (s *State) ReopenIssue(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1277,7 +1272,7 @@ func (s *State) ReopenIssue(w http.ResponseWriter, r *http.Request) { func (s *State) NewIssueComment(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1356,7 +1351,7 @@ func (s *State) NewIssueComment(w http.ResponseWriter, r *http.Request) { func (s *State) IssueComment(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1415,7 +1410,7 @@ func (s *State) IssueComment(w http.ResponseWriter, r *http.Request) { func (s *State) EditIssueComment(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1540,7 +1535,7 @@ func (s *State) EditIssueComment(w http.ResponseWriter, r *http.Request) { func (s *State) DeleteIssueComment(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1645,7 +1640,7 @@ func (s *State) RepoIssues(w http.ResponseWriter, r *http.Request) { } user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1686,7 +1681,7 @@ func (s *State) RepoIssues(w http.ResponseWriter, r *http.Request) { func (s *State) NewIssue(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Println("failed to get repo and knot", err) return @@ -1768,7 +1763,7 @@ func (s *State) NewIssue(w http.ResponseWriter, r *http.Request) { func (s *State) ForkRepo(w http.ResponseWriter, r *http.Request) { user := s.auth.GetUser(r) - f, err := fullyResolvedRepo(r) + f, err := s.fullyResolvedRepo(r) if err != nil { log.Printf("failed to resolve source repo: %v", err) return diff --git a/appview/state/repo_util.go b/appview/state/repo_util.go index 3ba3403c..20f6478d 100644 --- a/appview/state/repo_util.go +++ b/appview/state/repo_util.go @@ -17,7 +17,7 @@ import ( "tangled.sh/tangled.sh/core/appview/pages" ) -func fullyResolvedRepo(r *http.Request) (*FullyResolvedRepo, error) { +func (s *State) fullyResolvedRepo(r *http.Request) (*FullyResolvedRepo, error) { repoName := chi.URLParam(r, "repo") knot, ok := r.Context().Value("knot").(string) if !ok { @@ -42,6 +42,22 @@ func fullyResolvedRepo(r *http.Request) (*FullyResolvedRepo, error) { return nil, fmt.Errorf("malformed middleware") } + ref := chi.URLParam(r, "ref") + + if ref == "" { + us, err := NewUnsignedClient(knot, s.config.Dev) + if err != nil { + return nil, err + } + + defaultBranch, err := us.DefaultBranch(id.DID.String(), repoName) + if err != nil { + return nil, err + } + + ref = defaultBranch.Branch + } + // pass through values from the middleware description, ok := r.Context().Value("repoDescription").(string) addedAt, ok := r.Context().Value("repoAddedAt").(string) @@ -53,6 +69,7 @@ func fullyResolvedRepo(r *http.Request) (*FullyResolvedRepo, error) { RepoAt: parsedRepoAt, Description: description, CreatedAt: addedAt, + Ref: ref, }, nil } diff --git a/appview/state/signer.go b/appview/state/signer.go index 53469b3a..68abb854 100644 --- a/appview/state/signer.go +++ b/appview/state/signer.go @@ -380,7 +380,7 @@ func (us *UnsignedClient) Branch(ownerDid, repoName, branch string) (*http.Respo return us.client.Do(req) } -func (us *UnsignedClient) DefaultBranch(ownerDid, repoName string) (*http.Response, error) { +func (us *UnsignedClient) DefaultBranch(ownerDid, repoName string) (*types.RepoDefaultBranchResponse, error) { const ( Method = "GET" ) @@ -392,7 +392,18 @@ func (us *UnsignedClient) DefaultBranch(ownerDid, repoName string) (*http.Respon return nil, err } - return us.client.Do(req) + resp, err := us.client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var defaultBranch types.RepoDefaultBranchResponse + if err := json.NewDecoder(resp.Body).Decode(&defaultBranch); err != nil { + return nil, err + } + + return &defaultBranch, nil } func (us *UnsignedClient) Capabilities() (*types.Capabilities, error) { -- 2.51.2