mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
Output from 'dep status': PROJECT CONSTRAINT VERSION REVISION LATEST PKGS USED cloud.google.com/go v0.23.0 v0.23.0 0fd7230 v0.23.0 1 github.com/briandowns/openweathermap ^0.11.0 0.11 1b87579 0.11 1 github.com/gdamore/encoding branch master branch master b23993c b23993c 1 github.com/gdamore/tcell ^1.0.0 v1.0.0 061d51a v1.0.0 2 github.com/go-test/deep ^1.0.1 v1.0.1 6592d9c v1.0.1 1 github.com/golang/protobuf v1.1.0 v1.1.0 b4deda0 v1.1.0 1 github.com/google/go-github branch master branch master 2ae5df7 2ae5df7 1 github.com/google/go-querystring branch master branch master 53e6ce1 53e6ce1 1 github.com/jessevdk/go-flags ^1.4.0 v1.4.0 c6ca198 v1.4.0 1 github.com/lucasb-eyer/go-colorful v1.0 v1.0 345fbb3 v1.0 1 github.com/mattn/go-runewidth v0.0.2 v0.0.2 9e777a8 v0.0.2 1 github.com/olebedev/config branch master branch master 9a10d05 9a10d05 1 github.com/radovskyb/watcher ^1.0.2 v1.0.2 6145e14 v1.0.2 1 github.com/rivo/tview branch master branch master 71ecf1f 71ecf1f 1 github.com/yfronto/newrelic branch master branch master f7fa0c6 f7fa0c6 1 golang.org/x/net branch master branch master 1e49130 1e49130 2 golang.org/x/oauth2 branch master branch master 1e0a3fa 1e0a3fa 5 golang.org/x/text v0.3.0 v0.3.0 f21a4df v0.3.0 5 google.golang.org/api branch master branch master 00e3bb8 00e3bb8 4 google.golang.org/appengine v1.0.0 v1.0.0 150dc57 v1.0.0 10 gopkg.in/yaml.v2 ^2.2.1 v2.2.1 5420a8b v2.2.1 1 See https://golang.github.io/dep/docs/daily-dep.html
188 lines
6.4 KiB
Go
188 lines
6.4 KiB
Go
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
//
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
/*
|
|
Package github provides a client for using the GitHub API.
|
|
|
|
Usage:
|
|
|
|
import "github.com/google/go-github/github"
|
|
|
|
Construct a new GitHub client, then use the various services on the client to
|
|
access different parts of the GitHub API. For example:
|
|
|
|
client := github.NewClient(nil)
|
|
|
|
// list all organizations for user "willnorris"
|
|
orgs, _, err := client.Organizations.List(ctx, "willnorris", nil)
|
|
|
|
Some API methods have optional parameters that can be passed. For example:
|
|
|
|
client := github.NewClient(nil)
|
|
|
|
// list public repositories for org "github"
|
|
opt := &github.RepositoryListByOrgOptions{Type: "public"}
|
|
repos, _, err := client.Repositories.ListByOrg(ctx, "github", opt)
|
|
|
|
The services of a client divide the API into logical chunks and correspond to
|
|
the structure of the GitHub API documentation at
|
|
https://developer.github.com/v3/.
|
|
|
|
NOTE: Using the https://godoc.org/context package, one can easily
|
|
pass cancelation signals and deadlines to various services of the client for
|
|
handling a request. In case there is no context available, then context.Background()
|
|
can be used as a starting point.
|
|
|
|
For more sample code snippets, head over to the https://github.com/google/go-github/tree/master/example directory.
|
|
|
|
Authentication
|
|
|
|
The go-github library does not directly handle authentication. Instead, when
|
|
creating a new client, pass an http.Client that can handle authentication for
|
|
you. The easiest and recommended way to do this is using the golang.org/x/oauth2
|
|
library, but you can always use any other library that provides an http.Client.
|
|
If you have an OAuth2 access token (for example, a personal API token), you can
|
|
use it with the oauth2 library using:
|
|
|
|
import "golang.org/x/oauth2"
|
|
|
|
func main() {
|
|
ctx := context.Background()
|
|
ts := oauth2.StaticTokenSource(
|
|
&oauth2.Token{AccessToken: "... your access token ..."},
|
|
)
|
|
tc := oauth2.NewClient(ctx, ts)
|
|
|
|
client := github.NewClient(tc)
|
|
|
|
// list all repositories for the authenticated user
|
|
repos, _, err := client.Repositories.List(ctx, "", nil)
|
|
}
|
|
|
|
Note that when using an authenticated Client, all calls made by the client will
|
|
include the specified OAuth token. Therefore, authenticated clients should
|
|
almost never be shared between different users.
|
|
|
|
See the oauth2 docs for complete instructions on using that library.
|
|
|
|
For API methods that require HTTP Basic Authentication, use the
|
|
BasicAuthTransport.
|
|
|
|
GitHub Apps authentication can be provided by the
|
|
https://github.com/bradleyfalzon/ghinstallation package.
|
|
|
|
import "github.com/bradleyfalzon/ghinstallation"
|
|
|
|
func main() {
|
|
// Wrap the shared transport for use with the integration ID 1 authenticating with installation ID 99.
|
|
itr, err := ghinstallation.NewKeyFromFile(http.DefaultTransport, 1, 99, "2016-10-19.private-key.pem")
|
|
if err != nil {
|
|
// Handle error.
|
|
}
|
|
|
|
// Use installation transport with client
|
|
client := github.NewClient(&http.Client{Transport: itr})
|
|
|
|
// Use client...
|
|
}
|
|
|
|
Rate Limiting
|
|
|
|
GitHub imposes a rate limit on all API clients. Unauthenticated clients are
|
|
limited to 60 requests per hour, while authenticated clients can make up to
|
|
5,000 requests per hour. The Search API has a custom rate limit. Unauthenticated
|
|
clients are limited to 10 requests per minute, while authenticated clients
|
|
can make up to 30 requests per minute. To receive the higher rate limit when
|
|
making calls that are not issued on behalf of a user,
|
|
use UnauthenticatedRateLimitedTransport.
|
|
|
|
The returned Response.Rate value contains the rate limit information
|
|
from the most recent API call. If a recent enough response isn't
|
|
available, you can use RateLimits to fetch the most up-to-date rate
|
|
limit data for the client.
|
|
|
|
To detect an API rate limit error, you can check if its type is *github.RateLimitError:
|
|
|
|
repos, _, err := client.Repositories.List(ctx, "", nil)
|
|
if _, ok := err.(*github.RateLimitError); ok {
|
|
log.Println("hit rate limit")
|
|
}
|
|
|
|
Learn more about GitHub rate limiting at
|
|
https://developer.github.com/v3/#rate-limiting.
|
|
|
|
Accepted Status
|
|
|
|
Some endpoints may return a 202 Accepted status code, meaning that the
|
|
information required is not yet ready and was scheduled to be gathered on
|
|
the GitHub side. Methods known to behave like this are documented specifying
|
|
this behavior.
|
|
|
|
To detect this condition of error, you can check if its type is
|
|
*github.AcceptedError:
|
|
|
|
stats, _, err := client.Repositories.ListContributorsStats(ctx, org, repo)
|
|
if _, ok := err.(*github.AcceptedError); ok {
|
|
log.Println("scheduled on GitHub side")
|
|
}
|
|
|
|
Conditional Requests
|
|
|
|
The GitHub API has good support for conditional requests which will help
|
|
prevent you from burning through your rate limit, as well as help speed up your
|
|
application. go-github does not handle conditional requests directly, but is
|
|
instead designed to work with a caching http.Transport. We recommend using
|
|
https://github.com/gregjones/httpcache for that.
|
|
|
|
Learn more about GitHub conditional requests at
|
|
https://developer.github.com/v3/#conditional-requests.
|
|
|
|
Creating and Updating Resources
|
|
|
|
All structs for GitHub resources use pointer values for all non-repeated fields.
|
|
This allows distinguishing between unset fields and those set to a zero-value.
|
|
Helper functions have been provided to easily create these pointers for string,
|
|
bool, and int values. For example:
|
|
|
|
// create a new private repository named "foo"
|
|
repo := &github.Repository{
|
|
Name: github.String("foo"),
|
|
Private: github.Bool(true),
|
|
}
|
|
client.Repositories.Create(ctx, "", repo)
|
|
|
|
Users who have worked with protocol buffers should find this pattern familiar.
|
|
|
|
Pagination
|
|
|
|
All requests for resource collections (repos, pull requests, issues, etc.)
|
|
support pagination. Pagination options are described in the
|
|
github.ListOptions struct and passed to the list methods directly or as an
|
|
embedded type of a more specific list options struct (for example
|
|
github.PullRequestListOptions). Pages information is available via the
|
|
github.Response struct.
|
|
|
|
client := github.NewClient(nil)
|
|
|
|
opt := &github.RepositoryListByOrgOptions{
|
|
ListOptions: github.ListOptions{PerPage: 10},
|
|
}
|
|
// get all pages of results
|
|
var allRepos []*github.Repository
|
|
for {
|
|
repos, resp, err := client.Repositories.ListByOrg(ctx, "github", opt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
allRepos = append(allRepos, repos...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opt.Page = resp.NextPage
|
|
}
|
|
|
|
*/
|
|
package github
|