forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

appview: repo: inject language percentage into repo index

Changed files
+65 -25
appview
knotclient
pages
state
+31
appview/knotclient/signer.go
···
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"
+4 -3
appview/pages/pages.go
···
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 {
+30 -22
appview/state/repo.go
···
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
}
···
f *FullyResolvedRepo,
w http.ResponseWriter,
user *oauth.User,
+
signedClient *knotclient.SignedClient,
) (*types.ForkInfo, error) {
if user == nil {
return nil, nil
···
forkInfo := types.ForkInfo{
IsFork: repoInfo.Source != nil,
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.Status = types.MissingBranch
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)