package pypihub
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/google/go-github/github"
|
|
)
|
|
|
|
type Client struct {
|
|
config Config
|
|
client *github.Client
|
|
repos []string
|
|
}
|
|
|
|
func NewClient(cfg Config) *Client {
|
|
var t = github.BasicAuthTransport{
|
|
Username: cfg.Username,
|
|
Password: cfg.AccessToken,
|
|
}
|
|
return &Client{
|
|
config: cfg,
|
|
client: github.NewClient(t.Client()),
|
|
repos: cfg.RepoNames,
|
|
}
|
|
}
|
|
|
|
func (c *Client) splitRepoName(r string) (string, string) {
|
|
var p = strings.SplitN(r, "/", 2)
|
|
switch len(p) {
|
|
case 2:
|
|
return p[0], p[1]
|
|
case 1:
|
|
return c.config.Username, p[0]
|
|
default:
|
|
return "", ""
|
|
}
|
|
}
|
|
|
|
func (c *Client) GetRepoAssets(r string) ([]Asset, error) {
|
|
var owner, repo string
|
|
owner, repo = c.splitRepoName(r)
|
|
|
|
var releases []*github.RepositoryRelease
|
|
var err error
|
|
releases, _, err = c.client.Repositories.ListReleases(owner, repo, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var allAssets = make([]Asset, 0)
|
|
for _, rel := range releases {
|
|
var assets []*github.ReleaseAsset
|
|
assets, _, err = c.client.Repositories.ListReleaseAssets(owner, repo, *rel.ID, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, a := range assets {
|
|
allAssets = append(allAssets, Asset{
|
|
ID: *a.ID,
|
|
Name: *a.Name,
|
|
Owner: owner,
|
|
Repo: repo,
|
|
})
|
|
}
|
|
}
|
|
return allAssets, nil
|
|
}
|
|
|
|
func (c *Client) GetAllAssets() ([]Asset, error) {
|
|
var allAssets = make([]Asset, 0)
|
|
for _, r := range c.config.RepoNames {
|
|
var repoAssets = make([]Asset, 0)
|
|
var err error
|
|
repoAssets, err = c.GetRepoAssets(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
allAssets = append(allAssets, repoAssets...)
|
|
}
|
|
|
|
return allAssets, nil
|
|
}
|
|
|
|
func (c *Client) DownloadAsset(a Asset) (io.ReadCloser, error) {
|
|
var rc io.ReadCloser
|
|
var redirect string
|
|
var err error
|
|
rc, redirect, err = c.client.Repositories.DownloadReleaseAsset(a.Owner, a.Repo, a.ID)
|
|
if rc == nil {
|
|
var resp *http.Response
|
|
resp, err = http.Get(redirect)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
rc = resp.Body
|
|
}
|
|
return rc, err
|
|
}
|