ref: fe901b81191860b60e6fcb29f8ebf87baef2ee79
dir: /releaser/github.go/
package releaser
import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
)
var (
	gitHubCommitsApi      = "https://api.github.com/repos/spf13/hugo/commits/%s"
	gitHubRepoApi         = "https://api.github.com/repos/spf13/hugo"
	gitHubContributorsApi = "https://api.github.com/repos/spf13/hugo/contributors"
)
type gitHubCommit struct {
	Author  gitHubAuthor `json:"author"`
	HtmlURL string       `json:"html_url"`
}
type gitHubAuthor struct {
	ID        int    `json:"id"`
	Login     string `json:"login"`
	HtmlURL   string `json:"html_url"`
	AvatarURL string `json:"avatar_url"`
}
type gitHubRepo struct {
	ID           int    `json:"id"`
	Name         string `json:"name"`
	Description  string `json:"description"`
	HtmlURL      string `json:"html_url"`
	Stars        int    `json:"stargazers_count"`
	Contributors []gitHubContributor
}
type gitHubContributor struct {
	ID            int    `json:"id"`
	Login         string `json:"login"`
	HtmlURL       string `json:"html_url"`
	Contributions int    `json:"contributions"`
}
func fetchCommit(ref string) (gitHubCommit, error) {
	var commit gitHubCommit
	u := fmt.Sprintf(gitHubCommitsApi, ref)
	req, err := http.NewRequest("GET", u, nil)
	if err != nil {
		return commit, err
	}
	err = doGitHubRequest(req, &commit)
	return commit, err
}
func fetchRepo() (gitHubRepo, error) {
	var repo gitHubRepo
	req, err := http.NewRequest("GET", gitHubRepoApi, nil)
	if err != nil {
		return repo, err
	}
	err = doGitHubRequest(req, &repo)
	if err != nil {
		return repo, err
	}
	var contributors []gitHubContributor
	page := 0
	for {
		page++
		var currPage []gitHubContributor
		url := fmt.Sprintf(gitHubContributorsApi+"?page=%d", page)
		req, err = http.NewRequest("GET", url, nil)
		if err != nil {
			return repo, err
		}
		err = doGitHubRequest(req, &currPage)
		if err != nil {
			return repo, err
		}
		if len(currPage) == 0 {
			break
		}
		contributors = append(contributors, currPage...)
	}
	repo.Contributors = contributors
	return repo, err
}
func doGitHubRequest(req *http.Request, v interface{}) error {
	addGitHubToken(req)
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()
	if isError(resp) {
		b, _ := ioutil.ReadAll(resp.Body)
		return fmt.Errorf("GitHub lookup failed: %s", string(b))
	}
	return json.NewDecoder(resp.Body).Decode(v)
}
func isError(resp *http.Response) bool {
	return resp.StatusCode < 200 || resp.StatusCode > 299
}
func addGitHubToken(req *http.Request) {
	gitHubToken := os.Getenv("GITHUB_TOKEN")
	if gitHubToken != "" {
		req.Header.Add("Authorization", "token "+gitHubToken)
	}
}