blob: 09f0e5bd185011fadcf992d026d145874429e94f [file] [log] [blame]
package metrics
import (
"context"
"fmt"
"github.com/bazelbuild/continuous-integration/metrics/data"
"github.com/google/go-github/github"
"golang.org/x/oauth2"
)
type ReleaseDownloads struct {
org string
repo string
client *github.Client
minSizeBytes int
columns []Column
}
func (rd *ReleaseDownloads) Name() string {
return "release_downloads"
}
func (rd *ReleaseDownloads) Columns() []Column {
return rd.columns
}
func (rd *ReleaseDownloads) Collect() (data.DataSet, error) {
all_releases, err := rd.getReleases()
if err != nil {
return nil, fmt.Errorf("Failed to get releases for %s/%s: %v", rd.org, rd.repo, err)
}
result := data.CreateDataSet(GetColumnNames(rd.columns))
for _, release := range all_releases {
for _, asset := range release.Assets {
if *asset.Size >= rd.minSizeBytes {
result.AddRow(*release.TagName, *asset.Name, *asset.DownloadCount)
}
}
}
return result, nil
}
func (rd *ReleaseDownloads) getReleases() ([]*github.RepositoryRelease, error) {
all_releases := make([]*github.RepositoryRelease, 0)
ctx := context.Background()
opt := github.ListOptions{Page: 1, PerPage: 100}
currPage := 1
lastPage := 1
for currPage <= lastPage {
releases, response, err := rd.client.Repositories.ListReleases(ctx, rd.org, rd.repo, &opt)
if err != nil {
return nil, fmt.Errorf("Could not get page %d: %v", currPage, err)
}
all_releases = append(all_releases, releases...)
currPage += 1
opt.Page = currPage
lastPage = response.LastPage
}
return all_releases, nil
}
// CREATE TABLE release_downloads (release_name VARCHAR(255), artifact VARCHAR(255), downloads INT, PRIMARY KEY(release_name, artifact));
func CreateReleaseDownloads(org string, repo string, token string, minSizeBytes int) *ReleaseDownloads {
ctx := context.Background()
ts := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: token},
)
tc := oauth2.NewClient(ctx, ts)
client := github.NewClient(tc)
columns := []Column{Column{"release_name", true}, Column{"artifact", true}, Column{"downloads", false}}
return &ReleaseDownloads{org: org, repo: repo, client: client, minSizeBytes: minSizeBytes, columns: columns}
}