From d759587b58edcebd97de7569c4d841b18b8152b9 Mon Sep 17 00:00:00 2001 From: BrookJeynes Date: Tue, 20 May 2025 21:07:26 +1000 Subject: [PATCH] appview: repo: inject language percentage into repo index --- appview/knotclient/signer.go | 31 +++++++++++++++++++++ appview/pages/pages.go | 7 ++--- appview/state/repo.go | 52 +++++++++++++++++++++--------------- 3 files changed, 65 insertions(+), 25 deletions(-) diff --git a/appview/knotclient/signer.go b/appview/knotclient/signer.go index fbb7eeb..3b976a8 100644 --- a/appview/knotclient/signer.go +++ b/appview/knotclient/signer.go @@ -106,6 +106,37 @@ func (s *SignedClient) NewRepo(did, repoName, defaultBranch string) (*http.Respo return s.client.Do(req) } +func (s *SignedClient) RepoLanguages(ownerDid, source, name, branch string) (*types.RepoLanguageResponse, error) { + const ( + Method = "GET" + ) + endpoint := fmt.Sprintf("/repo/languages/%s", url.PathEscape(branch)) + + body, _ := json.Marshal(map[string]any{ + "did": ownerDid, + "source": source, + "name": name, + }) + + req, err := s.newRequest(Method, endpoint, body) + if err != nil { + return nil, err + } + + resp, err := s.client.Do(req) + if err != nil { + return nil, err + } + + var languagePercentages types.RepoLanguageResponse + if err := json.NewDecoder(resp.Body).Decode(&languagePercentages); err != nil { + log.Printf("failed to decode fork status: %s", err) + return nil, err + } + + return &languagePercentages, nil +} + func (s *SignedClient) RepoForkAheadBehind(ownerDid, source, name, branch, hiddenRef string) (*http.Response, error) { const ( Method = "GET" diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 1f4858a..3fd6625 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -412,9 +412,10 @@ type RepoIndexParams struct { BranchesTrunc []types.Branch ForkInfo *types.ForkInfo types.RepoIndexResponse - HTMLReadme template.HTML - Raw bool - EmailToDidOrHandle map[string]string + HTMLReadme template.HTML + Raw bool + EmailToDidOrHandle map[string]string + LanguagePercentages map[string]float64 } func (p *Pages) RepoIndexPage(w io.Writer, params RepoIndexParams) error { diff --git a/appview/state/repo.go b/appview/state/repo.go index 5555b62..976626c 100644 --- a/appview/state/repo.go +++ b/appview/state/repo.go @@ -124,25 +124,44 @@ func (s *State) RepoIndex(w http.ResponseWriter, r *http.Request) { user := s.oauth.GetUser(r) repoInfo := f.RepoInfo(s, user) + secret, err := db.GetRegistrationKey(s.db, f.Knot) + if err != nil { + log.Printf("failed to get registration key for %s: %s", f.Knot, err) + s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.") + } + + signedClient, err := knotclient.NewSignedClient(f.Knot, secret, s.config.Core.Dev) + if err != nil { + log.Printf("failed to create signed client for %s: %s", f.Knot, err) + return + } + var forkInfo *types.ForkInfo if user != nil && (repoInfo.Roles.IsOwner() || repoInfo.Roles.IsCollaborator()) { - forkInfo, err = getForkInfo(repoInfo, s, f, w, user) + forkInfo, err = getForkInfo(repoInfo, s, f, w, user, signedClient) if err != nil { log.Printf("Failed to fetch fork information: %v", err) return } } + repoLanguages, err := signedClient.RepoLanguages(user.Did, string(f.RepoAt), repoInfo.Name, f.Ref) + if err != nil { + log.Printf("failed to compute language percentages: %s", err) + return + } + s.pages.RepoIndexPage(w, pages.RepoIndexParams{ - LoggedInUser: user, - RepoInfo: repoInfo, - TagMap: tagMap, - RepoIndexResponse: result, - CommitsTrunc: commitsTrunc, - TagsTrunc: tagsTrunc, - ForkInfo: forkInfo, - BranchesTrunc: branchesTrunc, - EmailToDidOrHandle: EmailToDidOrHandle(s, emails), + LoggedInUser: user, + RepoInfo: repoInfo, + TagMap: tagMap, + RepoIndexResponse: result, + CommitsTrunc: commitsTrunc, + TagsTrunc: tagsTrunc, + ForkInfo: forkInfo, + BranchesTrunc: branchesTrunc, + EmailToDidOrHandle: EmailToDidOrHandle(s, emails), + LanguagePercentages: repoLanguages.Languages, }) return } @@ -153,6 +172,7 @@ func getForkInfo( f *FullyResolvedRepo, w http.ResponseWriter, user *oauth.User, + signedClient *knotclient.SignedClient, ) (*types.ForkInfo, error) { if user == nil { return nil, nil @@ -163,12 +183,6 @@ func getForkInfo( Status: types.UpToDate, } - secret, err := db.GetRegistrationKey(s.db, f.Knot) - if err != nil { - log.Printf("failed to get registration key for %s: %s", f.Knot, err) - s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.") - } - if !forkInfo.IsFork { forkInfo.IsFork = false return &forkInfo, nil @@ -206,12 +220,6 @@ func getForkInfo( return &forkInfo, nil } - signedClient, err := knotclient.NewSignedClient(f.Knot, secret, s.config.Core.Dev) - if err != nil { - log.Printf("failed to create signed client for %s: %s", f.Knot, err) - return nil, err - } - newHiddenRefResp, err := signedClient.NewHiddenRef(user.Did, repoInfo.Name, f.Ref, f.Ref) if err != nil || newHiddenRefResp.StatusCode != http.StatusNoContent { log.Printf("failed to update tracking branch: %s", err) -- 2.51.2