mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	* upgrate go-github client to v32.1.0 * migrate
This commit is contained in:
		
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @@ -48,7 +48,7 @@ require ( | |||||||
| 	github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28 | 	github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28 | ||||||
| 	github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14 | 	github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14 | ||||||
| 	github.com/golang/protobuf v1.4.1 // indirect | 	github.com/golang/protobuf v1.4.1 // indirect | ||||||
| 	github.com/google/go-github/v24 v24.0.1 | 	github.com/google/go-github/v32 v32.1.0 | ||||||
| 	github.com/google/uuid v1.1.1 | 	github.com/google/uuid v1.1.1 | ||||||
| 	github.com/gorilla/context v1.1.1 | 	github.com/gorilla/context v1.1.1 | ||||||
| 	github.com/hashicorp/go-retryablehttp v0.6.6 // indirect | 	github.com/hashicorp/go-retryablehttp v0.6.6 // indirect | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								go.sum
									
									
									
									
									
								
							| @@ -315,10 +315,8 @@ github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= | |||||||
| github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||||
| github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= | github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= | ||||||
| github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||||
| github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= | github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II= | ||||||
| github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= | github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= | ||||||
| github.com/google/go-github/v24 v24.0.1 h1:KCt1LjMJEey1qvPXxa9SjaWxwTsCWSq6p2Ju57UR4Q4= |  | ||||||
| github.com/google/go-github/v24 v24.0.1/go.mod h1:CRqaW1Uns1TCkP0wqTpxYyRxRjxwvKU/XSS44u6X74M= |  | ||||||
| github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= | github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= | ||||||
| github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= | github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= | ||||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||||
| @@ -664,7 +662,6 @@ go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= | |||||||
| go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||||
| go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= | go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= | ||||||
| go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | ||||||
| golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= |  | ||||||
| golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||||
| golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||||
| golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||||
| @@ -737,7 +734,6 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ | |||||||
| golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sys v0.0.0-20180824143301-4910a1d54f87/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= |  | ||||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ package migrations | |||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
|  |  | ||||||
| 	"github.com/google/go-github/v24/github" | 	"github.com/google/go-github/v32/github" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/structs" | 	"code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  |  | ||||||
| 	"github.com/google/go-github/v24/github" | 	"github.com/google/go-github/v32/github" | ||||||
| 	"golang.org/x/oauth2" | 	"golang.org/x/oauth2" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -364,7 +364,7 @@ func (g *GithubDownloaderV3) GetIssues(page, perPage int) ([]*base.Issue, bool, | |||||||
| 		} | 		} | ||||||
| 		var labels = make([]*base.Label, 0, len(issue.Labels)) | 		var labels = make([]*base.Label, 0, len(issue.Labels)) | ||||||
| 		for _, l := range issue.Labels { | 		for _, l := range issue.Labels { | ||||||
| 			labels = append(labels, convertGithubLabel(&l)) | 			labels = append(labels, convertGithubLabel(l)) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		var email string | 		var email string | ||||||
| @@ -425,8 +425,8 @@ func (g *GithubDownloaderV3) GetComments(issueNumber int64) ([]*base.Comment, er | |||||||
| 		asc         = "asc" | 		asc         = "asc" | ||||||
| 	) | 	) | ||||||
| 	opt := &github.IssueListCommentsOptions{ | 	opt := &github.IssueListCommentsOptions{ | ||||||
| 		Sort:      created, | 		Sort:      &created, | ||||||
| 		Direction: asc, | 		Direction: &asc, | ||||||
| 		ListOptions: github.ListOptions{ | 		ListOptions: github.ListOptions{ | ||||||
| 			PerPage: 100, | 			PerPage: 100, | ||||||
| 		}, | 		}, | ||||||
|   | |||||||
							
								
								
									
										230
									
								
								vendor/github.com/google/go-github/v24/github/apps.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										230
									
								
								vendor/github.com/google/go-github/v24/github/apps.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,230 +0,0 @@ | |||||||
| // Copyright 2016 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 |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"fmt" |  | ||||||
| 	"time" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // AppsService provides access to the installation related functions |  | ||||||
| // in the GitHub API. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/ |  | ||||||
| type AppsService service |  | ||||||
|  |  | ||||||
| // App represents a GitHub App. |  | ||||||
| type App struct { |  | ||||||
| 	ID          *int64     `json:"id,omitempty"` |  | ||||||
| 	NodeID      *string    `json:"node_id,omitempty"` |  | ||||||
| 	Owner       *User      `json:"owner,omitempty"` |  | ||||||
| 	Name        *string    `json:"name,omitempty"` |  | ||||||
| 	Description *string    `json:"description,omitempty"` |  | ||||||
| 	ExternalURL *string    `json:"external_url,omitempty"` |  | ||||||
| 	HTMLURL     *string    `json:"html_url,omitempty"` |  | ||||||
| 	CreatedAt   *time.Time `json:"created_at,omitempty"` |  | ||||||
| 	UpdatedAt   *time.Time `json:"updated_at,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // InstallationToken represents an installation token. |  | ||||||
| type InstallationToken struct { |  | ||||||
| 	Token     *string    `json:"token,omitempty"` |  | ||||||
| 	ExpiresAt *time.Time `json:"expires_at,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // InstallationPermissions lists the permissions for metadata, contents, issues and single file for an installation. |  | ||||||
| type InstallationPermissions struct { |  | ||||||
| 	Metadata   *string `json:"metadata,omitempty"` |  | ||||||
| 	Contents   *string `json:"contents,omitempty"` |  | ||||||
| 	Issues     *string `json:"issues,omitempty"` |  | ||||||
| 	SingleFile *string `json:"single_file,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Installation represents a GitHub Apps installation. |  | ||||||
| type Installation struct { |  | ||||||
| 	ID                  *int64                   `json:"id,omitempty"` |  | ||||||
| 	AppID               *int64                   `json:"app_id,omitempty"` |  | ||||||
| 	TargetID            *int64                   `json:"target_id,omitempty"` |  | ||||||
| 	Account             *User                    `json:"account,omitempty"` |  | ||||||
| 	AccessTokensURL     *string                  `json:"access_tokens_url,omitempty"` |  | ||||||
| 	RepositoriesURL     *string                  `json:"repositories_url,omitempty"` |  | ||||||
| 	HTMLURL             *string                  `json:"html_url,omitempty"` |  | ||||||
| 	TargetType          *string                  `json:"target_type,omitempty"` |  | ||||||
| 	SingleFileName      *string                  `json:"single_file_name,omitempty"` |  | ||||||
| 	RepositorySelection *string                  `json:"repository_selection,omitempty"` |  | ||||||
| 	Events              []string                 `json:"events,omitempty"` |  | ||||||
| 	Permissions         *InstallationPermissions `json:"permissions,omitempty"` |  | ||||||
| 	CreatedAt           *Timestamp               `json:"created_at,omitempty"` |  | ||||||
| 	UpdatedAt           *Timestamp               `json:"updated_at,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (i Installation) String() string { |  | ||||||
| 	return Stringify(i) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Get a single GitHub App. Passing the empty string will get |  | ||||||
| // the authenticated GitHub App. |  | ||||||
| // |  | ||||||
| // Note: appSlug is just the URL-friendly name of your GitHub App. |  | ||||||
| // You can find this on the settings page for your GitHub App |  | ||||||
| // (e.g., https://github.com/settings/apps/:app_slug). |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/#get-a-single-github-app |  | ||||||
| func (s *AppsService) Get(ctx context.Context, appSlug string) (*App, *Response, error) { |  | ||||||
| 	var u string |  | ||||||
| 	if appSlug != "" { |  | ||||||
| 		u = fmt.Sprintf("apps/%v", appSlug) |  | ||||||
| 	} else { |  | ||||||
| 		u = "app" |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeIntegrationPreview) |  | ||||||
|  |  | ||||||
| 	app := new(App) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, app) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return app, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListInstallations lists the installations that the current GitHub App has. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/#find-installations |  | ||||||
| func (s *AppsService) ListInstallations(ctx context.Context, opt *ListOptions) ([]*Installation, *Response, error) { |  | ||||||
| 	u, err := addOptions("app/installations", opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeIntegrationPreview) |  | ||||||
|  |  | ||||||
| 	var i []*Installation |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &i) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return i, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // GetInstallation returns the specified installation. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/#get-a-single-installation |  | ||||||
| func (s *AppsService) GetInstallation(ctx context.Context, id int64) (*Installation, *Response, error) { |  | ||||||
| 	return s.getInstallation(ctx, fmt.Sprintf("app/installations/%v", id)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListUserInstallations lists installations that are accessible to the authenticated user. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/#list-installations-for-user |  | ||||||
| func (s *AppsService) ListUserInstallations(ctx context.Context, opt *ListOptions) ([]*Installation, *Response, error) { |  | ||||||
| 	u, err := addOptions("user/installations", opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeIntegrationPreview) |  | ||||||
|  |  | ||||||
| 	var i struct { |  | ||||||
| 		Installations []*Installation `json:"installations"` |  | ||||||
| 	} |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &i) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return i.Installations, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // CreateInstallationToken creates a new installation token. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/#create-a-new-installation-token |  | ||||||
| func (s *AppsService) CreateInstallationToken(ctx context.Context, id int64) (*InstallationToken, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("app/installations/%v/access_tokens", id) |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("POST", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeIntegrationPreview) |  | ||||||
|  |  | ||||||
| 	t := new(InstallationToken) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, t) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return t, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // FindOrganizationInstallation finds the organization's installation information. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/#find-organization-installation |  | ||||||
| func (s *AppsService) FindOrganizationInstallation(ctx context.Context, org string) (*Installation, *Response, error) { |  | ||||||
| 	return s.getInstallation(ctx, fmt.Sprintf("orgs/%v/installation", org)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // FindRepositoryInstallation finds the repository's installation information. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/#find-repository-installation |  | ||||||
| func (s *AppsService) FindRepositoryInstallation(ctx context.Context, owner, repo string) (*Installation, *Response, error) { |  | ||||||
| 	return s.getInstallation(ctx, fmt.Sprintf("repos/%v/%v/installation", owner, repo)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // FindRepositoryInstallationByID finds the repository's installation information. |  | ||||||
| // |  | ||||||
| // Note: FindRepositoryInstallationByID uses the undocumented GitHub API endpoint /repositories/:id/installation. |  | ||||||
| func (s *AppsService) FindRepositoryInstallationByID(ctx context.Context, id int64) (*Installation, *Response, error) { |  | ||||||
| 	return s.getInstallation(ctx, fmt.Sprintf("repositories/%d/installation", id)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // FindUserInstallation finds the user's installation information. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/#find-repository-installation |  | ||||||
| func (s *AppsService) FindUserInstallation(ctx context.Context, user string) (*Installation, *Response, error) { |  | ||||||
| 	return s.getInstallation(ctx, fmt.Sprintf("users/%v/installation", user)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (s *AppsService) getInstallation(ctx context.Context, url string) (*Installation, *Response, error) { |  | ||||||
| 	req, err := s.client.NewRequest("GET", url, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeIntegrationPreview) |  | ||||||
|  |  | ||||||
| 	i := new(Installation) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, i) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return i, resp, nil |  | ||||||
| } |  | ||||||
							
								
								
									
										457
									
								
								vendor/github.com/google/go-github/v24/github/teams.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										457
									
								
								vendor/github.com/google/go-github/v24/github/teams.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,457 +0,0 @@ | |||||||
| // Copyright 2018 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 |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"fmt" |  | ||||||
| 	"strings" |  | ||||||
| 	"time" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // TeamsService provides access to the team-related functions |  | ||||||
| // in the GitHub API. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/ |  | ||||||
| type TeamsService service |  | ||||||
|  |  | ||||||
| // Team represents a team within a GitHub organization. Teams are used to |  | ||||||
| // manage access to an organization's repositories. |  | ||||||
| type Team struct { |  | ||||||
| 	ID          *int64  `json:"id,omitempty"` |  | ||||||
| 	Name        *string `json:"name,omitempty"` |  | ||||||
| 	Description *string `json:"description,omitempty"` |  | ||||||
| 	URL         *string `json:"url,omitempty"` |  | ||||||
| 	Slug        *string `json:"slug,omitempty"` |  | ||||||
|  |  | ||||||
| 	// Permission specifies the default permission for repositories owned by the team. |  | ||||||
| 	Permission *string `json:"permission,omitempty"` |  | ||||||
|  |  | ||||||
| 	// Privacy identifies the level of privacy this team should have. |  | ||||||
| 	// Possible values are: |  | ||||||
| 	//     secret - only visible to organization owners and members of this team |  | ||||||
| 	//     closed - visible to all members of this organization |  | ||||||
| 	// Default is "secret". |  | ||||||
| 	Privacy *string `json:"privacy,omitempty"` |  | ||||||
|  |  | ||||||
| 	MembersCount    *int          `json:"members_count,omitempty"` |  | ||||||
| 	ReposCount      *int          `json:"repos_count,omitempty"` |  | ||||||
| 	Organization    *Organization `json:"organization,omitempty"` |  | ||||||
| 	MembersURL      *string       `json:"members_url,omitempty"` |  | ||||||
| 	RepositoriesURL *string       `json:"repositories_url,omitempty"` |  | ||||||
| 	Parent          *Team         `json:"parent,omitempty"` |  | ||||||
|  |  | ||||||
| 	// LDAPDN is only available in GitHub Enterprise and when the team |  | ||||||
| 	// membership is synchronized with LDAP. |  | ||||||
| 	LDAPDN *string `json:"ldap_dn,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (t Team) String() string { |  | ||||||
| 	return Stringify(t) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Invitation represents a team member's invitation status. |  | ||||||
| type Invitation struct { |  | ||||||
| 	ID    *int64  `json:"id,omitempty"` |  | ||||||
| 	Login *string `json:"login,omitempty"` |  | ||||||
| 	Email *string `json:"email,omitempty"` |  | ||||||
| 	// Role can be one of the values - 'direct_member', 'admin', 'billing_manager', 'hiring_manager', or 'reinstate'. |  | ||||||
| 	Role              *string    `json:"role,omitempty"` |  | ||||||
| 	CreatedAt         *time.Time `json:"created_at,omitempty"` |  | ||||||
| 	Inviter           *User      `json:"inviter,omitempty"` |  | ||||||
| 	TeamCount         *int       `json:"team_count,omitempty"` |  | ||||||
| 	InvitationTeamURL *string    `json:"invitation_team_url,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (i Invitation) String() string { |  | ||||||
| 	return Stringify(i) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListTeams lists all of the teams for an organization. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#list-teams |  | ||||||
| func (s *TeamsService) ListTeams(ctx context.Context, org string, opt *ListOptions) ([]*Team, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("orgs/%v/teams", org) |  | ||||||
| 	u, err := addOptions(u, opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
|  |  | ||||||
| 	var teams []*Team |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &teams) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return teams, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // GetTeam fetches a team by ID. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#get-team |  | ||||||
| func (s *TeamsService) GetTeam(ctx context.Context, team int64) (*Team, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v", team) |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
|  |  | ||||||
| 	t := new(Team) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, t) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return t, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // NewTeam represents a team to be created or modified. |  | ||||||
| type NewTeam struct { |  | ||||||
| 	Name         string   `json:"name"` // Name of the team. (Required.) |  | ||||||
| 	Description  *string  `json:"description,omitempty"` |  | ||||||
| 	Maintainers  []string `json:"maintainers,omitempty"` |  | ||||||
| 	RepoNames    []string `json:"repo_names,omitempty"` |  | ||||||
| 	ParentTeamID *int64   `json:"parent_team_id,omitempty"` |  | ||||||
|  |  | ||||||
| 	// Deprecated: Permission is deprecated when creating or editing a team in an org |  | ||||||
| 	// using the new GitHub permission model. It no longer identifies the |  | ||||||
| 	// permission a team has on its repos, but only specifies the default |  | ||||||
| 	// permission a repo is initially added with. Avoid confusion by |  | ||||||
| 	// specifying a permission value when calling AddTeamRepo. |  | ||||||
| 	Permission *string `json:"permission,omitempty"` |  | ||||||
|  |  | ||||||
| 	// Privacy identifies the level of privacy this team should have. |  | ||||||
| 	// Possible values are: |  | ||||||
| 	//     secret - only visible to organization owners and members of this team |  | ||||||
| 	//     closed - visible to all members of this organization |  | ||||||
| 	// Default is "secret". |  | ||||||
| 	Privacy *string `json:"privacy,omitempty"` |  | ||||||
|  |  | ||||||
| 	// LDAPDN may be used in GitHub Enterprise when the team membership |  | ||||||
| 	// is synchronized with LDAP. |  | ||||||
| 	LDAPDN *string `json:"ldap_dn,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (s NewTeam) String() string { |  | ||||||
| 	return Stringify(s) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // CreateTeam creates a new team within an organization. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#create-team |  | ||||||
| func (s *TeamsService) CreateTeam(ctx context.Context, org string, team NewTeam) (*Team, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("orgs/%v/teams", org) |  | ||||||
| 	req, err := s.client.NewRequest("POST", u, team) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
|  |  | ||||||
| 	t := new(Team) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, t) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return t, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // EditTeam edits a team. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#edit-team |  | ||||||
| func (s *TeamsService) EditTeam(ctx context.Context, id int64, team NewTeam) (*Team, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v", id) |  | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, team) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
|  |  | ||||||
| 	t := new(Team) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, t) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return t, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // DeleteTeam deletes a team. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#delete-team |  | ||||||
| func (s *TeamsService) DeleteTeam(ctx context.Context, team int64) (*Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v", team) |  | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
|  |  | ||||||
| 	return s.client.Do(ctx, req, nil) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListChildTeams lists child teams for a team. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#list-child-teams |  | ||||||
| func (s *TeamsService) ListChildTeams(ctx context.Context, teamID int64, opt *ListOptions) ([]*Team, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/teams", teamID) |  | ||||||
| 	u, err := addOptions(u, opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
|  |  | ||||||
| 	var teams []*Team |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &teams) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return teams, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListTeamRepos lists the repositories that the specified team has access to. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#list-team-repos |  | ||||||
| func (s *TeamsService) ListTeamRepos(ctx context.Context, team int64, opt *ListOptions) ([]*Repository, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/repos", team) |  | ||||||
| 	u, err := addOptions(u, opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when topics API fully launches. |  | ||||||
| 	headers := []string{mediaTypeTopicsPreview, mediaTypeNestedTeamsPreview} |  | ||||||
| 	req.Header.Set("Accept", strings.Join(headers, ", ")) |  | ||||||
|  |  | ||||||
| 	var repos []*Repository |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &repos) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return repos, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // IsTeamRepo checks if a team manages the specified repository. If the |  | ||||||
| // repository is managed by team, a Repository is returned which includes the |  | ||||||
| // permissions team has for that repo. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#check-if-a-team-manages-a-repository |  | ||||||
| func (s *TeamsService) IsTeamRepo(ctx context.Context, team int64, owner string, repo string) (*Repository, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	headers := []string{mediaTypeOrgPermissionRepo, mediaTypeNestedTeamsPreview} |  | ||||||
| 	req.Header.Set("Accept", strings.Join(headers, ", ")) |  | ||||||
|  |  | ||||||
| 	repository := new(Repository) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, repository) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return repository, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // TeamAddTeamRepoOptions specifies the optional parameters to the |  | ||||||
| // TeamsService.AddTeamRepo method. |  | ||||||
| type TeamAddTeamRepoOptions struct { |  | ||||||
| 	// Permission specifies the permission to grant the team on this repository. |  | ||||||
| 	// Possible values are: |  | ||||||
| 	//     pull - team members can pull, but not push to or administer this repository |  | ||||||
| 	//     push - team members can pull and push, but not administer this repository |  | ||||||
| 	//     admin - team members can pull, push and administer this repository |  | ||||||
| 	// |  | ||||||
| 	// If not specified, the team's permission attribute will be used. |  | ||||||
| 	Permission string `json:"permission,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // AddTeamRepo adds a repository to be managed by the specified team. The |  | ||||||
| // specified repository must be owned by the organization to which the team |  | ||||||
| // belongs, or a direct fork of a repository owned by the organization. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#add-team-repo |  | ||||||
| func (s *TeamsService) AddTeamRepo(ctx context.Context, team int64, owner string, repo string, opt *TeamAddTeamRepoOptions) (*Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) |  | ||||||
| 	req, err := s.client.NewRequest("PUT", u, opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return s.client.Do(ctx, req, nil) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // RemoveTeamRepo removes a repository from being managed by the specified |  | ||||||
| // team. Note that this does not delete the repository, it just removes it |  | ||||||
| // from the team. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#remove-team-repo |  | ||||||
| func (s *TeamsService) RemoveTeamRepo(ctx context.Context, team int64, owner string, repo string) (*Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) |  | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return s.client.Do(ctx, req, nil) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListUserTeams lists a user's teams |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#list-user-teams |  | ||||||
| func (s *TeamsService) ListUserTeams(ctx context.Context, opt *ListOptions) ([]*Team, *Response, error) { |  | ||||||
| 	u := "user/teams" |  | ||||||
| 	u, err := addOptions(u, opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
|  |  | ||||||
| 	var teams []*Team |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &teams) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return teams, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListTeamProjects lists the organization projects for a team. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#list-team-projects |  | ||||||
| func (s *TeamsService) ListTeamProjects(ctx context.Context, teamID int64) ([]*Project, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/projects", teamID) |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	acceptHeaders := []string{mediaTypeNestedTeamsPreview, mediaTypeProjectsPreview} |  | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |  | ||||||
|  |  | ||||||
| 	var projects []*Project |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &projects) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return projects, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ReviewTeamProjects checks whether a team has read, write, or admin |  | ||||||
| // permissions for an organization project. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#review-a-team-project |  | ||||||
| func (s *TeamsService) ReviewTeamProjects(ctx context.Context, teamID, projectID int64) (*Project, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/projects/%v", teamID, projectID) |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	acceptHeaders := []string{mediaTypeNestedTeamsPreview, mediaTypeProjectsPreview} |  | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |  | ||||||
|  |  | ||||||
| 	projects := &Project{} |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &projects) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return projects, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // TeamProjectOptions specifies the optional parameters to the |  | ||||||
| // TeamsService.AddTeamProject method. |  | ||||||
| type TeamProjectOptions struct { |  | ||||||
| 	// Permission specifies the permission to grant to the team for this project. |  | ||||||
| 	// Possible values are: |  | ||||||
| 	//     "read" - team members can read, but not write to or administer this project. |  | ||||||
| 	//     "write" - team members can read and write, but not administer this project. |  | ||||||
| 	//     "admin" - team members can read, write and administer this project. |  | ||||||
| 	// |  | ||||||
| 	Permission *string `json:"permission,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // AddTeamProject adds an organization project to a team. To add a project to a team or |  | ||||||
| // update the team's permission on a project, the authenticated user must have admin |  | ||||||
| // permissions for the project. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#add-or-update-team-project |  | ||||||
| func (s *TeamsService) AddTeamProject(ctx context.Context, teamID, projectID int64, opt *TeamProjectOptions) (*Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/projects/%v", teamID, projectID) |  | ||||||
| 	req, err := s.client.NewRequest("PUT", u, opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	acceptHeaders := []string{mediaTypeNestedTeamsPreview, mediaTypeProjectsPreview} |  | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |  | ||||||
|  |  | ||||||
| 	return s.client.Do(ctx, req, nil) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // RemoveTeamProject removes an organization project from a team. An organization owner or |  | ||||||
| // a team maintainer can remove any project from the team. To remove a project from a team |  | ||||||
| // as an organization member, the authenticated user must have "read" access to both the team |  | ||||||
| // and project, or "admin" access to the team or project. |  | ||||||
| // Note: This endpoint removes the project from the team, but does not delete it. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/#remove-team-project |  | ||||||
| func (s *TeamsService) RemoveTeamProject(ctx context.Context, teamID int64, projectID int64) (*Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/projects/%v", teamID, projectID) |  | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	acceptHeaders := []string{mediaTypeNestedTeamsPreview, mediaTypeProjectsPreview} |  | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |  | ||||||
|  |  | ||||||
| 	return s.client.Do(ctx, req, nil) |  | ||||||
| } |  | ||||||
							
								
								
									
										155
									
								
								vendor/github.com/google/go-github/v24/github/teams_discussion_comments.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										155
									
								
								vendor/github.com/google/go-github/v24/github/teams_discussion_comments.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,155 +0,0 @@ | |||||||
| // Copyright 2018 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 |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"fmt" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // DiscussionComment represents a GitHub dicussion in a team. |  | ||||||
| type DiscussionComment struct { |  | ||||||
| 	Author        *User      `json:"author,omitempty"` |  | ||||||
| 	Body          *string    `json:"body,omitempty"` |  | ||||||
| 	BodyHTML      *string    `json:"body_html,omitempty"` |  | ||||||
| 	BodyVersion   *string    `json:"body_version,omitempty"` |  | ||||||
| 	CreatedAt     *Timestamp `json:"created_at,omitempty"` |  | ||||||
| 	LastEditedAt  *Timestamp `json:"last_edited_at,omitempty"` |  | ||||||
| 	DiscussionURL *string    `json:"discussion_url,omitempty"` |  | ||||||
| 	HTMLURL       *string    `json:"html_url,omitempty"` |  | ||||||
| 	NodeID        *string    `json:"node_id,omitempty"` |  | ||||||
| 	Number        *int       `json:"number,omitempty"` |  | ||||||
| 	UpdatedAt     *Timestamp `json:"updated_at,omitempty"` |  | ||||||
| 	URL           *string    `json:"url,omitempty"` |  | ||||||
| 	Reactions     *Reactions `json:"reactions,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (c DiscussionComment) String() string { |  | ||||||
| 	return Stringify(c) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // DiscussionCommentListOptions specifies optional parameters to the |  | ||||||
| // TeamServices.ListComments method. |  | ||||||
| type DiscussionCommentListOptions struct { |  | ||||||
| 	// Sorts the discussion comments by the date they were created. |  | ||||||
| 	// Accepted values are asc and desc. Default is desc. |  | ||||||
| 	Direction string `url:"direction,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListComments lists all comments on a team discussion. |  | ||||||
| // Authenticated user must grant read:discussion scope. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#list-comments |  | ||||||
| func (s *TeamsService) ListComments(ctx context.Context, teamID int64, discussionNumber int, options *DiscussionCommentListOptions) ([]*DiscussionComment, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v/comments", teamID, discussionNumber) |  | ||||||
| 	u, err := addOptions(u, options) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |  | ||||||
|  |  | ||||||
| 	var comments []*DiscussionComment |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &comments) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return comments, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // GetComment gets a specific comment on a team discussion. |  | ||||||
| // Authenticated user must grant read:discussion scope. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#get-a-single-comment |  | ||||||
| func (s *TeamsService) GetComment(ctx context.Context, teamID int64, discussionNumber, commentNumber int) (*DiscussionComment, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v", teamID, discussionNumber, commentNumber) |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |  | ||||||
|  |  | ||||||
| 	discussionComment := &DiscussionComment{} |  | ||||||
| 	resp, err := s.client.Do(ctx, req, discussionComment) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return discussionComment, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // CreateComment creates a new discussion post on a team discussion. |  | ||||||
| // Authenticated user must grant write:discussion scope. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#create-a-comment |  | ||||||
| func (s *TeamsService) CreateComment(ctx context.Context, teamID int64, discsusionNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v/comments", teamID, discsusionNumber) |  | ||||||
| 	req, err := s.client.NewRequest("POST", u, comment) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |  | ||||||
|  |  | ||||||
| 	discussionComment := &DiscussionComment{} |  | ||||||
| 	resp, err := s.client.Do(ctx, req, discussionComment) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return discussionComment, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // EditComment edits the body text of a discussion comment. |  | ||||||
| // Authenticated user must grant write:discussion scope. |  | ||||||
| // User is allowed to edit body of a comment only. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#edit-a-comment |  | ||||||
| func (s *TeamsService) EditComment(ctx context.Context, teamID int64, discussionNumber, commentNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v", teamID, discussionNumber, commentNumber) |  | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, comment) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |  | ||||||
|  |  | ||||||
| 	discussionComment := &DiscussionComment{} |  | ||||||
| 	resp, err := s.client.Do(ctx, req, discussionComment) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return discussionComment, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // DeleteComment deletes a comment on a team discussion. |  | ||||||
| // Authenticated user must grant write:discussion scope. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#delete-a-comment |  | ||||||
| func (s *TeamsService) DeleteComment(ctx context.Context, teamID int64, discussionNumber, commentNumber int) (*Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v", teamID, discussionNumber, commentNumber) |  | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |  | ||||||
|  |  | ||||||
| 	return s.client.Do(ctx, req, nil) |  | ||||||
| } |  | ||||||
							
								
								
									
										160
									
								
								vendor/github.com/google/go-github/v24/github/teams_discussions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										160
									
								
								vendor/github.com/google/go-github/v24/github/teams_discussions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,160 +0,0 @@ | |||||||
| // Copyright 2018 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 |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"fmt" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // TeamDiscussion represents a GitHub dicussion in a team. |  | ||||||
| type TeamDiscussion struct { |  | ||||||
| 	Author        *User      `json:"author,omitempty"` |  | ||||||
| 	Body          *string    `json:"body,omitempty"` |  | ||||||
| 	BodyHTML      *string    `json:"body_html,omitempty"` |  | ||||||
| 	BodyVersion   *string    `json:"body_version,omitempty"` |  | ||||||
| 	CommentsCount *int       `json:"comments_count,omitempty"` |  | ||||||
| 	CommentsURL   *string    `json:"comments_url,omitempty"` |  | ||||||
| 	CreatedAt     *Timestamp `json:"created_at,omitempty"` |  | ||||||
| 	LastEditedAt  *Timestamp `json:"last_edited_at,omitempty"` |  | ||||||
| 	HTMLURL       *string    `json:"html_url,omitempty"` |  | ||||||
| 	NodeID        *string    `json:"node_id,omitempty"` |  | ||||||
| 	Number        *int       `json:"number,omitempty"` |  | ||||||
| 	Pinned        *bool      `json:"pinned,omitempty"` |  | ||||||
| 	Private       *bool      `json:"private,omitempty"` |  | ||||||
| 	TeamURL       *string    `json:"team_url,omitempty"` |  | ||||||
| 	Title         *string    `json:"title,omitempty"` |  | ||||||
| 	UpdatedAt     *Timestamp `json:"updated_at,omitempty"` |  | ||||||
| 	URL           *string    `json:"url,omitempty"` |  | ||||||
| 	Reactions     *Reactions `json:"reactions,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (d TeamDiscussion) String() string { |  | ||||||
| 	return Stringify(d) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // DiscussionListOptions specifies optional parameters to the |  | ||||||
| // TeamServices.ListDiscussions method. |  | ||||||
| type DiscussionListOptions struct { |  | ||||||
| 	// Sorts the discussion by the date they were created. |  | ||||||
| 	// Accepted values are asc and desc. Default is desc. |  | ||||||
| 	Direction string `url:"direction,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListDiscussions lists all discussions on team's page. |  | ||||||
| // Authenticated user must grant read:discussion scope. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/discussions/#list-discussions |  | ||||||
| func (s *TeamsService) ListDiscussions(ctx context.Context, teamID int64, options *DiscussionListOptions) ([]*TeamDiscussion, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions", teamID) |  | ||||||
| 	u, err := addOptions(u, options) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |  | ||||||
|  |  | ||||||
| 	var teamDiscussions []*TeamDiscussion |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &teamDiscussions) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return teamDiscussions, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // GetDiscussion gets a specific discussion on a team's page. |  | ||||||
| // Authenticated user must grant read:discussion scope. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/discussions/#get-a-single-discussion |  | ||||||
| func (s *TeamsService) GetDiscussion(ctx context.Context, teamID int64, discussionNumber int) (*TeamDiscussion, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v", teamID, discussionNumber) |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |  | ||||||
|  |  | ||||||
| 	teamDiscussion := &TeamDiscussion{} |  | ||||||
| 	resp, err := s.client.Do(ctx, req, teamDiscussion) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return teamDiscussion, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // CreateDiscussion creates a new discussion post on a team's page. |  | ||||||
| // Authenticated user must grant write:discussion scope. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/discussions/#create-a-discussion |  | ||||||
| func (s *TeamsService) CreateDiscussion(ctx context.Context, teamID int64, discussion TeamDiscussion) (*TeamDiscussion, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions", teamID) |  | ||||||
| 	req, err := s.client.NewRequest("POST", u, discussion) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |  | ||||||
|  |  | ||||||
| 	teamDiscussion := &TeamDiscussion{} |  | ||||||
| 	resp, err := s.client.Do(ctx, req, teamDiscussion) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return teamDiscussion, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // EditDiscussion edits the title and body text of a discussion post. |  | ||||||
| // Authenticated user must grant write:discussion scope. |  | ||||||
| // User is allowed to change Title and Body of a discussion only. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/discussions/#edit-a-discussion |  | ||||||
| func (s *TeamsService) EditDiscussion(ctx context.Context, teamID int64, discussionNumber int, discussion TeamDiscussion) (*TeamDiscussion, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v", teamID, discussionNumber) |  | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, discussion) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |  | ||||||
|  |  | ||||||
| 	teamDiscussion := &TeamDiscussion{} |  | ||||||
| 	resp, err := s.client.Do(ctx, req, teamDiscussion) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return teamDiscussion, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // DeleteDiscussion deletes a discussion from team's page. |  | ||||||
| // Authenticated user must grant write:discussion scope. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/discussions/#delete-a-discussion |  | ||||||
| func (s *TeamsService) DeleteDiscussion(ctx context.Context, teamID int64, discussionNumber int) (*Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v", teamID, discussionNumber) |  | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |  | ||||||
|  |  | ||||||
| 	return s.client.Do(ctx, req, nil) |  | ||||||
| } |  | ||||||
							
								
								
									
										174
									
								
								vendor/github.com/google/go-github/v24/github/teams_members.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										174
									
								
								vendor/github.com/google/go-github/v24/github/teams_members.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,174 +0,0 @@ | |||||||
| // Copyright 2018 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 |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"fmt" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // TeamListTeamMembersOptions specifies the optional parameters to the |  | ||||||
| // TeamsService.ListTeamMembers method. |  | ||||||
| type TeamListTeamMembersOptions struct { |  | ||||||
| 	// Role filters members returned by their role in the team. Possible |  | ||||||
| 	// values are "all", "member", "maintainer". Default is "all". |  | ||||||
| 	Role string `url:"role,omitempty"` |  | ||||||
|  |  | ||||||
| 	ListOptions |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListTeamMembers lists all of the users who are members of the specified |  | ||||||
| // team. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/members/#list-team-members |  | ||||||
| func (s *TeamsService) ListTeamMembers(ctx context.Context, team int64, opt *TeamListTeamMembersOptions) ([]*User, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/members", team) |  | ||||||
| 	u, err := addOptions(u, opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
|  |  | ||||||
| 	var members []*User |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &members) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return members, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // IsTeamMember checks if a user is a member of the specified team. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/members/#get-team-member |  | ||||||
| // |  | ||||||
| // Deprecated: This API has been marked as deprecated in the Github API docs, |  | ||||||
| // TeamsService.GetTeamMembership method should be used instead. |  | ||||||
| func (s *TeamsService) IsTeamMember(ctx context.Context, team int64, user string) (bool, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/members/%v", team, user) |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	resp, err := s.client.Do(ctx, req, nil) |  | ||||||
| 	member, err := parseBoolResponse(err) |  | ||||||
| 	return member, resp, err |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // GetTeamMembership returns the membership status for a user in a team. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/members/#get-team-membership |  | ||||||
| func (s *TeamsService) GetTeamMembership(ctx context.Context, team int64, user string) (*Membership, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/memberships/%v", team, user) |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
|  |  | ||||||
| 	t := new(Membership) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, t) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return t, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // TeamAddTeamMembershipOptions specifies the optional |  | ||||||
| // parameters to the TeamsService.AddTeamMembership method. |  | ||||||
| type TeamAddTeamMembershipOptions struct { |  | ||||||
| 	// Role specifies the role the user should have in the team. Possible |  | ||||||
| 	// values are: |  | ||||||
| 	//     member - a normal member of the team |  | ||||||
| 	//     maintainer - a team maintainer. Able to add/remove other team |  | ||||||
| 	//                  members, promote other team members to team |  | ||||||
| 	//                  maintainer, and edit the team’s name and description |  | ||||||
| 	// |  | ||||||
| 	// Default value is "member". |  | ||||||
| 	Role string `json:"role,omitempty"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // AddTeamMembership adds or invites a user to a team. |  | ||||||
| // |  | ||||||
| // In order to add a membership between a user and a team, the authenticated |  | ||||||
| // user must have 'admin' permissions to the team or be an owner of the |  | ||||||
| // organization that the team is associated with. |  | ||||||
| // |  | ||||||
| // If the user is already a part of the team's organization (meaning they're on |  | ||||||
| // at least one other team in the organization), this endpoint will add the |  | ||||||
| // user to the team. |  | ||||||
| // |  | ||||||
| // If the user is completely unaffiliated with the team's organization (meaning |  | ||||||
| // they're on none of the organization's teams), this endpoint will send an |  | ||||||
| // invitation to the user via email. This newly-created membership will be in |  | ||||||
| // the "pending" state until the user accepts the invitation, at which point |  | ||||||
| // the membership will transition to the "active" state and the user will be |  | ||||||
| // added as a member of the team. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/members/#add-or-update-team-membership |  | ||||||
| func (s *TeamsService) AddTeamMembership(ctx context.Context, team int64, user string, opt *TeamAddTeamMembershipOptions) (*Membership, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/memberships/%v", team, user) |  | ||||||
| 	req, err := s.client.NewRequest("PUT", u, opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	t := new(Membership) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, t) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return t, resp, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // RemoveTeamMembership removes a user from a team. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/members/#remove-team-membership |  | ||||||
| func (s *TeamsService) RemoveTeamMembership(ctx context.Context, team int64, user string) (*Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/memberships/%v", team, user) |  | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return s.client.Do(ctx, req, nil) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ListPendingTeamInvitations get pending invitaion list in team. |  | ||||||
| // Warning: The API may change without advance notice during the preview period. |  | ||||||
| // Preview features are not supported for production use. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/teams/members/#list-pending-team-invitations |  | ||||||
| func (s *TeamsService) ListPendingTeamInvitations(ctx context.Context, team int64, opt *ListOptions) ([]*Invitation, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("teams/%v/invitations", team) |  | ||||||
| 	u, err := addOptions(u, opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	var pendingInvitations []*Invitation |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &pendingInvitations) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return pendingInvitations, resp, nil |  | ||||||
| } |  | ||||||
| @@ -9,22 +9,31 @@ | |||||||
| # their employer, as appropriate). | # their employer, as appropriate). | ||||||
| 
 | 
 | ||||||
| 178inaba <masahiro.furudate@gmail.com> | 178inaba <masahiro.furudate@gmail.com> | ||||||
|  | 2BFL <imqksl@gmail.com> | ||||||
|  | 413x <dedifferentiator@gmail.com> | ||||||
| Abhinav Gupta <mail@abhinavg.net> | Abhinav Gupta <mail@abhinavg.net> | ||||||
|  | adrienzieba <adrien.zieba@appdirect.com> | ||||||
| Ahmed Hagy <a.akram93@gmail.com> | Ahmed Hagy <a.akram93@gmail.com> | ||||||
|  | Aidan Steele <aidan.steele@glassechidna.com.au> | ||||||
| Ainsley Chong <ainsley.chong@gmail.com> | Ainsley Chong <ainsley.chong@gmail.com> | ||||||
|  | ajz01 <azdenek@yahoo.com> | ||||||
| Akeda Bagus <akeda@x-team.com> | Akeda Bagus <akeda@x-team.com> | ||||||
| Akhil Mohan <akhilerm@gmail.com> | Akhil Mohan <akhilerm@gmail.com> | ||||||
| Alec Thomas <alec@swapoff.org> | Alec Thomas <alec@swapoff.org> | ||||||
| Aleks Clark <aleks.clark@gmail.com> | Aleks Clark <aleks.clark@gmail.com> | ||||||
| Alex Bramley <a.bramley@gmail.com> | Alex Bramley <a.bramley@gmail.com> | ||||||
|  | Alex Orr <Alexorr.CSE@gmail.com> | ||||||
| Alexander Harkness <me@bearbin.net> | Alexander Harkness <me@bearbin.net> | ||||||
| Allen Sun <shlallen1990@gmail.com> | Allen Sun <shlallen1990@gmail.com> | ||||||
| Amey Sakhadeo <me@ameyms.com> | Amey Sakhadeo <me@ameyms.com> | ||||||
|  | Anders Janmyr <anders@janmyr.com> | ||||||
| Andreas Garnæs <https://github.com/andreas> | Andreas Garnæs <https://github.com/andreas> | ||||||
| Andrew Ryabchun <aryabchun@mail.ua> | Andrew Ryabchun <aryabchun@mail.ua> | ||||||
| Andy Grunwald <andygrunwald@gmail.com> | Andy Grunwald <andygrunwald@gmail.com> | ||||||
| Andy Hume <andyhume@gmail.com> | Andy Hume <andyhume@gmail.com> | ||||||
| Andy Lindeman <andy@lindeman.io> | Andy Lindeman <andy@lindeman.io> | ||||||
|  | angie pinilla <angelinepinilla@gmail.com> | ||||||
|  | anjanashenoy <anjanashenoy1@gmail.com> | ||||||
| Anshuman Bhartiya <anshuman.bhartiya@gmail.com> | Anshuman Bhartiya <anshuman.bhartiya@gmail.com> | ||||||
| Antoine <antoine.tu@mail.mcgill.ca> | Antoine <antoine.tu@mail.mcgill.ca> | ||||||
| Antoine Pelisse <apelisse@gmail.com> | Antoine Pelisse <apelisse@gmail.com> | ||||||
| @@ -33,6 +42,7 @@ appilon <apilon@hashicorp.com> | |||||||
| Aravind <aravindkp@outlook.in> | Aravind <aravindkp@outlook.in> | ||||||
| Arda Kuyumcu <kuyumcuarda@gmail.com> | Arda Kuyumcu <kuyumcuarda@gmail.com> | ||||||
| Arıl Bozoluk <arilbozoluk@hotmail.com> | Arıl Bozoluk <arilbozoluk@hotmail.com> | ||||||
|  | Austin Burdine <acburdine@gmail.com> | ||||||
| Austin Dizzy <dizzy@wow.com> | Austin Dizzy <dizzy@wow.com> | ||||||
| Ben Batha <bhbatha@gmail.com> | Ben Batha <bhbatha@gmail.com> | ||||||
| Benjamen Keroack <benjamen@dollarshaveclub.com> | Benjamen Keroack <benjamen@dollarshaveclub.com> | ||||||
| @@ -47,13 +57,18 @@ Brandon Cook <phylake@gmail.com> | |||||||
| Brian Egizi <brian@mojotech.com> | Brian Egizi <brian@mojotech.com> | ||||||
| Bryan Boreham <bryan@weave.works> | Bryan Boreham <bryan@weave.works> | ||||||
| Cami Diez <diezcami@gmail.com> | Cami Diez <diezcami@gmail.com> | ||||||
|  | Carl Johnson <me@carlmjohnson.net> | ||||||
| Carlos Alexandro Becker <caarlos0@gmail.com> | Carlos Alexandro Becker <caarlos0@gmail.com> | ||||||
|  | Carlos Tadeu Panato Junior <ctadeu@gmail.com> | ||||||
| chandresh-pancholi <chandreshpancholi007@gmail.com> | chandresh-pancholi <chandreshpancholi007@gmail.com> | ||||||
| Charles Fenwick Elliott <Charles@FenwickElliott.io> | Charles Fenwick Elliott <Charles@FenwickElliott.io> | ||||||
| Charlie Yan <charlieyan08@gmail.com> | Charlie Yan <charlieyan08@gmail.com> | ||||||
| Chris King <chriskingnet@gmail.com> | Chris King <chriskingnet@gmail.com> | ||||||
|  | Chris Raborg <craborg57@gmail.com> | ||||||
| Chris Roche <chris@vsco.co> | Chris Roche <chris@vsco.co> | ||||||
| Chris Schaefer <chris@dtzq.com> | Chris Schaefer <chris@dtzq.com> | ||||||
|  | chrisforrette <chris@chrisforrette.com> | ||||||
|  | Christian Muehlhaeuser <muesli@gmail.com> | ||||||
| Christoph Sassenberg <defsprite@gmail.com> | Christoph Sassenberg <defsprite@gmail.com> | ||||||
| Colin Misare <github.com/cmisare> | Colin Misare <github.com/cmisare> | ||||||
| Craig Peterson <cpeterson@stackoverflow.com> | Craig Peterson <cpeterson@stackoverflow.com> | ||||||
| @@ -61,10 +76,14 @@ Cristian Maglie <c.maglie@bug.st> | |||||||
| Daehyeok Mun <daehyeok@gmail.com> | Daehyeok Mun <daehyeok@gmail.com> | ||||||
| Daniel Leavitt <daniel.leavitt@gmail.com> | Daniel Leavitt <daniel.leavitt@gmail.com> | ||||||
| Daniel Nilsson <daniel.nilsson1989@gmail.com> | Daniel Nilsson <daniel.nilsson1989@gmail.com> | ||||||
|  | Daoq <masseto2002@gmail.com> | ||||||
| Dave Du Cros <davidducros@gmail.com> | Dave Du Cros <davidducros@gmail.com> | ||||||
| Dave Henderson <dhenderson@gmail.com> | Dave Henderson <dhenderson@gmail.com> | ||||||
|  | Dave Protasowski <dprotaso@gmail.com> | ||||||
| David Deng <daviddengcn@gmail.com> | David Deng <daviddengcn@gmail.com> | ||||||
| David Jannotta <djannotta@gmail.com> | David Jannotta <djannotta@gmail.com> | ||||||
|  | David Ji <github.com/davidji99> | ||||||
|  | David Lopez Reyes <davidlopezre@gmail.com> | ||||||
| Davide Zipeto <dawez1@gmail.com> | Davide Zipeto <dawez1@gmail.com> | ||||||
| Dennis Webb <dennis@bluesentryit.com> | Dennis Webb <dennis@bluesentryit.com> | ||||||
| Dhi Aurrahman <diorahman@rockybars.com> | Dhi Aurrahman <diorahman@rockybars.com> | ||||||
| @@ -74,22 +93,26 @@ dmnlk <seikima2demon@gmail.com> | |||||||
| Don Petersen <don@donpetersen.net> | Don Petersen <don@donpetersen.net> | ||||||
| Doug Turner <doug.turner@gmail.com> | Doug Turner <doug.turner@gmail.com> | ||||||
| Drew Fradette <drew.fradette@gmail.com> | Drew Fradette <drew.fradette@gmail.com> | ||||||
|  | Eivind <eivindkn@gmail.com> | ||||||
| Eli Uriegas <seemethere101@gmail.com> | Eli Uriegas <seemethere101@gmail.com> | ||||||
| Elliott Beach <elliott2.71828@gmail.com> | Elliott Beach <elliott2.71828@gmail.com> | ||||||
| Emerson Wood <emersonwood94@gmail.com> | Emerson Wood <emersonwood94@gmail.com> | ||||||
| eperm <staffordworrell@gmail.com> | eperm <staffordworrell@gmail.com> | ||||||
| Erick Fejta <erick@fejta.com> | Erick Fejta <erick@fejta.com> | ||||||
| erwinvaneyk <erwinvaneyk@gmail.com> | erwinvaneyk <erwinvaneyk@gmail.com> | ||||||
|  | Evan Elias <evanjelias@gmail.com> | ||||||
| Fabrice <fabrice.vaillant@student.ecp.fr> | Fabrice <fabrice.vaillant@student.ecp.fr> | ||||||
| Felix Geisendörfer <felix@debuggable.com> | Felix Geisendörfer <felix@debuggable.com> | ||||||
| Filippo Valsorda <hi@filippo.io> | Filippo Valsorda <hi@filippo.io> | ||||||
| Florian Forster <ff@octo.it> | Florian Forster <ff@octo.it> | ||||||
| Francesc Gil <xescugil@gmail.com> | Francesc Gil <xescugil@gmail.com> | ||||||
| Francis <hello@francismakes.com> | Francis <hello@francismakes.com> | ||||||
|  | Francisco Guimarães <francisco.cpg@gmail.com> | ||||||
| Fredrik Jönsson <fredrik.jonsson@izettle.com> | Fredrik Jönsson <fredrik.jonsson@izettle.com> | ||||||
| Garrett Squire <garrettsquire@gmail.com> | Garrett Squire <garrettsquire@gmail.com> | ||||||
| George Kontridze <george.kontridze@gmail.com> | George Kontridze <george.kontridze@gmail.com> | ||||||
| Georgy Buranov <gburanov@gmail.com> | Georgy Buranov <gburanov@gmail.com> | ||||||
|  | Glen Mailer <glenjamin@gmail.com> | ||||||
| Gnahz <p@oath.pl> | Gnahz <p@oath.pl> | ||||||
| Google Inc. | Google Inc. | ||||||
| Grachev Mikhail <work@mgrachev.com> | Grachev Mikhail <work@mgrachev.com> | ||||||
| @@ -99,13 +122,16 @@ Guz Alexander <kalimatas@gmail.com> | |||||||
| Guðmundur Bjarni Ólafsson <gudmundur@github.com> | Guðmundur Bjarni Ólafsson <gudmundur@github.com> | ||||||
| Hanno Hecker <hanno.hecker@zalando.de> | Hanno Hecker <hanno.hecker@zalando.de> | ||||||
| Hari haran <hariharan.uno@gmail.com> | Hari haran <hariharan.uno@gmail.com> | ||||||
|  | haya14busa <haya14busa@gmail.com> | ||||||
| haya14busa <hayabusa1419@gmail.com> | haya14busa <hayabusa1419@gmail.com> | ||||||
| Huy Tr <kingbazoka@gmail.com> | Huy Tr <kingbazoka@gmail.com> | ||||||
| huydx <doxuanhuy@gmail.com> | huydx <doxuanhuy@gmail.com> | ||||||
| i2bskn <i2bskn@gmail.com> | i2bskn <i2bskn@gmail.com> | ||||||
|  | Ioannis Georgoulas <igeorgoulas21@gmail.com> | ||||||
| Isao Jonas <isao.jonas@gmail.com> | Isao Jonas <isao.jonas@gmail.com> | ||||||
| isqua <isqua@isqua.ru> | isqua <isqua@isqua.ru> | ||||||
| Jameel Haffejee <RC1140@republiccommandos.co.za> | Jameel Haffejee <RC1140@republiccommandos.co.za> | ||||||
|  | James Cockbain <james.cockbain@ibm.com> | ||||||
| Jan Kosecki <jan.kosecki91@gmail.com> | Jan Kosecki <jan.kosecki91@gmail.com> | ||||||
| Javier Campanini <jcampanini@palantir.com> | Javier Campanini <jcampanini@palantir.com> | ||||||
| Jens Rantil <jens.rantil@gmail.com> | Jens Rantil <jens.rantil@gmail.com> | ||||||
| @@ -117,6 +143,7 @@ Joan Saum <joan.saum@epitech.eu> | |||||||
| Joe Tsai <joetsai@digital-static.net> | Joe Tsai <joetsai@digital-static.net> | ||||||
| John Barton <jrbarton@gmail.com> | John Barton <jrbarton@gmail.com> | ||||||
| John Engelman <john.r.engelman@gmail.com> | John Engelman <john.r.engelman@gmail.com> | ||||||
|  | Jordan Brockopp <jdbro94@gmail.com> | ||||||
| Jordan Sussman <jordansail22@gmail.com> | Jordan Sussman <jordansail22@gmail.com> | ||||||
| Joshua Bezaleel Abednego <joshua.bezaleel@gmail.com> | Joshua Bezaleel Abednego <joshua.bezaleel@gmail.com> | ||||||
| JP Phillips <jonphill9@gmail.com> | JP Phillips <jonphill9@gmail.com> | ||||||
| @@ -124,11 +151,12 @@ jpbelanger-mtl <jp.belanger@gmail.com> | |||||||
| Juan Basso <jrbasso@gmail.com> | Juan Basso <jrbasso@gmail.com> | ||||||
| Julien Garcia Gonzalez <garciagonzalez.julien@gmail.com> | Julien Garcia Gonzalez <garciagonzalez.julien@gmail.com> | ||||||
| Julien Rostand <jrostand@users.noreply.github.com> | Julien Rostand <jrostand@users.noreply.github.com> | ||||||
|  | Junya Kono <junya03dance@gmail.com> | ||||||
| Justin Abrahms <justin@abrah.ms> | Justin Abrahms <justin@abrah.ms> | ||||||
| Jusung Lee <e.jusunglee@gmail.com> | Jusung Lee <e.jusunglee@gmail.com> | ||||||
| jzhoucliqr <jzhou@cliqr.com> | jzhoucliqr <jzhou@cliqr.com> | ||||||
|  | kadern0 <kaderno@gmail.com> | ||||||
| Katrina Owen <kytrinyx@github.com> | Katrina Owen <kytrinyx@github.com> | ||||||
| Kautilya Tripathi < tripathi.kautilya@gmail.com> |  | ||||||
| Kautilya Tripathi <tripathi.kautilya@gmail.com> | Kautilya Tripathi <tripathi.kautilya@gmail.com> | ||||||
| Keita Urashima <ursm@ursm.jp> | Keita Urashima <ursm@ursm.jp> | ||||||
| Kevin Burke <kev@inburke.com> | Kevin Burke <kev@inburke.com> | ||||||
| @@ -137,15 +165,21 @@ Kookheon Kwon <kucuny@gmail.com> | |||||||
| Krzysztof Kowalczyk <kkowalczyk@gmail.com> | Krzysztof Kowalczyk <kkowalczyk@gmail.com> | ||||||
| Kshitij Saraogi <KshitijSaraogi@gmail.com> | Kshitij Saraogi <KshitijSaraogi@gmail.com> | ||||||
| kyokomi <kyoko1220adword@gmail.com> | kyokomi <kyoko1220adword@gmail.com> | ||||||
|  | Laurent Verdoïa <verdoialaurent@gmail.com> | ||||||
|  | Liam Galvin <liam@liam-galvin.co.uk> | ||||||
| Lovro Mažgon <lovro.mazgon@gmail.com> | Lovro Mažgon <lovro.mazgon@gmail.com> | ||||||
| Lucas Alcantara <lucasalcantaraf@gmail.com> | Lucas Alcantara <lucasalcantaraf@gmail.com> | ||||||
| Luke Evers <me@lukevers.com> | Luke Evers <me@lukevers.com> | ||||||
| Luke Kysow <lkysow@gmail.com> | Luke Kysow <lkysow@gmail.com> | ||||||
| Luke Roberts <email@luke-roberts.co.uk> | Luke Roberts <email@luke-roberts.co.uk> | ||||||
| Luke Young <luke@hydrantlabs.org> | Luke Young <luke@hydrantlabs.org> | ||||||
|  | lynn [they] <lynncyrin@gmail.com> | ||||||
| Maksim Zhylinski <uzzable@gmail.com> | Maksim Zhylinski <uzzable@gmail.com> | ||||||
|  | Mark Tareshawty <tarebyte@github.com> | ||||||
| Martin-Louis Bright <mlbright@gmail.com> | Martin-Louis Bright <mlbright@gmail.com> | ||||||
|  | Martins Sipenko <martins.sipenko@gmail.com> | ||||||
| Marwan Sulaiman <marwan.sameer@gmail.com> | Marwan Sulaiman <marwan.sameer@gmail.com> | ||||||
|  | Masayuki Izumi <m@izum.in> | ||||||
| Mat Geist <matgeist@gmail.com> | Mat Geist <matgeist@gmail.com> | ||||||
| Matt <alpmatthew@gmail.com> | Matt <alpmatthew@gmail.com> | ||||||
| Matt Brender <mjbrender@gmail.com> | Matt Brender <mjbrender@gmail.com> | ||||||
| @@ -155,6 +189,7 @@ Maxime Bury <maxime.bury@gmail.com> | |||||||
| Michael Spiegel <michael.m.spiegel@gmail.com> | Michael Spiegel <michael.m.spiegel@gmail.com> | ||||||
| Michael Tiller <michael.tiller@gmail.com> | Michael Tiller <michael.tiller@gmail.com> | ||||||
| Michał Glapa <michal.glapa@gmail.com> | Michał Glapa <michal.glapa@gmail.com> | ||||||
|  | Nadav Kaner <nadavkaner1@gmail.com> | ||||||
| Nathan VanBenschoten <nvanbenschoten@gmail.com> | Nathan VanBenschoten <nvanbenschoten@gmail.com> | ||||||
| Navaneeth Suresh <navaneeths1998@gmail.com> | Navaneeth Suresh <navaneeths1998@gmail.com> | ||||||
| Neil O'Toole <neilotoole@apache.org> | Neil O'Toole <neilotoole@apache.org> | ||||||
| @@ -163,6 +198,7 @@ Nick Spragg <nick.spragg@bbc.co.uk> | |||||||
| Nikhita Raghunath <nikitaraghunath@gmail.com> | Nikhita Raghunath <nikitaraghunath@gmail.com> | ||||||
| Noah Zoschke <noah+sso2@convox.com> | Noah Zoschke <noah+sso2@convox.com> | ||||||
| ns-cweber <cweber@narrativescience.com> | ns-cweber <cweber@narrativescience.com> | ||||||
|  | Ole Orhagen <ole.orhagen@northern.tech> | ||||||
| Oleg Kovalov <iamolegkovalov@gmail.com> | Oleg Kovalov <iamolegkovalov@gmail.com> | ||||||
| Ondřej Kupka <ondra.cap@gmail.com> | Ondřej Kupka <ondra.cap@gmail.com> | ||||||
| Palash Nigam <npalash25@gmail.com> | Palash Nigam <npalash25@gmail.com> | ||||||
| @@ -170,29 +206,43 @@ Panagiotis Moustafellos <pmoust@gmail.com> | |||||||
| Parham Alvani <parham.alvani@gmail.com> | Parham Alvani <parham.alvani@gmail.com> | ||||||
| Parker Moore <parkrmoore@gmail.com> | Parker Moore <parkrmoore@gmail.com> | ||||||
| parkhyukjun89 <park.hyukjun89@gmail.com> | parkhyukjun89 <park.hyukjun89@gmail.com> | ||||||
|  | Patrick DeVivo <patrick.devivo@gmail.com> | ||||||
|  | Patrick Marabeas <patrick@marabeas.io> | ||||||
| Pavel Shtanko <pavel.shtanko@gmail.com> | Pavel Shtanko <pavel.shtanko@gmail.com> | ||||||
| Pete Wagner <thepwagner@github.com> | Pete Wagner <thepwagner@github.com> | ||||||
| Petr Shevtsov <petr.shevtsov@gmail.com> | Petr Shevtsov <petr.shevtsov@gmail.com> | ||||||
| Pierre Carrier <pierre@meteor.com> | Pierre Carrier <pierre@meteor.com> | ||||||
| Piotr Zurek <p.zurek@gmail.com> | Piotr Zurek <p.zurek@gmail.com> | ||||||
|  | Pratik Mallya <pratik.mallya@gmail.com> | ||||||
|  | Qais Patankar <qaisjp@gmail.com> | ||||||
|  | Quang Le Hong <iamquang95@gmail.com> | ||||||
|  | Quentin Leffray <fiahil@gmail.com> | ||||||
| Quinn Slack <qslack@qslack.com> | Quinn Slack <qslack@qslack.com> | ||||||
| Rackspace US, Inc. | Rackspace US, Inc. | ||||||
| Radek Simko <radek.simko@gmail.com> | Radek Simko <radek.simko@gmail.com> | ||||||
| Radliński Ignacy <radlinsk@student.agh.edu.pl> | Radliński Ignacy <radlinsk@student.agh.edu.pl> | ||||||
|  | Rajat Jindal <rajatjindal83@gmail.com> | ||||||
| Rajendra arora <rajendraarora16@yahoo.com> | Rajendra arora <rajendraarora16@yahoo.com> | ||||||
|  | Ranbir Singh <binkkatal.r@gmail.com> | ||||||
|  | Ravi Shekhar Jethani <rsjethani@gmail.com> | ||||||
| RaviTeja Pothana <ravi-teja@live.com> | RaviTeja Pothana <ravi-teja@live.com> | ||||||
| rc1140 <jameel@republiccommandos.co.za> | rc1140 <jameel@republiccommandos.co.za> | ||||||
| Red Hat, Inc. | Red Hat, Inc. | ||||||
|  | Reinier Timmer <reinier.timmer@ah.nl> | ||||||
|  | Ricco Førgaard <ricco@fiskeben.dk> | ||||||
| Rob Figueiredo <robfig@yext.com> | Rob Figueiredo <robfig@yext.com> | ||||||
| Rohit Upadhyay <urohit011@gmail.com> | Rohit Upadhyay <urohit011@gmail.com> | ||||||
| Ronak Jain <ronakjain@outlook.in> | Ronak Jain <ronakjain@outlook.in> | ||||||
| Ruben Vereecken <rubenvereecken@gmail.com> | Ruben Vereecken <rubenvereecken@gmail.com> | ||||||
| Ryan Leung <rleungx@gmail.com> | Ryan Leung <rleungx@gmail.com> | ||||||
| Ryan Lower <rpjlower@gmail.com> | Ryan Lower <rpjlower@gmail.com> | ||||||
|  | Ryo Nakao <nakabonne@gmail.com> | ||||||
|  | Safwan Olaimat <safwan.olaimat@gmail.com> | ||||||
| Sahil Dua <sahildua2305@gmail.com> | Sahil Dua <sahildua2305@gmail.com> | ||||||
| saisi <saisi@users.noreply.github.com> | saisi <saisi@users.noreply.github.com> | ||||||
| Sam Minnée <sam@silverstripe.com> | Sam Minnée <sam@silverstripe.com> | ||||||
| Sandeep Sukhani <sandeep.d.sukhani@gmail.com> | Sandeep Sukhani <sandeep.d.sukhani@gmail.com> | ||||||
|  | Sander Knape <s.knape88@gmail.com> | ||||||
| Sander van Harmelen <svanharmelen@schubergphilis.com> | Sander van Harmelen <svanharmelen@schubergphilis.com> | ||||||
| Sanket Payghan <sanket.payghan8@gmail.com> | Sanket Payghan <sanket.payghan8@gmail.com> | ||||||
| Sarasa Kisaragi <lingsamuelgrace@gmail.com> | Sarasa Kisaragi <lingsamuelgrace@gmail.com> | ||||||
| @@ -200,30 +250,46 @@ Sean Wang <sean@decrypted.org> | |||||||
| Sebastian Mandrean <sebastian.mandrean@gmail.com> | Sebastian Mandrean <sebastian.mandrean@gmail.com> | ||||||
| Sebastian Mæland Pedersen <sem.pedersen@stud.uis.no> | Sebastian Mæland Pedersen <sem.pedersen@stud.uis.no> | ||||||
| Sergey Romanov <xxsmotur@gmail.com> | Sergey Romanov <xxsmotur@gmail.com> | ||||||
|  | Sergio Garcia <sergio.garcia@gmail.com> | ||||||
| Sevki <s@sevki.org> | Sevki <s@sevki.org> | ||||||
| Shagun Khemka <shagun.khemka60@gmail.com> | Shagun Khemka <shagun.khemka60@gmail.com> | ||||||
| shakeelrao <shakeelrao79@gmail.com> | shakeelrao <shakeelrao79@gmail.com> | ||||||
| Shawn Catanzarite <me@shawncatz.com> | Shawn Catanzarite <me@shawncatz.com> | ||||||
| Shawn Smith <shawnpsmith@gmail.com> | Shawn Smith <shawnpsmith@gmail.com> | ||||||
|  | Shibasis Patel <patelshibasis@gmail.com> | ||||||
|  | Shrikrishna Singh <krishnasingh.ss30@gmail.com> | ||||||
| sona-tar <sona.zip@gmail.com> | sona-tar <sona.zip@gmail.com> | ||||||
| SoundCloud, Ltd. | SoundCloud, Ltd. | ||||||
| Sridhar Mocherla <srmocher@microsoft.com> | Sridhar Mocherla <srmocher@microsoft.com> | ||||||
|  | SriVignessh Pss <sriknowledge@gmail.com> | ||||||
|  | Stefan Sedich <stefan.sedich@gmail.com> | ||||||
| Stian Eikeland <stian@eikeland.se> | Stian Eikeland <stian@eikeland.se> | ||||||
|  | Suhaib Mujahid <suhaibmujahid@gmail.com> | ||||||
|  | Szymon Kodrebski <simonkey007@gmail.com> | ||||||
|  | Takayuki Watanabe <takanabe.w@gmail.com> | ||||||
|  | Taketoshi Fujiwara <taketoshi.fujiwara@gmail.com> | ||||||
| Tasya Aditya Rukmana <tadityar@gmail.com> | Tasya Aditya Rukmana <tadityar@gmail.com> | ||||||
| Thomas Bruyelle <thomas.bruyelle@gmail.com> | Thomas Bruyelle <thomas.bruyelle@gmail.com> | ||||||
| Timothée Peignier <timothee.peignier@tryphon.org> | Timothée Peignier <timothee.peignier@tryphon.org> | ||||||
|  | tkhandel <tarunkhandelwal.iitr@gmail.com> | ||||||
| Trey Tacon <ttacon@gmail.com> | Trey Tacon <ttacon@gmail.com> | ||||||
| ttacon <ttacon@gmail.com> | ttacon <ttacon@gmail.com> | ||||||
|  | Vaibhav Singh <vaibhav.singh.14cse@bml.edu.in> | ||||||
| Varadarajan Aravamudhan <varadaraajan@gmail.com> | Varadarajan Aravamudhan <varadaraajan@gmail.com> | ||||||
| Victor Castell <victor@victorcastell.com> | Victor Castell <victor@victorcastell.com> | ||||||
| Victor Vrantchan <vrancean+github@gmail.com> | Victor Vrantchan <vrancean+github@gmail.com> | ||||||
|  | vikkyomkar <vikky.omkar@samsung.com> | ||||||
| Vlad Ungureanu <vladu@palantir.com> | Vlad Ungureanu <vladu@palantir.com> | ||||||
| Wasim Thabraze <wasim@thabraze.me> | Wasim Thabraze <wasim@thabraze.me> | ||||||
|  | Weslei Juan Moser Pereira <wesleimsr@gmail.com> | ||||||
| Will Maier <wcmaier@gmail.com> | Will Maier <wcmaier@gmail.com> | ||||||
|  | Willem D'Haeseleer <dhwillem@gmail.com> | ||||||
| William Bailey <mail@williambailey.org.uk> | William Bailey <mail@williambailey.org.uk> | ||||||
|  | William Cooke <pipeston@gmail.com> | ||||||
| xibz <impactbchang@gmail.com> | xibz <impactbchang@gmail.com> | ||||||
| Yann Malet <yann.malet@gmail.com> | Yann Malet <yann.malet@gmail.com> | ||||||
| Yannick Utard <yannickutard@gmail.com> | Yannick Utard <yannickutard@gmail.com> | ||||||
| Yicheng Qin <qycqycqycqycqyc@gmail.com> | Yicheng Qin <qycqycqycqycqyc@gmail.com> | ||||||
|  | Yosuke Akatsuka <yosuke.akatsuka@access-company.com> | ||||||
| Yumikiyo Osanai <yumios.art@gmail.com> | Yumikiyo Osanai <yumios.art@gmail.com> | ||||||
| Zach Latta <zach@zachlatta.com> | Zach Latta <zach@zachlatta.com> | ||||||
							
								
								
									
										12
									
								
								vendor/github.com/google/go-github/v32/github/actions.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/google/go-github/v32/github/actions.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | // Copyright 2020 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 | ||||||
|  |  | ||||||
|  | // ActionsService handles communication with the actions related | ||||||
|  | // methods of the GitHub API. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/ | ||||||
|  | type ActionsService service | ||||||
							
								
								
									
										164
									
								
								vendor/github.com/google/go-github/v32/github/actions_artifacts.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								vendor/github.com/google/go-github/v32/github/actions_artifacts.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | |||||||
|  | // Copyright 2020 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"net/http" | ||||||
|  | 	"net/url" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Artifact reprents a GitHub artifact.  Artifacts allow sharing | ||||||
|  | // data between jobs in a workflow and provide storage for data | ||||||
|  | // once a workflow is complete. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/artifacts/ | ||||||
|  | type Artifact struct { | ||||||
|  | 	ID                 *int64     `json:"id,omitempty"` | ||||||
|  | 	NodeID             *string    `json:"node_id,omitempty"` | ||||||
|  | 	Name               *string    `json:"name,omitempty"` | ||||||
|  | 	SizeInBytes        *int64     `json:"size_in_bytes,omitempty"` | ||||||
|  | 	ArchiveDownloadURL *string    `json:"archive_download_url,omitempty"` | ||||||
|  | 	Expired            *bool      `json:"expired,omitempty"` | ||||||
|  | 	CreatedAt          *Timestamp `json:"created_at,omitempty"` | ||||||
|  | 	ExpiresAt          *Timestamp `json:"expires_at,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ArtifactList represents a list of GitHub artifacts. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/artifacts/ | ||||||
|  | type ArtifactList struct { | ||||||
|  | 	TotalCount *int64      `json:"total_count,omitempty"` | ||||||
|  | 	Artifacts  []*Artifact `json:"artifacts,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListArtifacts lists all artifacts that belong to a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/artifacts/#list-artifacts-for-a-repository | ||||||
|  | func (s *ActionsService) ListArtifacts(ctx context.Context, owner, repo string, opts *ListOptions) (*ArtifactList, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/artifacts", owner, repo) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	artifactList := new(ArtifactList) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, artifactList) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return artifactList, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListWorkflowRunArtifacts lists all artifacts that belong to a workflow run. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/artifacts/#list-workflow-run-artifacts | ||||||
|  | func (s *ActionsService) ListWorkflowRunArtifacts(ctx context.Context, owner, repo string, runID int64, opts *ListOptions) (*ArtifactList, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/artifacts", owner, repo, runID) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	artifactList := new(ArtifactList) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, artifactList) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return artifactList, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetArtifact gets a specific artifact for a workflow run. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/artifacts/#get-an-artifact | ||||||
|  | func (s *ActionsService) GetArtifact(ctx context.Context, owner, repo string, artifactID int64) (*Artifact, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v", owner, repo, artifactID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	artifact := new(Artifact) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, artifact) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return artifact, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DownloadArtifact gets a redirect URL to download an archive for a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/artifacts/#download-an-artifact | ||||||
|  | func (s *ActionsService) DownloadArtifact(ctx context.Context, owner, repo string, artifactID int64, followRedirects bool) (*url.URL, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v/zip", owner, repo, artifactID) | ||||||
|  |  | ||||||
|  | 	resp, err := s.getDownloadArtifactFromURL(ctx, u, followRedirects) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if resp.StatusCode != http.StatusFound { | ||||||
|  | 		return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) | ||||||
|  | 	} | ||||||
|  | 	parsedURL, err := url.Parse(resp.Header.Get("Location")) | ||||||
|  | 	return parsedURL, newResponse(resp), nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *ActionsService) getDownloadArtifactFromURL(ctx context.Context, u string, followRedirects bool) (*http.Response, error) { | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var resp *http.Response | ||||||
|  | 	// Use http.DefaultTransport if no custom Transport is configured | ||||||
|  | 	req = withContext(ctx, req) | ||||||
|  | 	if s.client.client.Transport == nil { | ||||||
|  | 		resp, err = http.DefaultTransport.RoundTrip(req) | ||||||
|  | 	} else { | ||||||
|  | 		resp, err = s.client.client.Transport.RoundTrip(req) | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	resp.Body.Close() | ||||||
|  |  | ||||||
|  | 	// If redirect response is returned, follow it | ||||||
|  | 	if followRedirects && resp.StatusCode == http.StatusMovedPermanently { | ||||||
|  | 		u = resp.Header.Get("Location") | ||||||
|  | 		resp, err = s.getDownloadArtifactFromURL(ctx, u, false) | ||||||
|  | 	} | ||||||
|  | 	return resp, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteArtifact deletes a workflow run artifact. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/artifacts/#delete-an-artifact | ||||||
|  | func (s *ActionsService) DeleteArtifact(ctx context.Context, owner, repo string, artifactID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v", owner, repo, artifactID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
							
								
								
									
										277
									
								
								vendor/github.com/google/go-github/v32/github/actions_runners.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										277
									
								
								vendor/github.com/google/go-github/v32/github/actions_runners.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,277 @@ | |||||||
|  | // Copyright 2020 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // RunnerApplicationDownload represents a binary for the self-hosted runner application that can be downloaded. | ||||||
|  | type RunnerApplicationDownload struct { | ||||||
|  | 	OS           *string `json:"os,omitempty"` | ||||||
|  | 	Architecture *string `json:"architecture,omitempty"` | ||||||
|  | 	DownloadURL  *string `json:"download_url,omitempty"` | ||||||
|  | 	Filename     *string `json:"filename,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListRunnerApplicationDownloads lists self-hosted runner application binaries that can be downloaded and run. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#list-runner-applications-for-a-repository | ||||||
|  | func (s *ActionsService) ListRunnerApplicationDownloads(ctx context.Context, owner, repo string) ([]*RunnerApplicationDownload, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runners/downloads", owner, repo) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var rads []*RunnerApplicationDownload | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &rads) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return rads, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RegistrationToken represents a token that can be used to add a self-hosted runner to a repository. | ||||||
|  | type RegistrationToken struct { | ||||||
|  | 	Token     *string    `json:"token,omitempty"` | ||||||
|  | 	ExpiresAt *Timestamp `json:"expires_at,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateRegistrationToken creates a token that can be used to add a self-hosted runner. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#create-a-registration-token-for-a-repository | ||||||
|  | func (s *ActionsService) CreateRegistrationToken(ctx context.Context, owner, repo string) (*RegistrationToken, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runners/registration-token", owner, repo) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	registrationToken := new(RegistrationToken) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, registrationToken) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return registrationToken, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Runner represents a self-hosted runner registered with a repository. | ||||||
|  | type Runner struct { | ||||||
|  | 	ID     *int64  `json:"id,omitempty"` | ||||||
|  | 	Name   *string `json:"name,omitempty"` | ||||||
|  | 	OS     *string `json:"os,omitempty"` | ||||||
|  | 	Status *string `json:"status,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Runners represents a collection of self-hosted runners for a repository. | ||||||
|  | type Runners struct { | ||||||
|  | 	TotalCount int       `json:"total_count"` | ||||||
|  | 	Runners    []*Runner `json:"runners"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListRunners lists all the self-hosted runners for a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#list-self-hosted-runners-for-a-repository | ||||||
|  | func (s *ActionsService) ListRunners(ctx context.Context, owner, repo string, opts *ListOptions) (*Runners, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runners", owner, repo) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	runners := &Runners{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &runners) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return runners, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetRunner gets a specific self-hosted runner for a repository using its runner ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#get-a-self-hosted-runner-for-a-repository | ||||||
|  | func (s *ActionsService) GetRunner(ctx context.Context, owner, repo string, runnerID int64) (*Runner, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runners/%v", owner, repo, runnerID) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	runner := new(Runner) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, runner) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return runner, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RemoveToken represents a token that can be used to remove a self-hosted runner from a repository. | ||||||
|  | type RemoveToken struct { | ||||||
|  | 	Token     *string    `json:"token,omitempty"` | ||||||
|  | 	ExpiresAt *Timestamp `json:"expires_at,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateRemoveToken creates a token that can be used to remove a self-hosted runner from a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#create-a-remove-token-for-a-repository | ||||||
|  | func (s *ActionsService) CreateRemoveToken(ctx context.Context, owner, repo string) (*RemoveToken, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runners/remove-token", owner, repo) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	removeToken := new(RemoveToken) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, removeToken) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return removeToken, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RemoveRunner forces the removal of a self-hosted runner in a repository using the runner id. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#delete-a-self-hosted-runner-from-a-repository | ||||||
|  | func (s *ActionsService) RemoveRunner(ctx context.Context, owner, repo string, runnerID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runners/%v", owner, repo, runnerID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListOrganizationRunnerApplicationDownloads lists self-hosted runner application binaries that can be downloaded and run. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#list-runner-applications-for-an-organization | ||||||
|  | func (s *ActionsService) ListOrganizationRunnerApplicationDownloads(ctx context.Context, owner string) ([]*RunnerApplicationDownload, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/runners/downloads", owner) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var rads []*RunnerApplicationDownload | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &rads) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return rads, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateOrganizationRegistrationToken creates a token that can be used to add a self-hosted runner to an organization. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#create-a-registration-token-for-an-organization | ||||||
|  | func (s *ActionsService) CreateOrganizationRegistrationToken(ctx context.Context, owner string) (*RegistrationToken, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/runners/registration-token", owner) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	registrationToken := new(RegistrationToken) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, registrationToken) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return registrationToken, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListOrganizationRunners lists all the self-hosted runners for an organization. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#list-self-hosted-runners-for-an-organization | ||||||
|  | func (s *ActionsService) ListOrganizationRunners(ctx context.Context, owner string, opts *ListOptions) (*Runners, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/runners", owner) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	runners := &Runners{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &runners) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return runners, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetOrganizationRunner gets a specific self-hosted runner for an organization using its runner ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#get-a-self-hosted-runner-for-an-organization | ||||||
|  | func (s *ActionsService) GetOrganizationRunner(ctx context.Context, owner string, runnerID int64) (*Runner, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/runners/%v", owner, runnerID) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	runner := new(Runner) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, runner) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return runner, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateOrganizationRemoveToken creates a token that can be used to remove a self-hosted runner from an organization. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#create-a-remove-token-for-an-organization | ||||||
|  | func (s *ActionsService) CreateOrganizationRemoveToken(ctx context.Context, owner string) (*RemoveToken, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/runners/remove-token", owner) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	removeToken := new(RemoveToken) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, removeToken) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return removeToken, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RemoveOrganizationRunner forces the removal of a self-hosted runner from an organization using the runner id. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#delete-a-self-hosted-runner-from-an-organization | ||||||
|  | func (s *ActionsService) RemoveOrganizationRunner(ctx context.Context, owner string, runnerID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/runners/%v", owner, runnerID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
							
								
								
									
										299
									
								
								vendor/github.com/google/go-github/v32/github/actions_secrets.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										299
									
								
								vendor/github.com/google/go-github/v32/github/actions_secrets.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,299 @@ | |||||||
|  | // Copyright 2020 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // PublicKey represents the public key that should be used to encrypt secrets. | ||||||
|  | type PublicKey struct { | ||||||
|  | 	KeyID *string `json:"key_id"` | ||||||
|  | 	Key   *string `json:"key"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetRepoPublicKey gets a public key that should be used for secret encryption. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#get-a-repository-public-key | ||||||
|  | func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	pubKey := new(PublicKey) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, pubKey) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return pubKey, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetOrgPublicKey gets a public key that should be used for secret encryption. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#get-an-organization-public-key | ||||||
|  | func (s *ActionsService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	pubKey := new(PublicKey) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, pubKey) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return pubKey, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Secret represents a repository action secret. | ||||||
|  | type Secret struct { | ||||||
|  | 	Name                    string    `json:"name"` | ||||||
|  | 	CreatedAt               Timestamp `json:"created_at"` | ||||||
|  | 	UpdatedAt               Timestamp `json:"updated_at"` | ||||||
|  | 	Visibility              string    `json:"visibility,omitempty"` | ||||||
|  | 	SelectedRepositoriesURL string    `json:"selected_repositories_url,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Secrets represents one item from the ListSecrets response. | ||||||
|  | type Secrets struct { | ||||||
|  | 	TotalCount int       `json:"total_count"` | ||||||
|  | 	Secrets    []*Secret `json:"secrets"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListRepoSecrets lists all secrets available in a repository | ||||||
|  | // without revealing their encrypted values. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#list-repository-secrets | ||||||
|  | func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	secrets := new(Secrets) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &secrets) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return secrets, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetRepoSecret gets a single repository secret without revealing its encrypted value. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#get-a-repository-secret | ||||||
|  | func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	secret := new(Secret) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, secret) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return secret, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SelectedRepoIDs are the repository IDs that have access to the secret. | ||||||
|  | type SelectedRepoIDs []int64 | ||||||
|  |  | ||||||
|  | // EncryptedSecret represents a secret that is encrypted using a public key. | ||||||
|  | // | ||||||
|  | // The value of EncryptedValue must be your secret, encrypted with | ||||||
|  | // LibSodium (see documentation here: https://libsodium.gitbook.io/doc/bindings_for_other_languages) | ||||||
|  | // using the public key retrieved using the GetPublicKey method. | ||||||
|  | type EncryptedSecret struct { | ||||||
|  | 	Name                  string          `json:"-"` | ||||||
|  | 	KeyID                 string          `json:"key_id"` | ||||||
|  | 	EncryptedValue        string          `json:"encrypted_value"` | ||||||
|  | 	Visibility            string          `json:"visibility,omitempty"` | ||||||
|  | 	SelectedRepositoryIDs SelectedRepoIDs `json:"selected_repository_ids,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateOrUpdateRepoSecret creates or updates a repository secret with an encrypted value. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#create-or-update-a-repository-secret | ||||||
|  | func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, eSecret) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteRepoSecret deletes a secret in a repository using the secret name. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#delete-a-repository-secret | ||||||
|  | func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListOrgSecrets lists all secrets available in an organization | ||||||
|  | // without revealing their encrypted values. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#list-organization-secrets | ||||||
|  | func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/secrets", org) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	secrets := new(Secrets) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &secrets) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return secrets, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetOrgSecret gets a single organization secret without revealing its encrypted value. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#get-an-organization-secret | ||||||
|  | func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	secret := new(Secret) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, secret) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return secret, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#create-or-update-an-organization-secret | ||||||
|  | func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, eSecret) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SelectedReposList represents the list of repositories selected for an organization secret. | ||||||
|  | type SelectedReposList struct { | ||||||
|  | 	TotalCount   *int          `json:"total_count,omitempty"` | ||||||
|  | 	Repositories []*Repository `json:"repositories,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListSelectedReposForOrgSecret lists all repositories that have access to a secret. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#list-selected-repositories-for-an-organization-secret | ||||||
|  | func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string) (*SelectedReposList, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	result := new(SelectedReposList) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, result) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return result, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SetSelectedReposForOrgSecret sets the repositories that have access to a secret. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#set-selected-repositories-for-an-organization-secret | ||||||
|  | func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) | ||||||
|  |  | ||||||
|  | 	type repoIDs struct { | ||||||
|  | 		SelectedIDs SelectedRepoIDs `json:"selected_repository_ids,omitempty"` | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, repoIDs{SelectedIDs: ids}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // AddSelectedRepoToOrgSecret adds a repository to an organization secret. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#add-selected-repository-to-an-organization-secret | ||||||
|  | func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RemoveSelectedRepoFromOrgSecret removes a repository from an organization secret. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#remove-selected-repository-from-an-organization-secret | ||||||
|  | func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteOrgSecret deletes a secret in an organization using the secret name. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/secrets/#delete-an-organization-secret | ||||||
|  | func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
							
								
								
									
										149
									
								
								vendor/github.com/google/go-github/v32/github/actions_workflow_jobs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								vendor/github.com/google/go-github/v32/github/actions_workflow_jobs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,149 @@ | |||||||
|  | // Copyright 2020 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"net/http" | ||||||
|  | 	"net/url" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // TaskStep represents a single task step from a sequence of tasks of a job. | ||||||
|  | type TaskStep struct { | ||||||
|  | 	Name        *string    `json:"name,omitempty"` | ||||||
|  | 	Status      *string    `json:"status,omitempty"` | ||||||
|  | 	Conclusion  *string    `json:"conclusion,omitempty"` | ||||||
|  | 	Number      *int64     `json:"number,omitempty"` | ||||||
|  | 	StartedAt   *Timestamp `json:"started_at,omitempty"` | ||||||
|  | 	CompletedAt *Timestamp `json:"completed_at,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WorkflowJob represents a repository action workflow job. | ||||||
|  | type WorkflowJob struct { | ||||||
|  | 	ID          *int64      `json:"id,omitempty"` | ||||||
|  | 	RunID       *int64      `json:"run_id,omitempty"` | ||||||
|  | 	RunURL      *string     `json:"run_url,omitempty"` | ||||||
|  | 	NodeID      *string     `json:"node_id,omitempty"` | ||||||
|  | 	HeadSHA     *string     `json:"head_sha,omitempty"` | ||||||
|  | 	URL         *string     `json:"url,omitempty"` | ||||||
|  | 	HTMLURL     *string     `json:"html_url,omitempty"` | ||||||
|  | 	Status      *string     `json:"status,omitempty"` | ||||||
|  | 	Conclusion  *string     `json:"conclusion,omitempty"` | ||||||
|  | 	StartedAt   *Timestamp  `json:"started_at,omitempty"` | ||||||
|  | 	CompletedAt *Timestamp  `json:"completed_at,omitempty"` | ||||||
|  | 	Name        *string     `json:"name,omitempty"` | ||||||
|  | 	Steps       []*TaskStep `json:"steps,omitempty"` | ||||||
|  | 	CheckRunURL *string     `json:"check_run_url,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Jobs represents a slice of repository action workflow job. | ||||||
|  | type Jobs struct { | ||||||
|  | 	TotalCount *int           `json:"total_count,omitempty"` | ||||||
|  | 	Jobs       []*WorkflowJob `json:"jobs,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListWorkflowJobsOptions specifies optional parameters to ListWorkflowJobs. | ||||||
|  | type ListWorkflowJobsOptions struct { | ||||||
|  | 	// Filter specifies how jobs should be filtered by their completed_at timestamp. | ||||||
|  | 	// Possible values are: | ||||||
|  | 	//     latest - Returns jobs from the most recent execution of the workflow run | ||||||
|  | 	//     all - Returns all jobs for a workflow run, including from old executions of the workflow run | ||||||
|  | 	// | ||||||
|  | 	// Default value is "latest". | ||||||
|  | 	Filter string `url:"filter,omitempty"` | ||||||
|  | 	ListOptions | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListWorkflowJobs lists all jobs for a workflow run. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-jobs/#list-jobs-for-a-workflow-run | ||||||
|  | func (s *ActionsService) ListWorkflowJobs(ctx context.Context, owner, repo string, runID int64, opts *ListWorkflowJobsOptions) (*Jobs, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%s/%s/actions/runs/%v/jobs", owner, repo, runID) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	jobs := new(Jobs) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &jobs) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return jobs, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWorkflowJobByID gets a specific job in a workflow run by ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-jobs/#get-a-job-for-a-workflow-run | ||||||
|  | func (s *ActionsService) GetWorkflowJobByID(ctx context.Context, owner, repo string, jobID int64) (*WorkflowJob, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/jobs/%v", owner, repo, jobID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	job := new(WorkflowJob) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, job) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return job, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWorkflowJobLogs gets a redirect URL to download a plain text file of logs for a workflow job. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-jobs/#download-job-logs-for-a-workflow-run | ||||||
|  | func (s *ActionsService) GetWorkflowJobLogs(ctx context.Context, owner, repo string, jobID int64, followRedirects bool) (*url.URL, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/jobs/%v/logs", owner, repo, jobID) | ||||||
|  |  | ||||||
|  | 	resp, err := s.getWorkflowLogsFromURL(ctx, u, followRedirects) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if resp.StatusCode != http.StatusFound { | ||||||
|  | 		return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) | ||||||
|  | 	} | ||||||
|  | 	parsedURL, err := url.Parse(resp.Header.Get("Location")) | ||||||
|  | 	return parsedURL, newResponse(resp), err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *ActionsService) getWorkflowLogsFromURL(ctx context.Context, u string, followRedirects bool) (*http.Response, error) { | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var resp *http.Response | ||||||
|  | 	// Use http.DefaultTransport if no custom Transport is configured | ||||||
|  | 	req = withContext(ctx, req) | ||||||
|  | 	if s.client.client.Transport == nil { | ||||||
|  | 		resp, err = http.DefaultTransport.RoundTrip(req) | ||||||
|  | 	} else { | ||||||
|  | 		resp, err = s.client.client.Transport.RoundTrip(req) | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	resp.Body.Close() | ||||||
|  |  | ||||||
|  | 	// If redirect response is returned, follow it | ||||||
|  | 	if followRedirects && resp.StatusCode == http.StatusMovedPermanently { | ||||||
|  | 		u = resp.Header.Get("Location") | ||||||
|  | 		resp, err = s.getWorkflowLogsFromURL(ctx, u, false) | ||||||
|  | 	} | ||||||
|  | 	return resp, err | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										235
									
								
								vendor/github.com/google/go-github/v32/github/actions_workflow_runs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								vendor/github.com/google/go-github/v32/github/actions_workflow_runs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | |||||||
|  | // Copyright 2020 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"net/http" | ||||||
|  | 	"net/url" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // WorkflowRun represents a repository action workflow run. | ||||||
|  | type WorkflowRun struct { | ||||||
|  | 	ID             *int64         `json:"id,omitempty"` | ||||||
|  | 	NodeID         *string        `json:"node_id,omitempty"` | ||||||
|  | 	HeadBranch     *string        `json:"head_branch,omitempty"` | ||||||
|  | 	HeadSHA        *string        `json:"head_sha,omitempty"` | ||||||
|  | 	RunNumber      *int           `json:"run_number,omitempty"` | ||||||
|  | 	Event          *string        `json:"event,omitempty"` | ||||||
|  | 	Status         *string        `json:"status,omitempty"` | ||||||
|  | 	Conclusion     *string        `json:"conclusion,omitempty"` | ||||||
|  | 	WorkflowID     *int64         `json:"workflow_id,omitempty"` | ||||||
|  | 	URL            *string        `json:"url,omitempty"` | ||||||
|  | 	HTMLURL        *string        `json:"html_url,omitempty"` | ||||||
|  | 	PullRequests   []*PullRequest `json:"pull_requests,omitempty"` | ||||||
|  | 	CreatedAt      *Timestamp     `json:"created_at,omitempty"` | ||||||
|  | 	UpdatedAt      *Timestamp     `json:"updated_at,omitempty"` | ||||||
|  | 	JobsURL        *string        `json:"jobs_url,omitempty"` | ||||||
|  | 	LogsURL        *string        `json:"logs_url,omitempty"` | ||||||
|  | 	CheckSuiteURL  *string        `json:"check_suite_url,omitempty"` | ||||||
|  | 	ArtifactsURL   *string        `json:"artifacts_url,omitempty"` | ||||||
|  | 	CancelURL      *string        `json:"cancel_url,omitempty"` | ||||||
|  | 	RerunURL       *string        `json:"rerun_url,omitempty"` | ||||||
|  | 	HeadCommit     *HeadCommit    `json:"head_commit,omitempty"` | ||||||
|  | 	WorkflowURL    *string        `json:"workflow_url,omitempty"` | ||||||
|  | 	Repository     *Repository    `json:"repository,omitempty"` | ||||||
|  | 	HeadRepository *Repository    `json:"head_repository,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WorkflowRuns represents a slice of repository action workflow run. | ||||||
|  | type WorkflowRuns struct { | ||||||
|  | 	TotalCount   *int           `json:"total_count,omitempty"` | ||||||
|  | 	WorkflowRuns []*WorkflowRun `json:"workflow_runs,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListWorkflowRunsOptions specifies optional parameters to ListWorkflowRuns. | ||||||
|  | type ListWorkflowRunsOptions struct { | ||||||
|  | 	Actor  string `url:"actor,omitempty"` | ||||||
|  | 	Branch string `url:"branch,omitempty"` | ||||||
|  | 	Event  string `url:"event,omitempty"` | ||||||
|  | 	Status string `url:"status,omitempty"` | ||||||
|  | 	ListOptions | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WorkflowRunUsage represents a usage of a specific workflow run. | ||||||
|  | type WorkflowRunUsage struct { | ||||||
|  | 	Billable      *WorkflowRunEnvironment `json:"billable,omitempty"` | ||||||
|  | 	RunDurationMS *int64                  `json:"run_duration_ms,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WorkflowRunEnvironment represents different runner environments available for a workflow run. | ||||||
|  | type WorkflowRunEnvironment struct { | ||||||
|  | 	Ubuntu  *WorkflowRunBill `json:"UBUNTU,omitempty"` | ||||||
|  | 	MacOS   *WorkflowRunBill `json:"MACOS,omitempty"` | ||||||
|  | 	Windows *WorkflowRunBill `json:"WINDOWS,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WorkflowRunBill specifies billable time for a specific environment in a workflow run. | ||||||
|  | type WorkflowRunBill struct { | ||||||
|  | 	TotalMS *int64 `json:"total_ms,omitempty"` | ||||||
|  | 	Jobs    *int   `json:"jobs,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *ActionsService) listWorkflowRuns(ctx context.Context, endpoint string, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { | ||||||
|  | 	u, err := addOptions(endpoint, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	runs := new(WorkflowRuns) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &runs) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return runs, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListWorkflowRunsByID lists all workflow runs by workflow ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#list-workflow-runs | ||||||
|  | func (s *ActionsService) ListWorkflowRunsByID(ctx context.Context, owner, repo string, workflowID int64, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%s/%s/actions/workflows/%v/runs", owner, repo, workflowID) | ||||||
|  | 	return s.listWorkflowRuns(ctx, u, opts) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListWorkflowRunsByFileName lists all workflow runs by workflow file name. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#list-workflow-runs | ||||||
|  | func (s *ActionsService) ListWorkflowRunsByFileName(ctx context.Context, owner, repo, workflowFileName string, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%s/%s/actions/workflows/%v/runs", owner, repo, workflowFileName) | ||||||
|  | 	return s.listWorkflowRuns(ctx, u, opts) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListRepositoryWorkflowRuns lists all workflow runs for a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#list-workflow-runs-for-a-repository | ||||||
|  | func (s *ActionsService) ListRepositoryWorkflowRuns(ctx context.Context, owner, repo string, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%s/%s/actions/runs", owner, repo) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	runs := new(WorkflowRuns) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &runs) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return runs, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWorkflowRunByID gets a specific workflow run by ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#get-a-workflow-run | ||||||
|  | func (s *ActionsService) GetWorkflowRunByID(ctx context.Context, owner, repo string, runID int64) (*WorkflowRun, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runs/%v", owner, repo, runID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	run := new(WorkflowRun) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, run) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return run, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RerunWorkflow re-runs a workflow by ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#re-run-a-workflow | ||||||
|  | func (s *ActionsService) RerunWorkflowByID(ctx context.Context, owner, repo string, runID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/rerun", owner, repo, runID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CancelWorkflowRunByID cancels a workflow run by ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#cancel-a-workflow-run | ||||||
|  | func (s *ActionsService) CancelWorkflowRunByID(ctx context.Context, owner, repo string, runID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/cancel", owner, repo, runID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWorkflowRunLogs gets a redirect URL to download a plain text file of logs for a workflow run. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#download-workflow-run-logs | ||||||
|  | func (s *ActionsService) GetWorkflowRunLogs(ctx context.Context, owner, repo string, runID int64, followRedirects bool) (*url.URL, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/logs", owner, repo, runID) | ||||||
|  |  | ||||||
|  | 	resp, err := s.getWorkflowLogsFromURL(ctx, u, followRedirects) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if resp.StatusCode != http.StatusFound { | ||||||
|  | 		return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) | ||||||
|  | 	} | ||||||
|  | 	parsedURL, err := url.Parse(resp.Header.Get("Location")) | ||||||
|  | 	return parsedURL, newResponse(resp), err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteWorkflowRunLogs deletes all logs for a workflow run. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#delete-workflow-run-logs | ||||||
|  | func (s *ActionsService) DeleteWorkflowRunLogs(ctx context.Context, owner, repo string, runID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/logs", owner, repo, runID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWorkflowRunUsageByID gets a specific workflow usage run by run ID in the unit of billable milliseconds. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#get-workflow-run-usage | ||||||
|  | func (s *ActionsService) GetWorkflowRunUsageByID(ctx context.Context, owner, repo string, runID int64) (*WorkflowRunUsage, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/timing", owner, repo, runID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	workflowRunUsage := new(WorkflowRunUsage) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, workflowRunUsage) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return workflowRunUsage, resp, nil | ||||||
|  | } | ||||||
							
								
								
									
										138
									
								
								vendor/github.com/google/go-github/v32/github/actions_workflows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								vendor/github.com/google/go-github/v32/github/actions_workflows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | |||||||
|  | // Copyright 2020 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Workflow represents a repository action workflow. | ||||||
|  | type Workflow struct { | ||||||
|  | 	ID        *int64     `json:"id,omitempty"` | ||||||
|  | 	NodeID    *string    `json:"node_id,omitempty"` | ||||||
|  | 	Name      *string    `json:"name,omitempty"` | ||||||
|  | 	Path      *string    `json:"path,omitempty"` | ||||||
|  | 	State     *string    `json:"state,omitempty"` | ||||||
|  | 	CreatedAt *Timestamp `json:"created_at,omitempty"` | ||||||
|  | 	UpdatedAt *Timestamp `json:"updated_at,omitempty"` | ||||||
|  | 	URL       *string    `json:"url,omitempty"` | ||||||
|  | 	HTMLURL   *string    `json:"html_url,omitempty"` | ||||||
|  | 	BadgeURL  *string    `json:"badge_url,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Workflows represents a slice of repository action workflows. | ||||||
|  | type Workflows struct { | ||||||
|  | 	TotalCount *int        `json:"total_count,omitempty"` | ||||||
|  | 	Workflows  []*Workflow `json:"workflows,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WorkflowUsage represents a usage of a specific workflow. | ||||||
|  | type WorkflowUsage struct { | ||||||
|  | 	Billable *WorkflowEnvironment `json:"billable,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WorkflowEnvironment represents different runner environments available for a workflow. | ||||||
|  | type WorkflowEnvironment struct { | ||||||
|  | 	Ubuntu  *WorkflowBill `json:"UBUNTU,omitempty"` | ||||||
|  | 	MacOS   *WorkflowBill `json:"MACOS,omitempty"` | ||||||
|  | 	Windows *WorkflowBill `json:"WINDOWS,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // WorkflowBill specifies billable time for a specific environment in a workflow. | ||||||
|  | type WorkflowBill struct { | ||||||
|  | 	TotalMS *int64 `json:"total_ms,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListWorkflows lists all workflows in a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflows/#list-repository-workflows | ||||||
|  | func (s *ActionsService) ListWorkflows(ctx context.Context, owner, repo string, opts *ListOptions) (*Workflows, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%s/%s/actions/workflows", owner, repo) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	workflows := new(Workflows) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &workflows) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return workflows, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWorkflowByID gets a specific workflow by ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflows/#get-a-workflow | ||||||
|  | func (s *ActionsService) GetWorkflowByID(ctx context.Context, owner, repo string, workflowID int64) (*Workflow, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v", owner, repo, workflowID) | ||||||
|  |  | ||||||
|  | 	return s.getWorkflow(ctx, u) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWorkflowByFileName gets a specific workflow by file name. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflows/#get-a-workflow | ||||||
|  | func (s *ActionsService) GetWorkflowByFileName(ctx context.Context, owner, repo, workflowFileName string) (*Workflow, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v", owner, repo, workflowFileName) | ||||||
|  |  | ||||||
|  | 	return s.getWorkflow(ctx, u) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *ActionsService) getWorkflow(ctx context.Context, url string) (*Workflow, *Response, error) { | ||||||
|  | 	req, err := s.client.NewRequest("GET", url, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	workflow := new(Workflow) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, workflow) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return workflow, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWorkflowUsageByID gets a specific workflow usage by ID in the unit of billable milliseconds. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflows/#get-workflow-usage | ||||||
|  | func (s *ActionsService) GetWorkflowUsageByID(ctx context.Context, owner, repo string, workflowID int64) (*WorkflowUsage, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/timing", owner, repo, workflowID) | ||||||
|  |  | ||||||
|  | 	return s.getWorkflowUsage(ctx, u) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetWorkflowUsageByFileName gets a specific workflow usage by file name in the unit of billable milliseconds. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/actions/workflows/#get-workflow-usage | ||||||
|  | func (s *ActionsService) GetWorkflowUsageByFileName(ctx context.Context, owner, repo, workflowFileName string) (*WorkflowUsage, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/timing", owner, repo, workflowFileName) | ||||||
|  |  | ||||||
|  | 	return s.getWorkflowUsage(ctx, u) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *ActionsService) getWorkflowUsage(ctx context.Context, url string) (*WorkflowUsage, *Response, error) { | ||||||
|  | 	req, err := s.client.NewRequest("GET", url, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	workflowUsage := new(WorkflowUsage) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, workflowUsage) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return workflowUsage, resp, nil | ||||||
|  | } | ||||||
| @@ -29,13 +29,13 @@ type Feeds struct { | |||||||
| 	CurrentUserOrganizationURL  *string  `json:"current_user_organization_url,omitempty"` | 	CurrentUserOrganizationURL  *string  `json:"current_user_organization_url,omitempty"` | ||||||
| 	CurrentUserOrganizationURLs []string `json:"current_user_organization_urls,omitempty"` | 	CurrentUserOrganizationURLs []string `json:"current_user_organization_urls,omitempty"` | ||||||
| 	Links                       *struct { | 	Links                       *struct { | ||||||
| 		Timeline                 *FeedLink  `json:"timeline,omitempty"` | 		Timeline                 *FeedLink   `json:"timeline,omitempty"` | ||||||
| 		User                     *FeedLink  `json:"user,omitempty"` | 		User                     *FeedLink   `json:"user,omitempty"` | ||||||
| 		CurrentUserPublic        *FeedLink  `json:"current_user_public,omitempty"` | 		CurrentUserPublic        *FeedLink   `json:"current_user_public,omitempty"` | ||||||
| 		CurrentUser              *FeedLink  `json:"current_user,omitempty"` | 		CurrentUser              *FeedLink   `json:"current_user,omitempty"` | ||||||
| 		CurrentUserActor         *FeedLink  `json:"current_user_actor,omitempty"` | 		CurrentUserActor         *FeedLink   `json:"current_user_actor,omitempty"` | ||||||
| 		CurrentUserOrganization  *FeedLink  `json:"current_user_organization,omitempty"` | 		CurrentUserOrganization  *FeedLink   `json:"current_user_organization,omitempty"` | ||||||
| 		CurrentUserOrganizations []FeedLink `json:"current_user_organizations,omitempty"` | 		CurrentUserOrganizations []*FeedLink `json:"current_user_organizations,omitempty"` | ||||||
| 	} `json:"_links,omitempty"` | 	} `json:"_links,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -13,8 +13,8 @@ import ( | |||||||
| // ListEvents drinks from the firehose of all public events across GitHub. | // ListEvents drinks from the firehose of all public events across GitHub. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/#list-public-events | // GitHub API docs: https://developer.github.com/v3/activity/events/#list-public-events | ||||||
| func (s *ActivityService) ListEvents(ctx context.Context, opt *ListOptions) ([]*Event, *Response, error) { | func (s *ActivityService) ListEvents(ctx context.Context, opts *ListOptions) ([]*Event, *Response, error) { | ||||||
| 	u, err := addOptions("events", opt) | 	u, err := addOptions("events", opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -36,9 +36,9 @@ func (s *ActivityService) ListEvents(ctx context.Context, opt *ListOptions) ([]* | |||||||
| // ListRepositoryEvents lists events for a repository. | // ListRepositoryEvents lists events for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/#list-repository-events | // GitHub API docs: https://developer.github.com/v3/activity/events/#list-repository-events | ||||||
| func (s *ActivityService) ListRepositoryEvents(ctx context.Context, owner, repo string, opt *ListOptions) ([]*Event, *Response, error) { | func (s *ActivityService) ListRepositoryEvents(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Event, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/events", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/events", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -59,10 +59,10 @@ func (s *ActivityService) ListRepositoryEvents(ctx context.Context, owner, repo | |||||||
| 
 | 
 | ||||||
| // ListIssueEventsForRepository lists issue events for a repository. | // ListIssueEventsForRepository lists issue events for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/#list-issue-events-for-a-repository | // GitHub API docs: https://developer.github.com/v3/issues/events/#list-issue-events-for-a-repository | ||||||
| func (s *ActivityService) ListIssueEventsForRepository(ctx context.Context, owner, repo string, opt *ListOptions) ([]*IssueEvent, *Response, error) { | func (s *ActivityService) ListIssueEventsForRepository(ctx context.Context, owner, repo string, opts *ListOptions) ([]*IssueEvent, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/events", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/issues/events", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -84,9 +84,9 @@ func (s *ActivityService) ListIssueEventsForRepository(ctx context.Context, owne | |||||||
| // ListEventsForRepoNetwork lists public events for a network of repositories. | // ListEventsForRepoNetwork lists public events for a network of repositories. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-a-network-of-repositories | // GitHub API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-a-network-of-repositories | ||||||
| func (s *ActivityService) ListEventsForRepoNetwork(ctx context.Context, owner, repo string, opt *ListOptions) ([]*Event, *Response, error) { | func (s *ActivityService) ListEventsForRepoNetwork(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Event, *Response, error) { | ||||||
| 	u := fmt.Sprintf("networks/%v/%v/events", owner, repo) | 	u := fmt.Sprintf("networks/%v/%v/events", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -107,10 +107,10 @@ func (s *ActivityService) ListEventsForRepoNetwork(ctx context.Context, owner, r | |||||||
| 
 | 
 | ||||||
| // ListEventsForOrganization lists public events for an organization. | // ListEventsForOrganization lists public events for an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-an-organization | // GitHub API docs: https://developer.github.com/v3/activity/events/#list-public-organization-events | ||||||
| func (s *ActivityService) ListEventsForOrganization(ctx context.Context, org string, opt *ListOptions) ([]*Event, *Response, error) { | func (s *ActivityService) ListEventsForOrganization(ctx context.Context, org string, opts *ListOptions) ([]*Event, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/events", org) | 	u := fmt.Sprintf("orgs/%v/events", org) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -132,15 +132,16 @@ func (s *ActivityService) ListEventsForOrganization(ctx context.Context, org str | |||||||
| // ListEventsPerformedByUser lists the events performed by a user. If publicOnly is | // ListEventsPerformedByUser lists the events performed by a user. If publicOnly is | ||||||
| // true, only public events will be returned. | // true, only public events will be returned. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/#list-events-performed-by-a-user | // GitHub API docs: https://developer.github.com/v3/activity/events/#list-events-for-the-authenticated-user | ||||||
| func (s *ActivityService) ListEventsPerformedByUser(ctx context.Context, user string, publicOnly bool, opt *ListOptions) ([]*Event, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-a-user | ||||||
|  | func (s *ActivityService) ListEventsPerformedByUser(ctx context.Context, user string, publicOnly bool, opts *ListOptions) ([]*Event, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if publicOnly { | 	if publicOnly { | ||||||
| 		u = fmt.Sprintf("users/%v/events/public", user) | 		u = fmt.Sprintf("users/%v/events/public", user) | ||||||
| 	} else { | 	} else { | ||||||
| 		u = fmt.Sprintf("users/%v/events", user) | 		u = fmt.Sprintf("users/%v/events", user) | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -162,15 +163,16 @@ func (s *ActivityService) ListEventsPerformedByUser(ctx context.Context, user st | |||||||
| // ListEventsReceivedByUser lists the events received by a user. If publicOnly is | // ListEventsReceivedByUser lists the events received by a user. If publicOnly is | ||||||
| // true, only public events will be returned. | // true, only public events will be returned. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/#list-events-that-a-user-has-received | // GitHub API docs: https://developer.github.com/v3/activity/events/#list-events-received-by-the-authenticated-user | ||||||
| func (s *ActivityService) ListEventsReceivedByUser(ctx context.Context, user string, publicOnly bool, opt *ListOptions) ([]*Event, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/activity/events/#list-public-events-received-by-a-user | ||||||
|  | func (s *ActivityService) ListEventsReceivedByUser(ctx context.Context, user string, publicOnly bool, opts *ListOptions) ([]*Event, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if publicOnly { | 	if publicOnly { | ||||||
| 		u = fmt.Sprintf("users/%v/received_events/public", user) | 		u = fmt.Sprintf("users/%v/received_events/public", user) | ||||||
| 	} else { | 	} else { | ||||||
| 		u = fmt.Sprintf("users/%v/received_events", user) | 		u = fmt.Sprintf("users/%v/received_events", user) | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -192,10 +194,10 @@ func (s *ActivityService) ListEventsReceivedByUser(ctx context.Context, user str | |||||||
| // ListUserEventsForOrganization provides the user’s organization dashboard. You | // ListUserEventsForOrganization provides the user’s organization dashboard. You | ||||||
| // must be authenticated as the user to view this. | // must be authenticated as the user to view this. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/#list-events-for-an-organization | // GitHub API docs: https://developer.github.com/v3/activity/events/#list-organization-events-for-the-authenticated-user | ||||||
| func (s *ActivityService) ListUserEventsForOrganization(ctx context.Context, org, user string, opt *ListOptions) ([]*Event, *Response, error) { | func (s *ActivityService) ListUserEventsForOrganization(ctx context.Context, org, user string, opts *ListOptions) ([]*Event, *Response, error) { | ||||||
| 	u := fmt.Sprintf("users/%v/events/orgs/%v", user, org) | 	u := fmt.Sprintf("users/%v/events/orgs/%v", user, org) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -49,10 +49,10 @@ type NotificationListOptions struct { | |||||||
| 
 | 
 | ||||||
| // ListNotifications lists all notifications for the authenticated user. | // ListNotifications lists all notifications for the authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/notifications/#list-your-notifications | // GitHub API docs: https://developer.github.com/v3/activity/notifications/#list-notifications-for-the-authenticated-user | ||||||
| func (s *ActivityService) ListNotifications(ctx context.Context, opt *NotificationListOptions) ([]*Notification, *Response, error) { | func (s *ActivityService) ListNotifications(ctx context.Context, opts *NotificationListOptions) ([]*Notification, *Response, error) { | ||||||
| 	u := fmt.Sprintf("notifications") | 	u := fmt.Sprintf("notifications") | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -74,10 +74,10 @@ func (s *ActivityService) ListNotifications(ctx context.Context, opt *Notificati | |||||||
| // ListRepositoryNotifications lists all notifications in a given repository | // ListRepositoryNotifications lists all notifications in a given repository | ||||||
| // for the authenticated user. | // for the authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/notifications/#list-your-notifications-in-a-repository | // GitHub API docs: https://developer.github.com/v3/activity/notifications/#list-repository-notifications-for-the-authenticated-user | ||||||
| func (s *ActivityService) ListRepositoryNotifications(ctx context.Context, owner, repo string, opt *NotificationListOptions) ([]*Notification, *Response, error) { | func (s *ActivityService) ListRepositoryNotifications(ctx context.Context, owner, repo string, opts *NotificationListOptions) ([]*Notification, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/notifications", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/notifications", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -118,7 +118,7 @@ func (s *ActivityService) MarkNotificationsRead(ctx context.Context, lastRead ti | |||||||
| // MarkRepositoryNotificationsRead marks all notifications up to lastRead in | // MarkRepositoryNotificationsRead marks all notifications up to lastRead in | ||||||
| // the specified repository as read. | // the specified repository as read. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/notifications/#mark-notifications-as-read-in-a-repository | // GitHub API docs: https://developer.github.com/v3/activity/notifications/#mark-repository-notifications-as-read | ||||||
| func (s *ActivityService) MarkRepositoryNotificationsRead(ctx context.Context, owner, repo string, lastRead time.Time) (*Response, error) { | func (s *ActivityService) MarkRepositoryNotificationsRead(ctx context.Context, owner, repo string, lastRead time.Time) (*Response, error) { | ||||||
| 	opts := &markReadOptions{ | 	opts := &markReadOptions{ | ||||||
| 		LastReadAt: lastRead, | 		LastReadAt: lastRead, | ||||||
| @@ -134,7 +134,7 @@ func (s *ActivityService) MarkRepositoryNotificationsRead(ctx context.Context, o | |||||||
| 
 | 
 | ||||||
| // GetThread gets the specified notification thread. | // GetThread gets the specified notification thread. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/notifications/#view-a-single-thread | // GitHub API docs: https://developer.github.com/v3/activity/notifications/#get-a-thread | ||||||
| func (s *ActivityService) GetThread(ctx context.Context, id string) (*Notification, *Response, error) { | func (s *ActivityService) GetThread(ctx context.Context, id string) (*Notification, *Response, error) { | ||||||
| 	u := fmt.Sprintf("notifications/threads/%v", id) | 	u := fmt.Sprintf("notifications/threads/%v", id) | ||||||
| 
 | 
 | ||||||
| @@ -169,7 +169,7 @@ func (s *ActivityService) MarkThreadRead(ctx context.Context, id string) (*Respo | |||||||
| // GetThreadSubscription checks to see if the authenticated user is subscribed | // GetThreadSubscription checks to see if the authenticated user is subscribed | ||||||
| // to a thread. | // to a thread. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/notifications/#get-a-thread-subscription | // GitHub API docs: https://developer.github.com/v3/activity/notifications/#get-a-thread-subscription-for-the-authenticated-user | ||||||
| func (s *ActivityService) GetThreadSubscription(ctx context.Context, id string) (*Subscription, *Response, error) { | func (s *ActivityService) GetThreadSubscription(ctx context.Context, id string) (*Subscription, *Response, error) { | ||||||
| 	u := fmt.Sprintf("notifications/threads/%v/subscription", id) | 	u := fmt.Sprintf("notifications/threads/%v/subscription", id) | ||||||
| 
 | 
 | ||||||
| @@ -26,9 +26,9 @@ type Stargazer struct { | |||||||
| // ListStargazers lists people who have starred the specified repo. | // ListStargazers lists people who have starred the specified repo. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/starring/#list-stargazers | // GitHub API docs: https://developer.github.com/v3/activity/starring/#list-stargazers | ||||||
| func (s *ActivityService) ListStargazers(ctx context.Context, owner, repo string, opt *ListOptions) ([]*Stargazer, *Response, error) { | func (s *ActivityService) ListStargazers(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Stargazer, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/stargazers", owner, repo) | 	u := fmt.Sprintf("repos/%s/%s/stargazers", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -67,15 +67,16 @@ type ActivityListStarredOptions struct { | |||||||
| // ListStarred lists all the repos starred by a user. Passing the empty string | // ListStarred lists all the repos starred by a user. Passing the empty string | ||||||
| // will list the starred repositories for the authenticated user. | // will list the starred repositories for the authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred | // GitHub API docs: https://developer.github.com/v3/activity/starring/#list-repositories-starred-by-a-user | ||||||
| func (s *ActivityService) ListStarred(ctx context.Context, user string, opt *ActivityListStarredOptions) ([]*StarredRepository, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/activity/starring/#list-repositories-starred-by-the-authenticated-user | ||||||
|  | func (s *ActivityService) ListStarred(ctx context.Context, user string, opts *ActivityListStarredOptions) ([]*StarredRepository, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if user != "" { | 	if user != "" { | ||||||
| 		u = fmt.Sprintf("users/%v/starred", user) | 		u = fmt.Sprintf("users/%v/starred", user) | ||||||
| 	} else { | 	} else { | ||||||
| 		u = "user/starred" | 		u = "user/starred" | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -100,7 +101,7 @@ func (s *ActivityService) ListStarred(ctx context.Context, user string, opt *Act | |||||||
| 
 | 
 | ||||||
| // IsStarred checks if a repository is starred by authenticated user. | // IsStarred checks if a repository is starred by authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/starring/#check-if-you-are-starring-a-repository | // GitHub API docs: https://developer.github.com/v3/activity/starring/#check-if-a-repository-is-starred-by-the-authenticated-user | ||||||
| func (s *ActivityService) IsStarred(ctx context.Context, owner, repo string) (bool, *Response, error) { | func (s *ActivityService) IsStarred(ctx context.Context, owner, repo string) (bool, *Response, error) { | ||||||
| 	u := fmt.Sprintf("user/starred/%v/%v", owner, repo) | 	u := fmt.Sprintf("user/starred/%v/%v", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -114,7 +115,7 @@ func (s *ActivityService) IsStarred(ctx context.Context, owner, repo string) (bo | |||||||
| 
 | 
 | ||||||
| // Star a repository as the authenticated user. | // Star a repository as the authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/starring/#star-a-repository | // GitHub API docs: https://developer.github.com/v3/activity/starring/#star-a-repository-for-the-authenticated-user | ||||||
| func (s *ActivityService) Star(ctx context.Context, owner, repo string) (*Response, error) { | func (s *ActivityService) Star(ctx context.Context, owner, repo string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("user/starred/%v/%v", owner, repo) | 	u := fmt.Sprintf("user/starred/%v/%v", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, nil) | 	req, err := s.client.NewRequest("PUT", u, nil) | ||||||
| @@ -126,7 +127,7 @@ func (s *ActivityService) Star(ctx context.Context, owner, repo string) (*Respon | |||||||
| 
 | 
 | ||||||
| // Unstar a repository as the authenticated user. | // Unstar a repository as the authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/starring/#unstar-a-repository | // GitHub API docs: https://developer.github.com/v3/activity/starring/#unstar-a-repository-for-the-authenticated-user | ||||||
| func (s *ActivityService) Unstar(ctx context.Context, owner, repo string) (*Response, error) { | func (s *ActivityService) Unstar(ctx context.Context, owner, repo string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("user/starred/%v/%v", owner, repo) | 	u := fmt.Sprintf("user/starred/%v/%v", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -28,9 +28,9 @@ type Subscription struct { | |||||||
| // ListWatchers lists watchers of a particular repo. | // ListWatchers lists watchers of a particular repo. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/watching/#list-watchers | // GitHub API docs: https://developer.github.com/v3/activity/watching/#list-watchers | ||||||
| func (s *ActivityService) ListWatchers(ctx context.Context, owner, repo string, opt *ListOptions) ([]*User, *Response, error) { | func (s *ActivityService) ListWatchers(ctx context.Context, owner, repo string, opts *ListOptions) ([]*User, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/subscribers", owner, repo) | 	u := fmt.Sprintf("repos/%s/%s/subscribers", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -52,15 +52,16 @@ func (s *ActivityService) ListWatchers(ctx context.Context, owner, repo string, | |||||||
| // ListWatched lists the repositories the specified user is watching. Passing | // ListWatched lists the repositories the specified user is watching. Passing | ||||||
| // the empty string will fetch watched repos for the authenticated user. | // the empty string will fetch watched repos for the authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched | // GitHub API docs: https://developer.github.com/v3/activity/watching/#list-repositories-watched-by-a-user | ||||||
| func (s *ActivityService) ListWatched(ctx context.Context, user string, opt *ListOptions) ([]*Repository, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/activity/watching/#list-repositories-watched-by-the-authenticated-user | ||||||
|  | func (s *ActivityService) ListWatched(ctx context.Context, user string, opts *ListOptions) ([]*Repository, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if user != "" { | 	if user != "" { | ||||||
| 		u = fmt.Sprintf("users/%v/subscriptions", user) | 		u = fmt.Sprintf("users/%v/subscriptions", user) | ||||||
| 	} else { | 	} else { | ||||||
| 		u = "user/subscriptions" | 		u = "user/subscriptions" | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -62,6 +62,24 @@ func (m UserLDAPMapping) String() string { | |||||||
| 	return Stringify(m) | 	return Stringify(m) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Enterprise represents the GitHub enterprise profile. | ||||||
|  | type Enterprise struct { | ||||||
|  | 	ID          *int       `json:"id,omitempty"` | ||||||
|  | 	Slug        *string    `json:"slug,omitempty"` | ||||||
|  | 	Name        *string    `json:"name,omitempty"` | ||||||
|  | 	NodeID      *string    `json:"node_id,omitempty"` | ||||||
|  | 	AvatarURL   *string    `json:"avatar_url,omitempty"` | ||||||
|  | 	Description *string    `json:"description,omitempty"` | ||||||
|  | 	WebsiteURL  *string    `json:"website_url,omitempty"` | ||||||
|  | 	HTMLURL     *string    `json:"html_url,omitempty"` | ||||||
|  | 	CreatedAt   *Timestamp `json:"created_at,omitempty"` | ||||||
|  | 	UpdatedAt   *Timestamp `json:"updated_at,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (m Enterprise) String() string { | ||||||
|  | 	return Stringify(m) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // UpdateUserLDAPMapping updates the mapping between a GitHub user and an LDAP user. | // UpdateUserLDAPMapping updates the mapping between a GitHub user and an LDAP user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/enterprise/ldap/#update-ldap-mapping-for-a-user | // GitHub API docs: https://developer.github.com/v3/enterprise/ldap/#update-ldap-mapping-for-a-user | ||||||
							
								
								
									
										89
									
								
								vendor/github.com/google/go-github/v32/github/admin_orgs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								vendor/github.com/google/go-github/v32/github/admin_orgs.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | |||||||
|  | // Copyright 2019 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // createOrgRequest is a subset of Organization and is used internally | ||||||
|  | // by CreateOrg to pass only the known fields for the endpoint. | ||||||
|  | type createOrgRequest struct { | ||||||
|  | 	Login *string `json:"login,omitempty"` | ||||||
|  | 	Admin *string `json:"admin,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateOrg creates a new organization in GitHub Enterprise. | ||||||
|  | // | ||||||
|  | // Note that only a subset of the org fields are used and org must | ||||||
|  | // not be nil. | ||||||
|  | // | ||||||
|  | // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/orgs/#create-an-organization | ||||||
|  | func (s *AdminService) CreateOrg(ctx context.Context, org *Organization, admin string) (*Organization, *Response, error) { | ||||||
|  | 	u := "admin/organizations" | ||||||
|  |  | ||||||
|  | 	orgReq := &createOrgRequest{ | ||||||
|  | 		Login: org.Login, | ||||||
|  | 		Admin: &admin, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, orgReq) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	o := new(Organization) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, o) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return o, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // renameOrgRequest is a subset of Organization and is used internally | ||||||
|  | // by RenameOrg and RenameOrgByName to pass only the known fields for the endpoint. | ||||||
|  | type renameOrgRequest struct { | ||||||
|  | 	Login *string `json:"login,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RenameOrgResponse is the response given when renaming an Organization. | ||||||
|  | type RenameOrgResponse struct { | ||||||
|  | 	Message *string `json:"message,omitempty"` | ||||||
|  | 	URL     *string `json:"url,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RenameOrg renames an organization in GitHub Enterprise. | ||||||
|  | // | ||||||
|  | // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/orgs/#rename-an-organization | ||||||
|  | func (s *AdminService) RenameOrg(ctx context.Context, org *Organization, newName string) (*RenameOrgResponse, *Response, error) { | ||||||
|  | 	return s.RenameOrgByName(ctx, *org.Login, newName) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RenameOrgByName renames an organization in GitHub Enterprise using its current name. | ||||||
|  | // | ||||||
|  | // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/orgs/#rename-an-organization | ||||||
|  | func (s *AdminService) RenameOrgByName(ctx context.Context, org, newName string) (*RenameOrgResponse, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("admin/organizations/%v", org) | ||||||
|  |  | ||||||
|  | 	orgReq := &renameOrgRequest{ | ||||||
|  | 		Login: &newName, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("PATCH", u, orgReq) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	o := new(RenameOrgResponse) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, o) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return o, resp, nil | ||||||
|  | } | ||||||
| @@ -10,7 +10,7 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // AdminStats represents a variety of stats of a Github Enterprise | // AdminStats represents a variety of stats of a GitHub Enterprise | ||||||
| // installation. | // installation. | ||||||
| type AdminStats struct { | type AdminStats struct { | ||||||
| 	Issues     *IssueStats     `json:"issues,omitempty"` | 	Issues     *IssueStats     `json:"issues,omitempty"` | ||||||
| @@ -147,7 +147,7 @@ func (s RepoStats) String() string { | |||||||
| 	return Stringify(s) | 	return Stringify(s) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetAdminStats returns a variety of metrics about a Github Enterprise | // GetAdminStats returns a variety of metrics about a GitHub Enterprise | ||||||
| // installation. | // installation. | ||||||
| // | // | ||||||
| // Please note that this is only available to site administrators, | // Please note that this is only available to site administrators, | ||||||
							
								
								
									
										133
									
								
								vendor/github.com/google/go-github/v32/github/admin_users.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								vendor/github.com/google/go-github/v32/github/admin_users.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,133 @@ | |||||||
|  | // Copyright 2019 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // createUserRequest is a subset of User and is used internally | ||||||
|  | // by CreateUser to pass only the known fields for the endpoint. | ||||||
|  | type createUserRequest struct { | ||||||
|  | 	Login *string `json:"login,omitempty"` | ||||||
|  | 	Email *string `json:"email,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateUser creates a new user in GitHub Enterprise. | ||||||
|  | // | ||||||
|  | // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#create-a-new-user | ||||||
|  | func (s *AdminService) CreateUser(ctx context.Context, login, email string) (*User, *Response, error) { | ||||||
|  | 	u := "admin/users" | ||||||
|  |  | ||||||
|  | 	userReq := &createUserRequest{ | ||||||
|  | 		Login: &login, | ||||||
|  | 		Email: &email, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, userReq) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var user User | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &user) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return &user, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteUser deletes a user in GitHub Enterprise. | ||||||
|  | // | ||||||
|  | // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#delete-a-user | ||||||
|  | func (s *AdminService) DeleteUser(ctx context.Context, username string) (*Response, error) { | ||||||
|  | 	u := "admin/users/" + username | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	resp, err := s.client.Do(ctx, req, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ImpersonateUserOptions represents the scoping for the OAuth token. | ||||||
|  | type ImpersonateUserOptions struct { | ||||||
|  | 	Scopes []string `json:"scopes,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // OAuthAPP represents the GitHub Site Administrator OAuth app. | ||||||
|  | type OAuthAPP struct { | ||||||
|  | 	URL      *string `json:"url,omitempty"` | ||||||
|  | 	Name     *string `json:"name,omitempty"` | ||||||
|  | 	ClientID *string `json:"client_id,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s OAuthAPP) String() string { | ||||||
|  | 	return Stringify(s) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UserAuthorization represents the impersonation response. | ||||||
|  | type UserAuthorization struct { | ||||||
|  | 	ID             *int64     `json:"id,omitempty"` | ||||||
|  | 	URL            *string    `json:"url,omitempty"` | ||||||
|  | 	Scopes         []string   `json:"scopes,omitempty"` | ||||||
|  | 	Token          *string    `json:"token,omitempty"` | ||||||
|  | 	TokenLastEight *string    `json:"token_last_eight,omitempty"` | ||||||
|  | 	HashedToken    *string    `json:"hashed_token,omitempty"` | ||||||
|  | 	App            *OAuthAPP  `json:"app,omitempty"` | ||||||
|  | 	Note           *string    `json:"note,omitempty"` | ||||||
|  | 	NoteURL        *string    `json:"note_url,omitempty"` | ||||||
|  | 	UpdatedAt      *Timestamp `json:"updated_at,omitempty"` | ||||||
|  | 	CreatedAt      *Timestamp `json:"created_at,omitempty"` | ||||||
|  | 	Fingerprint    *string    `json:"fingerprint,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateUserImpersonation creates an impersonation OAuth token. | ||||||
|  | // | ||||||
|  | // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#create-an-impersonation-oauth-token | ||||||
|  | func (s *AdminService) CreateUserImpersonation(ctx context.Context, username string, opts *ImpersonateUserOptions) (*UserAuthorization, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("admin/users/%s/authorizations", username) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	a := new(UserAuthorization) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, a) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return a, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteUserImpersonation deletes an impersonation OAuth token. | ||||||
|  | // | ||||||
|  | // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#delete-an-impersonation-oauth-token | ||||||
|  | func (s *AdminService) DeleteUserImpersonation(ctx context.Context, username string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("admin/users/%s/authorizations", username) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	resp, err := s.client.Do(ctx, req, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return resp, nil | ||||||
|  | } | ||||||
							
								
								
									
										349
									
								
								vendor/github.com/google/go-github/v32/github/apps.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										349
									
								
								vendor/github.com/google/go-github/v32/github/apps.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,349 @@ | |||||||
|  | // Copyright 2016 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // AppsService provides access to the installation related functions | ||||||
|  | // in the GitHub API. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/ | ||||||
|  | type AppsService service | ||||||
|  |  | ||||||
|  | // App represents a GitHub App. | ||||||
|  | type App struct { | ||||||
|  | 	ID          *int64                   `json:"id,omitempty"` | ||||||
|  | 	Slug        *string                  `json:"slug,omitempty"` | ||||||
|  | 	NodeID      *string                  `json:"node_id,omitempty"` | ||||||
|  | 	Owner       *User                    `json:"owner,omitempty"` | ||||||
|  | 	Name        *string                  `json:"name,omitempty"` | ||||||
|  | 	Description *string                  `json:"description,omitempty"` | ||||||
|  | 	ExternalURL *string                  `json:"external_url,omitempty"` | ||||||
|  | 	HTMLURL     *string                  `json:"html_url,omitempty"` | ||||||
|  | 	CreatedAt   *Timestamp               `json:"created_at,omitempty"` | ||||||
|  | 	UpdatedAt   *Timestamp               `json:"updated_at,omitempty"` | ||||||
|  | 	Permissions *InstallationPermissions `json:"permissions,omitempty"` | ||||||
|  | 	Events      []string                 `json:"events,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // InstallationToken represents an installation token. | ||||||
|  | type InstallationToken struct { | ||||||
|  | 	Token        *string                  `json:"token,omitempty"` | ||||||
|  | 	ExpiresAt    *time.Time               `json:"expires_at,omitempty"` | ||||||
|  | 	Permissions  *InstallationPermissions `json:"permissions,omitempty"` | ||||||
|  | 	Repositories []*Repository            `json:"repositories,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // InstallationTokenOptions allow restricting a token's access to specific repositories. | ||||||
|  | type InstallationTokenOptions struct { | ||||||
|  | 	// The IDs of the repositories that the installation token can access. | ||||||
|  | 	// Providing repository IDs restricts the access of an installation token to specific repositories. | ||||||
|  | 	RepositoryIDs []int64 `json:"repository_ids,omitempty"` | ||||||
|  |  | ||||||
|  | 	// The permissions granted to the access token. | ||||||
|  | 	// The permissions object includes the permission names and their access type. | ||||||
|  | 	Permissions *InstallationPermissions `json:"permissions,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // InstallationPermissions lists the repository and organization permissions for an installation. | ||||||
|  | // | ||||||
|  | // Permission names taken from: | ||||||
|  | //   https://developer.github.com/v3/apps/permissions/ | ||||||
|  | //   https://developer.github.com/enterprise/v3/apps/permissions/ | ||||||
|  | type InstallationPermissions struct { | ||||||
|  | 	Administration              *string `json:"administration,omitempty"` | ||||||
|  | 	Blocking                    *string `json:"blocking,omitempty"` | ||||||
|  | 	Checks                      *string `json:"checks,omitempty"` | ||||||
|  | 	Contents                    *string `json:"contents,omitempty"` | ||||||
|  | 	ContentReferences           *string `json:"content_references,omitempty"` | ||||||
|  | 	Deployments                 *string `json:"deployments,omitempty"` | ||||||
|  | 	Emails                      *string `json:"emails,omitempty"` | ||||||
|  | 	Followers                   *string `json:"followers,omitempty"` | ||||||
|  | 	Issues                      *string `json:"issues,omitempty"` | ||||||
|  | 	Metadata                    *string `json:"metadata,omitempty"` | ||||||
|  | 	Members                     *string `json:"members,omitempty"` | ||||||
|  | 	OrganizationAdministration  *string `json:"organization_administration,omitempty"` | ||||||
|  | 	OrganizationHooks           *string `json:"organization_hooks,omitempty"` | ||||||
|  | 	OrganizationPlan            *string `json:"organization_plan,omitempty"` | ||||||
|  | 	OrganizationPreReceiveHooks *string `json:"organization_pre_receive_hooks,omitempty"` | ||||||
|  | 	OrganizationProjects        *string `json:"organization_projects,omitempty"` | ||||||
|  | 	OrganizationUserBlocking    *string `json:"organization_user_blocking,omitempty"` | ||||||
|  | 	Packages                    *string `json:"packages,omitempty"` | ||||||
|  | 	Pages                       *string `json:"pages,omitempty"` | ||||||
|  | 	PullRequests                *string `json:"pull_requests,omitempty"` | ||||||
|  | 	RepositoryHooks             *string `json:"repository_hooks,omitempty"` | ||||||
|  | 	RepositoryProjects          *string `json:"repository_projects,omitempty"` | ||||||
|  | 	RepositoryPreReceiveHooks   *string `json:"repository_pre_receive_hooks,omitempty"` | ||||||
|  | 	SingleFile                  *string `json:"single_file,omitempty"` | ||||||
|  | 	Statuses                    *string `json:"statuses,omitempty"` | ||||||
|  | 	TeamDiscussions             *string `json:"team_discussions,omitempty"` | ||||||
|  | 	VulnerabilityAlerts         *string `json:"vulnerability_alerts,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Installation represents a GitHub Apps installation. | ||||||
|  | type Installation struct { | ||||||
|  | 	ID                  *int64                   `json:"id,omitempty"` | ||||||
|  | 	AppID               *int64                   `json:"app_id,omitempty"` | ||||||
|  | 	TargetID            *int64                   `json:"target_id,omitempty"` | ||||||
|  | 	Account             *User                    `json:"account,omitempty"` | ||||||
|  | 	AccessTokensURL     *string                  `json:"access_tokens_url,omitempty"` | ||||||
|  | 	RepositoriesURL     *string                  `json:"repositories_url,omitempty"` | ||||||
|  | 	HTMLURL             *string                  `json:"html_url,omitempty"` | ||||||
|  | 	TargetType          *string                  `json:"target_type,omitempty"` | ||||||
|  | 	SingleFileName      *string                  `json:"single_file_name,omitempty"` | ||||||
|  | 	RepositorySelection *string                  `json:"repository_selection,omitempty"` | ||||||
|  | 	Events              []string                 `json:"events,omitempty"` | ||||||
|  | 	Permissions         *InstallationPermissions `json:"permissions,omitempty"` | ||||||
|  | 	CreatedAt           *Timestamp               `json:"created_at,omitempty"` | ||||||
|  | 	UpdatedAt           *Timestamp               `json:"updated_at,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Attachment represents a GitHub Apps attachment. | ||||||
|  | type Attachment struct { | ||||||
|  | 	ID    *int64  `json:"id,omitempty"` | ||||||
|  | 	Title *string `json:"title,omitempty"` | ||||||
|  | 	Body  *string `json:"body,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (i Installation) String() string { | ||||||
|  | 	return Stringify(i) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get a single GitHub App. Passing the empty string will get | ||||||
|  | // the authenticated GitHub App. | ||||||
|  | // | ||||||
|  | // Note: appSlug is just the URL-friendly name of your GitHub App. | ||||||
|  | // You can find this on the settings page for your GitHub App | ||||||
|  | // (e.g., https://github.com/settings/apps/:app_slug). | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#get-the-authenticated-app | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#get-an-app | ||||||
|  | func (s *AppsService) Get(ctx context.Context, appSlug string) (*App, *Response, error) { | ||||||
|  | 	var u string | ||||||
|  | 	if appSlug != "" { | ||||||
|  | 		u = fmt.Sprintf("apps/%v", appSlug) | ||||||
|  | 	} else { | ||||||
|  | 		u = "app" | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeIntegrationPreview) | ||||||
|  |  | ||||||
|  | 	app := new(App) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, app) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return app, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListInstallations lists the installations that the current GitHub App has. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#list-installations-for-the-authenticated-app | ||||||
|  | func (s *AppsService) ListInstallations(ctx context.Context, opts *ListOptions) ([]*Installation, *Response, error) { | ||||||
|  | 	u, err := addOptions("app/installations", opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeIntegrationPreview) | ||||||
|  |  | ||||||
|  | 	var i []*Installation | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &i) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return i, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetInstallation returns the specified installation. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#get-an-installation-for-the-authenticated-app | ||||||
|  | func (s *AppsService) GetInstallation(ctx context.Context, id int64) (*Installation, *Response, error) { | ||||||
|  | 	return s.getInstallation(ctx, fmt.Sprintf("app/installations/%v", id)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListUserInstallations lists installations that are accessible to the authenticated user. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/installations/#list-app-installations-accessible-to-the-user-access-token | ||||||
|  | func (s *AppsService) ListUserInstallations(ctx context.Context, opts *ListOptions) ([]*Installation, *Response, error) { | ||||||
|  | 	u, err := addOptions("user/installations", opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeIntegrationPreview) | ||||||
|  |  | ||||||
|  | 	var i struct { | ||||||
|  | 		Installations []*Installation `json:"installations"` | ||||||
|  | 	} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &i) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return i.Installations, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SuspendInstallation suspends the specified installation. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#suspend-an-app-installation | ||||||
|  | func (s *AppsService) SuspendInstallation(ctx context.Context, id int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("app/installations/%v/suspended", id) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // UnsuspendInstallation unsuspends the specified installation. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#unsuspend-an-app-installation | ||||||
|  | func (s *AppsService) UnsuspendInstallation(ctx context.Context, id int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("app/installations/%v/suspended", id) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteInstallation deletes the specified installation. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#delete-an-installation-for-the-authenticated-app | ||||||
|  | func (s *AppsService) DeleteInstallation(ctx context.Context, id int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("app/installations/%v", id) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeIntegrationPreview) | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateInstallationToken creates a new installation token. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#create-an-installation-access-token-for-an-app | ||||||
|  | func (s *AppsService) CreateInstallationToken(ctx context.Context, id int64, opts *InstallationTokenOptions) (*InstallationToken, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("app/installations/%v/access_tokens", id) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeIntegrationPreview) | ||||||
|  |  | ||||||
|  | 	t := new(InstallationToken) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, t) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return t, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateAttachment creates a new attachment on user comment containing a url. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/installations/#create-a-content-attachment | ||||||
|  | func (s *AppsService) CreateAttachment(ctx context.Context, contentReferenceID int64, title, body string) (*Attachment, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("content_references/%v/attachments", contentReferenceID) | ||||||
|  | 	payload := &Attachment{Title: String(title), Body: String(body)} | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, payload) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept headers when APIs fully launch. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeReactionsPreview) | ||||||
|  |  | ||||||
|  | 	m := &Attachment{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, m) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return m, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // FindOrganizationInstallation finds the organization's installation information. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#get-an-organization-installation-for-the-authenticated-app | ||||||
|  | func (s *AppsService) FindOrganizationInstallation(ctx context.Context, org string) (*Installation, *Response, error) { | ||||||
|  | 	return s.getInstallation(ctx, fmt.Sprintf("orgs/%v/installation", org)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // FindRepositoryInstallation finds the repository's installation information. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#get-a-repository-installation-for-the-authenticated-app | ||||||
|  | func (s *AppsService) FindRepositoryInstallation(ctx context.Context, owner, repo string) (*Installation, *Response, error) { | ||||||
|  | 	return s.getInstallation(ctx, fmt.Sprintf("repos/%v/%v/installation", owner, repo)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // FindRepositoryInstallationByID finds the repository's installation information. | ||||||
|  | // | ||||||
|  | // Note: FindRepositoryInstallationByID uses the undocumented GitHub API endpoint /repositories/:id/installation. | ||||||
|  | func (s *AppsService) FindRepositoryInstallationByID(ctx context.Context, id int64) (*Installation, *Response, error) { | ||||||
|  | 	return s.getInstallation(ctx, fmt.Sprintf("repositories/%d/installation", id)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // FindUserInstallation finds the user's installation information. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#get-a-user-installation-for-the-authenticated-app | ||||||
|  | func (s *AppsService) FindUserInstallation(ctx context.Context, user string) (*Installation, *Response, error) { | ||||||
|  | 	return s.getInstallation(ctx, fmt.Sprintf("users/%v/installation", user)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s *AppsService) getInstallation(ctx context.Context, url string) (*Installation, *Response, error) { | ||||||
|  | 	req, err := s.client.NewRequest("GET", url, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeIntegrationPreview) | ||||||
|  |  | ||||||
|  | 	i := new(Installation) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, i) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return i, resp, nil | ||||||
|  | } | ||||||
| @@ -12,9 +12,9 @@ import ( | |||||||
| 
 | 
 | ||||||
| // ListRepos lists the repositories that are accessible to the authenticated installation. | // ListRepos lists the repositories that are accessible to the authenticated installation. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/installations/#list-repositories | // GitHub API docs: https://developer.github.com/v3/apps/installations/#list-repositories-accessible-to-the-app-installation | ||||||
| func (s *AppsService) ListRepos(ctx context.Context, opt *ListOptions) ([]*Repository, *Response, error) { | func (s *AppsService) ListRepos(ctx context.Context, opts *ListOptions) ([]*Repository, *Response, error) { | ||||||
| 	u, err := addOptions("installation/repositories", opt) | 	u, err := addOptions("installation/repositories", opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -41,10 +41,10 @@ func (s *AppsService) ListRepos(ctx context.Context, opt *ListOptions) ([]*Repos | |||||||
| // ListUserRepos lists repositories that are accessible | // ListUserRepos lists repositories that are accessible | ||||||
| // to the authenticated user for an installation. | // to the authenticated user for an installation. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/installations/#list-repositories-accessible-to-the-user-for-an-installation | // GitHub API docs: https://developer.github.com/v3/apps/installations/#list-repositories-accessible-to-the-user-access-token | ||||||
| func (s *AppsService) ListUserRepos(ctx context.Context, id int64, opt *ListOptions) ([]*Repository, *Response, error) { | func (s *AppsService) ListUserRepos(ctx context.Context, id int64, opts *ListOptions) ([]*Repository, *Response, error) { | ||||||
| 	u := fmt.Sprintf("user/installations/%v/repositories", id) | 	u := fmt.Sprintf("user/installations/%v/repositories", id) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -70,7 +70,7 @@ func (s *AppsService) ListUserRepos(ctx context.Context, id int64, opt *ListOpti | |||||||
| 
 | 
 | ||||||
| // AddRepository adds a single repository to an installation. | // AddRepository adds a single repository to an installation. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/installations/#add-repository-to-installation | // GitHub API docs: https://developer.github.com/v3/apps/installations/#add-a-repository-to-an-app-installation | ||||||
| func (s *AppsService) AddRepository(ctx context.Context, instID, repoID int64) (*Repository, *Response, error) { | func (s *AppsService) AddRepository(ctx context.Context, instID, repoID int64) (*Repository, *Response, error) { | ||||||
| 	u := fmt.Sprintf("user/installations/%v/repositories/%v", instID, repoID) | 	u := fmt.Sprintf("user/installations/%v/repositories/%v", instID, repoID) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, nil) | 	req, err := s.client.NewRequest("PUT", u, nil) | ||||||
| @@ -90,7 +90,7 @@ func (s *AppsService) AddRepository(ctx context.Context, instID, repoID int64) ( | |||||||
| 
 | 
 | ||||||
| // RemoveRepository removes a single repository from an installation. | // RemoveRepository removes a single repository from an installation. | ||||||
| // | // | ||||||
| // GitHub docs: https://developer.github.com/v3/apps/installations/#remove-repository-from-installation | // GitHub API docs: https://developer.github.com/v3/apps/installations/#remove-a-repository-from-an-app-installation | ||||||
| func (s *AppsService) RemoveRepository(ctx context.Context, instID, repoID int64) (*Response, error) { | func (s *AppsService) RemoveRepository(ctx context.Context, instID, repoID int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("user/installations/%v/repositories/%v", instID, repoID) | 	u := fmt.Sprintf("user/installations/%v/repositories/%v", instID, repoID) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -101,3 +101,16 @@ func (s *AppsService) RemoveRepository(ctx context.Context, instID, repoID int64 | |||||||
| 
 | 
 | ||||||
| 	return s.client.Do(ctx, req, nil) | 	return s.client.Do(ctx, req, nil) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // RevokeInstallationToken revokes an installation token. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/installations/#revoke-an-installation-access-token | ||||||
|  | func (s *AppsService) RevokeInstallationToken(ctx context.Context) (*Response, error) { | ||||||
|  | 	u := "installation/token" | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
							
								
								
									
										53
									
								
								vendor/github.com/google/go-github/v32/github/apps_manifest.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								vendor/github.com/google/go-github/v32/github/apps_manifest.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | // Copyright 2019 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	mediaTypeAppManifestPreview = "application/vnd.github.fury-preview+json" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // AppConfig describes the configuration of a GitHub App. | ||||||
|  | type AppConfig struct { | ||||||
|  | 	ID            *int64     `json:"id,omitempty"` | ||||||
|  | 	NodeID        *string    `json:"node_id,omitempty"` | ||||||
|  | 	Owner         *User      `json:"owner,omitempty"` | ||||||
|  | 	Name          *string    `json:"name,omitempty"` | ||||||
|  | 	Description   *string    `json:"description,omitempty"` | ||||||
|  | 	ExternalURL   *string    `json:"external_url,omitempty"` | ||||||
|  | 	HTMLURL       *string    `json:"html_url,omitempty"` | ||||||
|  | 	CreatedAt     *Timestamp `json:"created_at,omitempty"` | ||||||
|  | 	UpdatedAt     *Timestamp `json:"updated_at,omitempty"` | ||||||
|  | 	ClientID      *string    `json:"client_id,omitempty"` | ||||||
|  | 	ClientSecret  *string    `json:"client_secret,omitempty"` | ||||||
|  | 	WebhookSecret *string    `json:"webhook_secret,omitempty"` | ||||||
|  | 	PEM           *string    `json:"pem,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CompleteAppManifest completes the App manifest handshake flow for the given | ||||||
|  | // code. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/apps/#create-a-github-app-from-a-manifest | ||||||
|  | func (s *AppsService) CompleteAppManifest(ctx context.Context, code string) (*AppConfig, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("app-manifests/%s/conversions", code) | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 	req.Header.Set("Accept", mediaTypeAppManifestPreview) | ||||||
|  |  | ||||||
|  | 	cfg := new(AppConfig) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, cfg) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return cfg, resp, nil | ||||||
|  | } | ||||||
| @@ -68,6 +68,7 @@ type MarketplacePlanAccount struct { | |||||||
| 	URL                      *string                   `json:"url,omitempty"` | 	URL                      *string                   `json:"url,omitempty"` | ||||||
| 	Type                     *string                   `json:"type,omitempty"` | 	Type                     *string                   `json:"type,omitempty"` | ||||||
| 	ID                       *int64                    `json:"id,omitempty"` | 	ID                       *int64                    `json:"id,omitempty"` | ||||||
|  | 	NodeID                   *string                   `json:"node_id,omitempty"` | ||||||
| 	Login                    *string                   `json:"login,omitempty"` | 	Login                    *string                   `json:"login,omitempty"` | ||||||
| 	Email                    *string                   `json:"email,omitempty"` | 	Email                    *string                   `json:"email,omitempty"` | ||||||
| 	OrganizationBillingEmail *string                   `json:"organization_billing_email,omitempty"` | 	OrganizationBillingEmail *string                   `json:"organization_billing_email,omitempty"` | ||||||
| @@ -78,9 +79,9 @@ type MarketplacePlanAccount struct { | |||||||
| // ListPlans lists all plans for your Marketplace listing. | // ListPlans lists all plans for your Marketplace listing. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/marketplace/#list-all-plans-for-your-marketplace-listing | // GitHub API docs: https://developer.github.com/v3/apps/marketplace/#list-all-plans-for-your-marketplace-listing | ||||||
| func (s *MarketplaceService) ListPlans(ctx context.Context, opt *ListOptions) ([]*MarketplacePlan, *Response, error) { | func (s *MarketplaceService) ListPlans(ctx context.Context, opts *ListOptions) ([]*MarketplacePlan, *Response, error) { | ||||||
| 	uri := s.marketplaceURI("plans") | 	uri := s.marketplaceURI("plans") | ||||||
| 	u, err := addOptions(uri, opt) | 	u, err := addOptions(uri, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -102,9 +103,9 @@ func (s *MarketplaceService) ListPlans(ctx context.Context, opt *ListOptions) ([ | |||||||
| // ListPlanAccountsForPlan lists all GitHub accounts (user or organization) on a specific plan. | // ListPlanAccountsForPlan lists all GitHub accounts (user or organization) on a specific plan. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/marketplace/#list-all-github-accounts-user-or-organization-on-a-specific-plan | // GitHub API docs: https://developer.github.com/v3/apps/marketplace/#list-all-github-accounts-user-or-organization-on-a-specific-plan | ||||||
| func (s *MarketplaceService) ListPlanAccountsForPlan(ctx context.Context, planID int64, opt *ListOptions) ([]*MarketplacePlanAccount, *Response, error) { | func (s *MarketplaceService) ListPlanAccountsForPlan(ctx context.Context, planID int64, opts *ListOptions) ([]*MarketplacePlanAccount, *Response, error) { | ||||||
| 	uri := s.marketplaceURI(fmt.Sprintf("plans/%v/accounts", planID)) | 	uri := s.marketplaceURI(fmt.Sprintf("plans/%v/accounts", planID)) | ||||||
| 	u, err := addOptions(uri, opt) | 	u, err := addOptions(uri, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -126,9 +127,9 @@ func (s *MarketplaceService) ListPlanAccountsForPlan(ctx context.Context, planID | |||||||
| // ListPlanAccountsForAccount lists all GitHub accounts (user or organization) associated with an account. | // ListPlanAccountsForAccount lists all GitHub accounts (user or organization) associated with an account. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/marketplace/#check-if-a-github-account-is-associated-with-any-marketplace-listing | // GitHub API docs: https://developer.github.com/v3/apps/marketplace/#check-if-a-github-account-is-associated-with-any-marketplace-listing | ||||||
| func (s *MarketplaceService) ListPlanAccountsForAccount(ctx context.Context, accountID int64, opt *ListOptions) ([]*MarketplacePlanAccount, *Response, error) { | func (s *MarketplaceService) ListPlanAccountsForAccount(ctx context.Context, accountID int64, opts *ListOptions) ([]*MarketplacePlanAccount, *Response, error) { | ||||||
| 	uri := s.marketplaceURI(fmt.Sprintf("accounts/%v", accountID)) | 	uri := s.marketplaceURI(fmt.Sprintf("accounts/%v", accountID)) | ||||||
| 	u, err := addOptions(uri, opt) | 	u, err := addOptions(uri, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -149,14 +150,15 @@ func (s *MarketplaceService) ListPlanAccountsForAccount(ctx context.Context, acc | |||||||
| 
 | 
 | ||||||
| // ListMarketplacePurchasesForUser lists all GitHub marketplace purchases made by a user. | // ListMarketplacePurchasesForUser lists all GitHub marketplace purchases made by a user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/apps/marketplace/#get-a-users-marketplace-purchases | // GitHub API docs: https://developer.github.com/v3/apps/marketplace/#list-subscriptions-for-the-authenticated-user | ||||||
| func (s *MarketplaceService) ListMarketplacePurchasesForUser(ctx context.Context, opt *ListOptions) ([]*MarketplacePurchase, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/apps/marketplace/#list-subscriptions-for-the-authenticated-user-stubbed | ||||||
|  | func (s *MarketplaceService) ListMarketplacePurchasesForUser(ctx context.Context, opts *ListOptions) ([]*MarketplacePurchase, *Response, error) { | ||||||
| 	uri := "user/marketplace_purchases" | 	uri := "user/marketplace_purchases" | ||||||
| 	if s.Stubbed { | 	if s.Stubbed { | ||||||
| 		uri = "user/marketplace_purchases/stubbed" | 		uri = "user/marketplace_purchases/stubbed" | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	u, err := addOptions(uri, opt) | 	u, err := addOptions(uri, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -41,6 +41,7 @@ const ( | |||||||
| 	ScopeReadGPGKey     Scope = "read:gpg_key" | 	ScopeReadGPGKey     Scope = "read:gpg_key" | ||||||
| 	ScopeWriteGPGKey    Scope = "write:gpg_key" | 	ScopeWriteGPGKey    Scope = "write:gpg_key" | ||||||
| 	ScopeAdminGPGKey    Scope = "admin:gpg_key" | 	ScopeAdminGPGKey    Scope = "admin:gpg_key" | ||||||
|  | 	ScopeSecurityEvents Scope = "security_events" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // AuthorizationsService handles communication with the authorization related | // AuthorizationsService handles communication with the authorization related | ||||||
| @@ -134,137 +135,6 @@ func (a AuthorizationUpdateRequest) String() string { | |||||||
| 	return Stringify(a) | 	return Stringify(a) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // List the authorizations for the authenticated user. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations |  | ||||||
| func (s *AuthorizationsService) List(ctx context.Context, opt *ListOptions) ([]*Authorization, *Response, error) { |  | ||||||
| 	u := "authorizations" |  | ||||||
| 	u, err := addOptions(u, opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var auths []*Authorization |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &auths) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
| 	return auths, resp, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Get a single authorization. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#get-a-single-authorization |  | ||||||
| func (s *AuthorizationsService) Get(ctx context.Context, id int64) (*Authorization, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("authorizations/%d", id) |  | ||||||
| 
 |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	a := new(Authorization) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, a) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
| 	return a, resp, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Create a new authorization for the specified OAuth application. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#create-a-new-authorization |  | ||||||
| func (s *AuthorizationsService) Create(ctx context.Context, auth *AuthorizationRequest) (*Authorization, *Response, error) { |  | ||||||
| 	u := "authorizations" |  | ||||||
| 
 |  | ||||||
| 	req, err := s.client.NewRequest("POST", u, auth) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	a := new(Authorization) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, a) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
| 	return a, resp, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // GetOrCreateForApp creates a new authorization for the specified OAuth |  | ||||||
| // application, only if an authorization for that application doesn’t already |  | ||||||
| // exist for the user. |  | ||||||
| // |  | ||||||
| // If a new token is created, the HTTP status code will be "201 Created", and |  | ||||||
| // the returned Authorization.Token field will be populated. If an existing |  | ||||||
| // token is returned, the status code will be "200 OK" and the |  | ||||||
| // Authorization.Token field will be empty. |  | ||||||
| // |  | ||||||
| // clientID is the OAuth Client ID with which to create the token. |  | ||||||
| // |  | ||||||
| // GitHub API docs: |  | ||||||
| // https://developer.github.com/v3/oauth_authorizations/#get-or-create-an-authorization-for-a-specific-app |  | ||||||
| // https://developer.github.com/v3/oauth_authorizations/#get-or-create-an-authorization-for-a-specific-app-and-fingerprint |  | ||||||
| func (s *AuthorizationsService) GetOrCreateForApp(ctx context.Context, clientID string, auth *AuthorizationRequest) (*Authorization, *Response, error) { |  | ||||||
| 	var u string |  | ||||||
| 	if auth.Fingerprint == nil || *auth.Fingerprint == "" { |  | ||||||
| 		u = fmt.Sprintf("authorizations/clients/%v", clientID) |  | ||||||
| 	} else { |  | ||||||
| 		u = fmt.Sprintf("authorizations/clients/%v/%v", clientID, *auth.Fingerprint) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	req, err := s.client.NewRequest("PUT", u, auth) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	a := new(Authorization) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, a) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return a, resp, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Edit a single authorization. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#update-an-existing-authorization |  | ||||||
| func (s *AuthorizationsService) Edit(ctx context.Context, id int64, auth *AuthorizationUpdateRequest) (*Authorization, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("authorizations/%d", id) |  | ||||||
| 
 |  | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, auth) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	a := new(Authorization) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, a) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return a, resp, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Delete a single authorization. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#delete-an-authorization |  | ||||||
| func (s *AuthorizationsService) Delete(ctx context.Context, id int64) (*Response, error) { |  | ||||||
| 	u := fmt.Sprintf("authorizations/%d", id) |  | ||||||
| 
 |  | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return s.client.Do(ctx, req, nil) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Check if an OAuth token is valid for a specific app. | // Check if an OAuth token is valid for a specific app. | ||||||
| // | // | ||||||
| // Note that this operation requires the use of BasicAuth, but where the | // Note that this operation requires the use of BasicAuth, but where the | ||||||
| @@ -273,14 +143,19 @@ func (s *AuthorizationsService) Delete(ctx context.Context, id int64) (*Response | |||||||
| // | // | ||||||
| // The returned Authorization.User field will be populated. | // The returned Authorization.User field will be populated. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#check-an-authorization | // GitHub API docs: https://developer.github.com/v3/apps/oauth_applications/#check-a-token | ||||||
| func (s *AuthorizationsService) Check(ctx context.Context, clientID string, token string) (*Authorization, *Response, error) { | func (s *AuthorizationsService) Check(ctx context.Context, clientID, accessToken string) (*Authorization, *Response, error) { | ||||||
| 	u := fmt.Sprintf("applications/%v/tokens/%v", clientID, token) | 	u := fmt.Sprintf("applications/%v/token", clientID) | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	reqBody := &struct { | ||||||
|  | 		AccessToken string `json:"access_token"` | ||||||
|  | 	}{AccessToken: accessToken} | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, reqBody) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
|  | 	req.Header.Set("Accept", mediaTypeOAuthAppPreview) | ||||||
| 
 | 
 | ||||||
| 	a := new(Authorization) | 	a := new(Authorization) | ||||||
| 	resp, err := s.client.Do(ctx, req, a) | 	resp, err := s.client.Do(ctx, req, a) | ||||||
| @@ -301,14 +176,19 @@ func (s *AuthorizationsService) Check(ctx context.Context, clientID string, toke | |||||||
| // | // | ||||||
| // The returned Authorization.User field will be populated. | // The returned Authorization.User field will be populated. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization | // GitHub API docs: https://developer.github.com/v3/apps/oauth_applications/#reset-a-token | ||||||
| func (s *AuthorizationsService) Reset(ctx context.Context, clientID string, token string) (*Authorization, *Response, error) { | func (s *AuthorizationsService) Reset(ctx context.Context, clientID, accessToken string) (*Authorization, *Response, error) { | ||||||
| 	u := fmt.Sprintf("applications/%v/tokens/%v", clientID, token) | 	u := fmt.Sprintf("applications/%v/token", clientID) | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("POST", u, nil) | 	reqBody := &struct { | ||||||
|  | 		AccessToken string `json:"access_token"` | ||||||
|  | 	}{AccessToken: accessToken} | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("PATCH", u, reqBody) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
|  | 	req.Header.Set("Accept", mediaTypeOAuthAppPreview) | ||||||
| 
 | 
 | ||||||
| 	a := new(Authorization) | 	a := new(Authorization) | ||||||
| 	resp, err := s.client.Do(ctx, req, a) | 	resp, err := s.client.Do(ctx, req, a) | ||||||
| @@ -325,74 +205,40 @@ func (s *AuthorizationsService) Reset(ctx context.Context, clientID string, toke | |||||||
| // username is the OAuth application clientID, and the password is its | // username is the OAuth application clientID, and the password is its | ||||||
| // clientSecret. Invalid tokens will return a 404 Not Found. | // clientSecret. Invalid tokens will return a 404 Not Found. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#revoke-an-authorization-for-an-application | // GitHub API docs: https://developer.github.com/v3/apps/oauth_applications/#delete-an-app-token | ||||||
| func (s *AuthorizationsService) Revoke(ctx context.Context, clientID string, token string) (*Response, error) { | func (s *AuthorizationsService) Revoke(ctx context.Context, clientID, accessToken string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("applications/%v/tokens/%v", clientID, token) | 	u := fmt.Sprintf("applications/%v/token", clientID) | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	reqBody := &struct { | ||||||
|  | 		AccessToken string `json:"access_token"` | ||||||
|  | 	}{AccessToken: accessToken} | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, reqBody) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	req.Header.Set("Accept", mediaTypeOAuthAppPreview) | ||||||
| 
 | 
 | ||||||
| 	return s.client.Do(ctx, req, nil) | 	return s.client.Do(ctx, req, nil) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ListGrants lists the set of OAuth applications that have been granted |  | ||||||
| // access to a user's account. This will return one entry for each application |  | ||||||
| // that has been granted access to the account, regardless of the number of |  | ||||||
| // tokens an application has generated for the user. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#list-your-grants |  | ||||||
| func (s *AuthorizationsService) ListGrants(ctx context.Context, opt *ListOptions) ([]*Grant, *Response, error) { |  | ||||||
| 	u, err := addOptions("applications/grants", opt) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	grants := []*Grant{} |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &grants) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return grants, resp, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // GetGrant gets a single OAuth application grant. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#get-a-single-grant |  | ||||||
| func (s *AuthorizationsService) GetGrant(ctx context.Context, id int64) (*Grant, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("applications/grants/%d", id) |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	grant := new(Grant) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, grant) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return grant, resp, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // DeleteGrant deletes an OAuth application grant. Deleting an application's | // DeleteGrant deletes an OAuth application grant. Deleting an application's | ||||||
| // grant will also delete all OAuth tokens associated with the application for | // grant will also delete all OAuth tokens associated with the application for | ||||||
| // the user. | // the user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#delete-a-grant | // GitHub API docs: https://developer.github.com/v3/apps/oauth_applications/#delete-an-app-authorization | ||||||
| func (s *AuthorizationsService) DeleteGrant(ctx context.Context, id int64) (*Response, error) { | func (s *AuthorizationsService) DeleteGrant(ctx context.Context, clientID, accessToken string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("applications/grants/%d", id) | 	u := fmt.Sprintf("applications/%v/grant", clientID) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 
 | ||||||
|  | 	reqBody := &struct { | ||||||
|  | 		AccessToken string `json:"access_token"` | ||||||
|  | 	}{AccessToken: accessToken} | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, reqBody) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	req.Header.Set("Accept", mediaTypeOAuthAppPreview) | ||||||
| 
 | 
 | ||||||
| 	return s.client.Do(ctx, req, nil) | 	return s.client.Do(ctx, req, nil) | ||||||
| } | } | ||||||
| @@ -8,7 +8,6 @@ package github | |||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/url" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // ChecksService provides access to the Checks API in the | // ChecksService provides access to the Checks API in the | ||||||
| @@ -51,9 +50,10 @@ type CheckRunOutput struct { | |||||||
| // CheckRunAnnotation represents an annotation object for a CheckRun output. | // CheckRunAnnotation represents an annotation object for a CheckRun output. | ||||||
| type CheckRunAnnotation struct { | type CheckRunAnnotation struct { | ||||||
| 	Path            *string `json:"path,omitempty"` | 	Path            *string `json:"path,omitempty"` | ||||||
| 	BlobHRef        *string `json:"blob_href,omitempty"` |  | ||||||
| 	StartLine       *int    `json:"start_line,omitempty"` | 	StartLine       *int    `json:"start_line,omitempty"` | ||||||
| 	EndLine         *int    `json:"end_line,omitempty"` | 	EndLine         *int    `json:"end_line,omitempty"` | ||||||
|  | 	StartColumn     *int    `json:"start_column,omitempty"` | ||||||
|  | 	EndColumn       *int    `json:"end_column,omitempty"` | ||||||
| 	AnnotationLevel *string `json:"annotation_level,omitempty"` | 	AnnotationLevel *string `json:"annotation_level,omitempty"` | ||||||
| 	Message         *string `json:"message,omitempty"` | 	Message         *string `json:"message,omitempty"` | ||||||
| 	Title           *string `json:"title,omitempty"` | 	Title           *string `json:"title,omitempty"` | ||||||
| @@ -81,6 +81,9 @@ type CheckSuite struct { | |||||||
| 	App          *App           `json:"app,omitempty"` | 	App          *App           `json:"app,omitempty"` | ||||||
| 	Repository   *Repository    `json:"repository,omitempty"` | 	Repository   *Repository    `json:"repository,omitempty"` | ||||||
| 	PullRequests []*PullRequest `json:"pull_requests,omitempty"` | 	PullRequests []*PullRequest `json:"pull_requests,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// The following fields are only populated by Webhook events. | ||||||
|  | 	HeadCommit *Commit `json:"head_commit,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c CheckRun) String() string { | func (c CheckRun) String() string { | ||||||
| @@ -93,7 +96,7 @@ func (c CheckSuite) String() string { | |||||||
| 
 | 
 | ||||||
| // GetCheckRun gets a check-run for a repository. | // GetCheckRun gets a check-run for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/runs/#get-a-single-check-run | // GitHub API docs: https://developer.github.com/v3/checks/runs/#get-a-check-run | ||||||
| func (s *ChecksService) GetCheckRun(ctx context.Context, owner, repo string, checkRunID int64) (*CheckRun, *Response, error) { | func (s *ChecksService) GetCheckRun(ctx context.Context, owner, repo string, checkRunID int64) (*CheckRun, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/check-runs/%v", owner, repo, checkRunID) | 	u := fmt.Sprintf("repos/%v/%v/check-runs/%v", owner, repo, checkRunID) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -114,7 +117,7 @@ func (s *ChecksService) GetCheckRun(ctx context.Context, owner, repo string, che | |||||||
| 
 | 
 | ||||||
| // GetCheckSuite gets a single check suite. | // GetCheckSuite gets a single check suite. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/suites/#get-a-single-check-suite | // GitHub API docs: https://developer.github.com/v3/checks/suites/#get-a-check-suite | ||||||
| func (s *ChecksService) GetCheckSuite(ctx context.Context, owner, repo string, checkSuiteID int64) (*CheckSuite, *Response, error) { | func (s *ChecksService) GetCheckSuite(ctx context.Context, owner, repo string, checkSuiteID int64) (*CheckSuite, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/check-suites/%v", owner, repo, checkSuiteID) | 	u := fmt.Sprintf("repos/%v/%v/check-suites/%v", owner, repo, checkSuiteID) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -136,12 +139,11 @@ func (s *ChecksService) GetCheckSuite(ctx context.Context, owner, repo string, c | |||||||
| // CreateCheckRunOptions sets up parameters needed to create a CheckRun. | // CreateCheckRunOptions sets up parameters needed to create a CheckRun. | ||||||
| type CreateCheckRunOptions struct { | type CreateCheckRunOptions struct { | ||||||
| 	Name        string            `json:"name"`                   // The name of the check (e.g., "code-coverage"). (Required.) | 	Name        string            `json:"name"`                   // The name of the check (e.g., "code-coverage"). (Required.) | ||||||
| 	HeadBranch  string            `json:"head_branch"`            // The name of the branch to perform a check against. (Required.) |  | ||||||
| 	HeadSHA     string            `json:"head_sha"`               // The SHA of the commit. (Required.) | 	HeadSHA     string            `json:"head_sha"`               // The SHA of the commit. (Required.) | ||||||
| 	DetailsURL  *string           `json:"details_url,omitempty"`  // The URL of the integrator's site that has the full details of the check. (Optional.) | 	DetailsURL  *string           `json:"details_url,omitempty"`  // The URL of the integrator's site that has the full details of the check. (Optional.) | ||||||
| 	ExternalID  *string           `json:"external_id,omitempty"`  // A reference for the run on the integrator's system. (Optional.) | 	ExternalID  *string           `json:"external_id,omitempty"`  // A reference for the run on the integrator's system. (Optional.) | ||||||
| 	Status      *string           `json:"status,omitempty"`       // The current status. Can be one of "queued", "in_progress", or "completed". Default: "queued". (Optional.) | 	Status      *string           `json:"status,omitempty"`       // The current status. Can be one of "queued", "in_progress", or "completed". Default: "queued". (Optional.) | ||||||
| 	Conclusion  *string           `json:"conclusion,omitempty"`   // Can be one of "success", "failure", "neutral", "cancelled", "timed_out", or "action_required". (Optional. Required if you provide a status of "completed".) | 	Conclusion  *string           `json:"conclusion,omitempty"`   // Can be one of "success", "failure", "neutral", "cancelled", "skipped", "timed_out", or "action_required". (Optional. Required if you provide a status of "completed".) | ||||||
| 	StartedAt   *Timestamp        `json:"started_at,omitempty"`   // The time that the check run began. (Optional.) | 	StartedAt   *Timestamp        `json:"started_at,omitempty"`   // The time that the check run began. (Optional.) | ||||||
| 	CompletedAt *Timestamp        `json:"completed_at,omitempty"` // The time the check completed. (Optional. Required if you provide conclusion.) | 	CompletedAt *Timestamp        `json:"completed_at,omitempty"` // The time the check completed. (Optional. Required if you provide conclusion.) | ||||||
| 	Output      *CheckRunOutput   `json:"output,omitempty"`       // Provide descriptive details about the run. (Optional) | 	Output      *CheckRunOutput   `json:"output,omitempty"`       // Provide descriptive details about the run. (Optional) | ||||||
| @@ -158,9 +160,9 @@ type CheckRunAction struct { | |||||||
| // CreateCheckRun creates a check run for repository. | // CreateCheckRun creates a check run for repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/runs/#create-a-check-run | // GitHub API docs: https://developer.github.com/v3/checks/runs/#create-a-check-run | ||||||
| func (s *ChecksService) CreateCheckRun(ctx context.Context, owner, repo string, opt CreateCheckRunOptions) (*CheckRun, *Response, error) { | func (s *ChecksService) CreateCheckRun(ctx context.Context, owner, repo string, opts CreateCheckRunOptions) (*CheckRun, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/check-runs", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/check-runs", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("POST", u, opt) | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -179,12 +181,11 @@ func (s *ChecksService) CreateCheckRun(ctx context.Context, owner, repo string, | |||||||
| // UpdateCheckRunOptions sets up parameters needed to update a CheckRun. | // UpdateCheckRunOptions sets up parameters needed to update a CheckRun. | ||||||
| type UpdateCheckRunOptions struct { | type UpdateCheckRunOptions struct { | ||||||
| 	Name        string            `json:"name"`                   // The name of the check (e.g., "code-coverage"). (Required.) | 	Name        string            `json:"name"`                   // The name of the check (e.g., "code-coverage"). (Required.) | ||||||
| 	HeadBranch  *string           `json:"head_branch,omitempty"`  // The name of the branch to perform a check against. (Optional.) |  | ||||||
| 	HeadSHA     *string           `json:"head_sha,omitempty"`     // The SHA of the commit. (Optional.) | 	HeadSHA     *string           `json:"head_sha,omitempty"`     // The SHA of the commit. (Optional.) | ||||||
| 	DetailsURL  *string           `json:"details_url,omitempty"`  // The URL of the integrator's site that has the full details of the check. (Optional.) | 	DetailsURL  *string           `json:"details_url,omitempty"`  // The URL of the integrator's site that has the full details of the check. (Optional.) | ||||||
| 	ExternalID  *string           `json:"external_id,omitempty"`  // A reference for the run on the integrator's system. (Optional.) | 	ExternalID  *string           `json:"external_id,omitempty"`  // A reference for the run on the integrator's system. (Optional.) | ||||||
| 	Status      *string           `json:"status,omitempty"`       // The current status. Can be one of "queued", "in_progress", or "completed". Default: "queued". (Optional.) | 	Status      *string           `json:"status,omitempty"`       // The current status. Can be one of "queued", "in_progress", or "completed". Default: "queued". (Optional.) | ||||||
| 	Conclusion  *string           `json:"conclusion,omitempty"`   // Can be one of "success", "failure", "neutral", "cancelled", "timed_out", or "action_required". (Optional. Required if you provide a status of "completed".) | 	Conclusion  *string           `json:"conclusion,omitempty"`   // Can be one of "success", "failure", "neutral", "cancelled", "skipped", "timed_out", or "action_required". (Optional. Required if you provide a status of "completed".) | ||||||
| 	CompletedAt *Timestamp        `json:"completed_at,omitempty"` // The time the check completed. (Optional. Required if you provide conclusion.) | 	CompletedAt *Timestamp        `json:"completed_at,omitempty"` // The time the check completed. (Optional. Required if you provide conclusion.) | ||||||
| 	Output      *CheckRunOutput   `json:"output,omitempty"`       // Provide descriptive details about the run. (Optional) | 	Output      *CheckRunOutput   `json:"output,omitempty"`       // Provide descriptive details about the run. (Optional) | ||||||
| 	Actions     []*CheckRunAction `json:"actions,omitempty"`      // Possible further actions the integrator can perform, which a user may trigger. (Optional.) | 	Actions     []*CheckRunAction `json:"actions,omitempty"`      // Possible further actions the integrator can perform, which a user may trigger. (Optional.) | ||||||
| @@ -193,9 +194,9 @@ type UpdateCheckRunOptions struct { | |||||||
| // UpdateCheckRun updates a check run for a specific commit in a repository. | // UpdateCheckRun updates a check run for a specific commit in a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/runs/#update-a-check-run | // GitHub API docs: https://developer.github.com/v3/checks/runs/#update-a-check-run | ||||||
| func (s *ChecksService) UpdateCheckRun(ctx context.Context, owner, repo string, checkRunID int64, opt UpdateCheckRunOptions) (*CheckRun, *Response, error) { | func (s *ChecksService) UpdateCheckRun(ctx context.Context, owner, repo string, checkRunID int64, opts UpdateCheckRunOptions) (*CheckRun, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/check-runs/%v", owner, repo, checkRunID) | 	u := fmt.Sprintf("repos/%v/%v/check-runs/%v", owner, repo, checkRunID) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, opt) | 	req, err := s.client.NewRequest("PATCH", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -213,10 +214,10 @@ func (s *ChecksService) UpdateCheckRun(ctx context.Context, owner, repo string, | |||||||
| 
 | 
 | ||||||
| // ListCheckRunAnnotations lists the annotations for a check run. | // ListCheckRunAnnotations lists the annotations for a check run. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/runs/#list-annotations-for-a-check-run | // GitHub API docs: https://developer.github.com/v3/checks/runs/#list-check-run-annotations | ||||||
| func (s *ChecksService) ListCheckRunAnnotations(ctx context.Context, owner, repo string, checkRunID int64, opt *ListOptions) ([]*CheckRunAnnotation, *Response, error) { | func (s *ChecksService) ListCheckRunAnnotations(ctx context.Context, owner, repo string, checkRunID int64, opts *ListOptions) ([]*CheckRunAnnotation, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/check-runs/%v/annotations", owner, repo, checkRunID) | 	u := fmt.Sprintf("repos/%v/%v/check-runs/%v/annotations", owner, repo, checkRunID) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -254,10 +255,10 @@ type ListCheckRunsResults struct { | |||||||
| 
 | 
 | ||||||
| // ListCheckRunsForRef lists check runs for a specific ref. | // ListCheckRunsForRef lists check runs for a specific ref. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/runs/#list-check-runs-for-a-specific-ref | // GitHub API docs: https://developer.github.com/v3/checks/runs/#list-check-runs-for-a-git-reference | ||||||
| func (s *ChecksService) ListCheckRunsForRef(ctx context.Context, owner, repo, ref string, opt *ListCheckRunsOptions) (*ListCheckRunsResults, *Response, error) { | func (s *ChecksService) ListCheckRunsForRef(ctx context.Context, owner, repo, ref string, opts *ListCheckRunsOptions) (*ListCheckRunsResults, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/commits/%v/check-runs", owner, repo, url.QueryEscape(ref)) | 	u := fmt.Sprintf("repos/%v/%v/commits/%v/check-runs", owner, repo, refURLEscape(ref)) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -281,9 +282,9 @@ func (s *ChecksService) ListCheckRunsForRef(ctx context.Context, owner, repo, re | |||||||
| // ListCheckRunsCheckSuite lists check runs for a check suite. | // ListCheckRunsCheckSuite lists check runs for a check suite. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/runs/#list-check-runs-in-a-check-suite | // GitHub API docs: https://developer.github.com/v3/checks/runs/#list-check-runs-in-a-check-suite | ||||||
| func (s *ChecksService) ListCheckRunsCheckSuite(ctx context.Context, owner, repo string, checkSuiteID int64, opt *ListCheckRunsOptions) (*ListCheckRunsResults, *Response, error) { | func (s *ChecksService) ListCheckRunsCheckSuite(ctx context.Context, owner, repo string, checkSuiteID int64, opts *ListCheckRunsOptions) (*ListCheckRunsResults, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/check-suites/%v/check-runs", owner, repo, checkSuiteID) | 	u := fmt.Sprintf("repos/%v/%v/check-suites/%v/check-runs", owner, repo, checkSuiteID) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -320,10 +321,10 @@ type ListCheckSuiteResults struct { | |||||||
| 
 | 
 | ||||||
| // ListCheckSuitesForRef lists check suite for a specific ref. | // ListCheckSuitesForRef lists check suite for a specific ref. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/suites/#list-check-suites-for-a-specific-ref | // GitHub API docs: https://developer.github.com/v3/checks/suites/#list-check-suites-for-a-git-reference | ||||||
| func (s *ChecksService) ListCheckSuitesForRef(ctx context.Context, owner, repo, ref string, opt *ListCheckSuiteOptions) (*ListCheckSuiteResults, *Response, error) { | func (s *ChecksService) ListCheckSuitesForRef(ctx context.Context, owner, repo, ref string, opts *ListCheckSuiteOptions) (*ListCheckSuiteResults, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/commits/%v/check-suites", owner, repo, url.QueryEscape(ref)) | 	u := fmt.Sprintf("repos/%v/%v/commits/%v/check-suites", owner, repo, refURLEscape(ref)) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -352,7 +353,7 @@ type AutoTriggerCheck struct { | |||||||
| 
 | 
 | ||||||
| // CheckSuitePreferenceOptions set options for check suite preferences for a repository. | // CheckSuitePreferenceOptions set options for check suite preferences for a repository. | ||||||
| type CheckSuitePreferenceOptions struct { | type CheckSuitePreferenceOptions struct { | ||||||
| 	PreferenceList *PreferenceList `json:"auto_trigger_checks,omitempty"` // A list of auto trigger checks that can be set for a check suite in a repository. | 	AutoTriggerChecks []*AutoTriggerCheck `json:"auto_trigger_checks,omitempty"` // A slice of auto trigger checks that can be set for a check suite in a repository. | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // CheckSuitePreferenceResults represents the results of the preference set operation. | // CheckSuitePreferenceResults represents the results of the preference set operation. | ||||||
| @@ -361,17 +362,17 @@ type CheckSuitePreferenceResults struct { | |||||||
| 	Repository  *Repository     `json:"repository,omitempty"` | 	Repository  *Repository     `json:"repository,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // PreferenceList represents a list of auto trigger checks for  repository | // PreferenceList represents a list of auto trigger checks for repository | ||||||
| type PreferenceList struct { | type PreferenceList struct { | ||||||
| 	AutoTriggerChecks []*AutoTriggerCheck `json:"auto_trigger_checks,omitempty"` // A slice of auto trigger checks that can be set for a check suite in a repository. | 	AutoTriggerChecks []*AutoTriggerCheck `json:"auto_trigger_checks,omitempty"` // A slice of auto trigger checks that can be set for a check suite in a repository. | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // SetCheckSuitePreferences changes the default automatic flow when creating check suites. | // SetCheckSuitePreferences changes the default automatic flow when creating check suites. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/suites/#set-preferences-for-check-suites-on-a-repository | // GitHub API docs: https://developer.github.com/v3/checks/suites/#update-repository-preferences-for-check-suites | ||||||
| func (s *ChecksService) SetCheckSuitePreferences(ctx context.Context, owner, repo string, opt CheckSuitePreferenceOptions) (*CheckSuitePreferenceResults, *Response, error) { | func (s *ChecksService) SetCheckSuitePreferences(ctx context.Context, owner, repo string, opts CheckSuitePreferenceOptions) (*CheckSuitePreferenceResults, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/check-suites/preferences", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/check-suites/preferences", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, opt) | 	req, err := s.client.NewRequest("PATCH", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -396,9 +397,9 @@ type CreateCheckSuiteOptions struct { | |||||||
| // CreateCheckSuite manually creates a check suite for a repository. | // CreateCheckSuite manually creates a check suite for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/suites/#create-a-check-suite | // GitHub API docs: https://developer.github.com/v3/checks/suites/#create-a-check-suite | ||||||
| func (s *ChecksService) CreateCheckSuite(ctx context.Context, owner, repo string, opt CreateCheckSuiteOptions) (*CheckSuite, *Response, error) { | func (s *ChecksService) CreateCheckSuite(ctx context.Context, owner, repo string, opts CreateCheckSuiteOptions) (*CheckSuite, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/check-suites", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/check-suites", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("POST", u, opt) | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -416,7 +417,7 @@ func (s *ChecksService) CreateCheckSuite(ctx context.Context, owner, repo string | |||||||
| 
 | 
 | ||||||
| // ReRequestCheckSuite triggers GitHub to rerequest an existing check suite, without pushing new code to a repository. | // ReRequestCheckSuite triggers GitHub to rerequest an existing check suite, without pushing new code to a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/checks/suites/#rerequest-check-suite | // GitHub API docs: https://developer.github.com/v3/checks/suites/#rerequest-a-check-suite | ||||||
| func (s *ChecksService) ReRequestCheckSuite(ctx context.Context, owner, repo string, checkSuiteID int64) (*Response, error) { | func (s *ChecksService) ReRequestCheckSuite(ctx context.Context, owner, repo string, checkSuiteID int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/check-suites/%v/rerequest", owner, repo, checkSuiteID) | 	u := fmt.Sprintf("repos/%v/%v/check-suites/%v/rerequest", owner, repo, checkSuiteID) | ||||||
| 
 | 
 | ||||||
							
								
								
									
										117
									
								
								vendor/github.com/google/go-github/v32/github/code-scanning.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								vendor/github.com/google/go-github/v32/github/code-scanning.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | |||||||
|  | // Copyright 2020 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // CodeScanningService handles communication with the code scanning related | ||||||
|  | // methods of the GitHub API. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/code-scanning/ | ||||||
|  | type CodeScanningService service | ||||||
|  |  | ||||||
|  | type Alert struct { | ||||||
|  | 	RuleID          *string    `json:"rule_id,omitempty"` | ||||||
|  | 	RuleSeverity    *string    `json:"rule_severity,omitempty"` | ||||||
|  | 	RuleDescription *string    `json:"rule_description,omitempty"` | ||||||
|  | 	Tool            *string    `json:"tool,omitempty"` | ||||||
|  | 	CreatedAt       *Timestamp `json:"created_at,omitempty"` | ||||||
|  | 	Open            *bool      `json:"open,omitempty"` | ||||||
|  | 	ClosedBy        *User      `json:"closed_by,omitempty"` | ||||||
|  | 	ClosedAt        *Timestamp `json:"closed_at,omitempty"` | ||||||
|  | 	URL             *string    `json:"url,omitempty"` | ||||||
|  | 	HTMLURL         *string    `json:"html_url,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ID returns the ID associated with an alert. It is the number at the end of the security alert's URL. | ||||||
|  | func (a *Alert) ID() int64 { | ||||||
|  | 	if a == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	s := a.GetHTMLURL() | ||||||
|  |  | ||||||
|  | 	// Check for an ID to parse at the end of the url | ||||||
|  | 	if i := strings.LastIndex(s, "/"); i >= 0 { | ||||||
|  | 		s = s[i+1:] | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Return the alert ID as a 64-bit integer. Unable to convert or out of range returns 0. | ||||||
|  | 	id, err := strconv.ParseInt(s, 10, 64) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // AlertListOptions specifies optional parameters to the CodeScanningService.ListAlerts | ||||||
|  | // method. | ||||||
|  | type AlertListOptions struct { | ||||||
|  | 	// State of the code scanning alerts to list. Set to closed to list only closed code scanning alerts. Default: open | ||||||
|  | 	State string `url:"state,omitempty"` | ||||||
|  |  | ||||||
|  | 	// Return code scanning alerts for a specific branch reference. The ref must be formatted as heads/<branch name>. | ||||||
|  | 	Ref string `url:"ref,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListAlertsForRepo lists code scanning alerts for a repository. | ||||||
|  | // | ||||||
|  | // Lists all open code scanning alerts for the default branch (usually master) and protected branches in a repository. | ||||||
|  | // You must use an access token with the security_events scope to use this endpoint. GitHub Apps must have the security_events | ||||||
|  | // read permission to use this endpoint. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/code-scanning/#list-code-scanning-alerts-for-a-repository | ||||||
|  | func (s *CodeScanningService) ListAlertsForRepo(ctx context.Context, owner, repo string, opts *AlertListOptions) ([]*Alert, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/code-scanning/alerts", owner, repo) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var alerts []*Alert | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &alerts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return alerts, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetAlert gets a single code scanning alert for a repository. | ||||||
|  | // | ||||||
|  | // You must use an access token with the security_events scope to use this endpoint. | ||||||
|  | // GitHub Apps must have the security_events read permission to use this endpoint. | ||||||
|  | // | ||||||
|  | // The security alert_id is the number at the end of the security alert's URL. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/code-scanning/#get-a-code-scanning-alert | ||||||
|  | func (s *CodeScanningService) GetAlert(ctx context.Context, owner, repo string, id int64) (*Alert, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/code-scanning/alerts/%v", owner, repo, id) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	a := new(Alert) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, a) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return a, resp, nil | ||||||
|  | } | ||||||
| @@ -8,7 +8,7 @@ Package github provides a client for using the GitHub API. | |||||||
| 
 | 
 | ||||||
| Usage: | Usage: | ||||||
| 
 | 
 | ||||||
| 	import "github.com/google/go-github/v24/github"	// with go modules enabled (GO111MODULE=on or outside GOPATH) | 	import "github.com/google/go-github/v32/github"	// with go modules enabled (GO111MODULE=on or outside GOPATH) | ||||||
| 	import "github.com/google/go-github/github"     // with go modules disabled | 	import "github.com/google/go-github/github"     // with go modules disabled | ||||||
| 
 | 
 | ||||||
| Construct a new GitHub client, then use the various services on the client to | Construct a new GitHub client, then use the various services on the client to | ||||||
| @@ -40,6 +40,8 @@ func (e *Event) ParsePayload() (payload interface{}, err error) { | |||||||
| 		payload = &CreateEvent{} | 		payload = &CreateEvent{} | ||||||
| 	case "DeleteEvent": | 	case "DeleteEvent": | ||||||
| 		payload = &DeleteEvent{} | 		payload = &DeleteEvent{} | ||||||
|  | 	case "DeployKeyEvent": | ||||||
|  | 		payload = &DeployKeyEvent{} | ||||||
| 	case "DeploymentEvent": | 	case "DeploymentEvent": | ||||||
| 		payload = &DeploymentEvent{} | 		payload = &DeploymentEvent{} | ||||||
| 	case "DeploymentStatusEvent": | 	case "DeploymentStatusEvent": | ||||||
| @@ -66,12 +68,16 @@ func (e *Event) ParsePayload() (payload interface{}, err error) { | |||||||
| 		payload = &MemberEvent{} | 		payload = &MemberEvent{} | ||||||
| 	case "MembershipEvent": | 	case "MembershipEvent": | ||||||
| 		payload = &MembershipEvent{} | 		payload = &MembershipEvent{} | ||||||
|  | 	case "MetaEvent": | ||||||
|  | 		payload = &MetaEvent{} | ||||||
| 	case "MilestoneEvent": | 	case "MilestoneEvent": | ||||||
| 		payload = &MilestoneEvent{} | 		payload = &MilestoneEvent{} | ||||||
| 	case "OrganizationEvent": | 	case "OrganizationEvent": | ||||||
| 		payload = &OrganizationEvent{} | 		payload = &OrganizationEvent{} | ||||||
| 	case "OrgBlockEvent": | 	case "OrgBlockEvent": | ||||||
| 		payload = &OrgBlockEvent{} | 		payload = &OrgBlockEvent{} | ||||||
|  | 	case "PackageEvent": | ||||||
|  | 		payload = &PackageEvent{} | ||||||
| 	case "PageBuildEvent": | 	case "PageBuildEvent": | ||||||
| 		payload = &PageBuildEvent{} | 		payload = &PageBuildEvent{} | ||||||
| 	case "PingEvent": | 	case "PingEvent": | ||||||
| @@ -96,14 +102,20 @@ func (e *Event) ParsePayload() (payload interface{}, err error) { | |||||||
| 		payload = &ReleaseEvent{} | 		payload = &ReleaseEvent{} | ||||||
| 	case "RepositoryEvent": | 	case "RepositoryEvent": | ||||||
| 		payload = &RepositoryEvent{} | 		payload = &RepositoryEvent{} | ||||||
|  | 	case "RepositoryDispatchEvent": | ||||||
|  | 		payload = &RepositoryDispatchEvent{} | ||||||
| 	case "RepositoryVulnerabilityAlertEvent": | 	case "RepositoryVulnerabilityAlertEvent": | ||||||
| 		payload = &RepositoryVulnerabilityAlertEvent{} | 		payload = &RepositoryVulnerabilityAlertEvent{} | ||||||
|  | 	case "StarEvent": | ||||||
|  | 		payload = &StarEvent{} | ||||||
| 	case "StatusEvent": | 	case "StatusEvent": | ||||||
| 		payload = &StatusEvent{} | 		payload = &StatusEvent{} | ||||||
| 	case "TeamEvent": | 	case "TeamEvent": | ||||||
| 		payload = &TeamEvent{} | 		payload = &TeamEvent{} | ||||||
| 	case "TeamAddEvent": | 	case "TeamAddEvent": | ||||||
| 		payload = &TeamAddEvent{} | 		payload = &TeamAddEvent{} | ||||||
|  | 	case "UserEvent": | ||||||
|  | 		payload = &UserEvent{} | ||||||
| 	case "WatchEvent": | 	case "WatchEvent": | ||||||
| 		payload = &WatchEvent{} | 		payload = &WatchEvent{} | ||||||
| 	} | 	} | ||||||
| @@ -7,19 +7,21 @@ | |||||||
| 
 | 
 | ||||||
| package github | package github | ||||||
| 
 | 
 | ||||||
|  | import "encoding/json" | ||||||
|  | 
 | ||||||
| // RequestedAction is included in a CheckRunEvent when a user has invoked an action, | // RequestedAction is included in a CheckRunEvent when a user has invoked an action, | ||||||
| // i.e. when the CheckRunEvent's Action field is "requested_action". | // i.e. when the CheckRunEvent's Action field is "requested_action". | ||||||
| type RequestedAction struct { | type RequestedAction struct { | ||||||
| 	Identifier string `json:"identifier"` // The integrator reference of the action requested by the user. | 	Identifier string `json:"identifier"` // The integrator reference of the action requested by the user. | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // CheckRunEvent is triggered when a check run is "created", "updated", or "re-requested". | // CheckRunEvent is triggered when a check run is "created", "updated", or "rerequested". | ||||||
| // The Webhook event name is "check_run". | // The Webhook event name is "check_run". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/types/#checkrunevent | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#checkrunevent | ||||||
| type CheckRunEvent struct { | type CheckRunEvent struct { | ||||||
| 	CheckRun *CheckRun `json:"check_run,omitempty"` | 	CheckRun *CheckRun `json:"check_run,omitempty"` | ||||||
| 	// The action performed. Can be "created", "updated", "rerequested" or "requested_action". | 	// The action performed. Possible values are: "created", "updated", "rerequested" or "requested_action". | ||||||
| 	Action *string `json:"action,omitempty"` | 	Action *string `json:"action,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// The following fields are only populated by Webhook events. | 	// The following fields are only populated by Webhook events. | ||||||
| @@ -32,13 +34,13 @@ type CheckRunEvent struct { | |||||||
| 	RequestedAction *RequestedAction `json:"requested_action,omitempty"` // | 	RequestedAction *RequestedAction `json:"requested_action,omitempty"` // | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // CheckSuiteEvent is triggered when a check suite is "completed", "requested", or "re-requested". | // CheckSuiteEvent is triggered when a check suite is "completed", "requested", or "rerequested". | ||||||
| // The Webhook event name is "check_suite". | // The Webhook event name is "check_suite". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/types/#checksuiteevent | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#checksuiteevent | ||||||
| type CheckSuiteEvent struct { | type CheckSuiteEvent struct { | ||||||
| 	CheckSuite *CheckSuite `json:"check_suite,omitempty"` | 	CheckSuite *CheckSuite `json:"check_suite,omitempty"` | ||||||
| 	// The action performed. Can be "completed", "requested" or "re-requested". | 	// The action performed. Possible values are: "completed", "requested" or "rerequested". | ||||||
| 	Action *string `json:"action,omitempty"` | 	Action *string `json:"action,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// The following fields are only populated by Webhook events. | 	// The following fields are only populated by Webhook events. | ||||||
| @@ -103,6 +105,19 @@ type DeleteEvent struct { | |||||||
| 	Installation *Installation `json:"installation,omitempty"` | 	Installation *Installation `json:"installation,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // DeployKeyEvent is triggered when a deploy key is added or removed from a repository. | ||||||
|  | // The Webhook event name is "deploy_key". | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#deploykeyevent | ||||||
|  | type DeployKeyEvent struct { | ||||||
|  | 	// Action is the action that was performed. Possible values are: | ||||||
|  | 	// "created" or "deleted". | ||||||
|  | 	Action *string `json:"action,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// The deploy key resource. | ||||||
|  | 	Key *Key `json:"key,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // DeploymentEvent represents a deployment. | // DeploymentEvent represents a deployment. | ||||||
| // The Webhook event name is "deployment". | // The Webhook event name is "deployment". | ||||||
| // | // | ||||||
| @@ -153,7 +168,7 @@ type ForkEvent struct { | |||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/types/#githubappauthorizationevent | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#githubappauthorizationevent | ||||||
| type GitHubAppAuthorizationEvent struct { | type GitHubAppAuthorizationEvent struct { | ||||||
| 	// The action performed. Can be "revoked". | 	// The action performed. Possible value is: "revoked". | ||||||
| 	Action *string `json:"action,omitempty"` | 	Action *string `json:"action,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// The following fields are only populated by Webhook events. | 	// The following fields are only populated by Webhook events. | ||||||
| @@ -285,14 +300,17 @@ type IssueCommentEvent struct { | |||||||
| 	Installation *Installation `json:"installation,omitempty"` | 	Installation *Installation `json:"installation,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // IssuesEvent is triggered when an issue is assigned, unassigned, labeled, | // IssuesEvent is triggered when an issue is opened, edited, deleted, transferred, | ||||||
| // unlabeled, opened, closed, or reopened. | // pinned, unpinned, closed, reopened, assigned, unassigned, labeled, unlabeled, | ||||||
|  | // locked, unlocked, milestoned, or demilestoned. | ||||||
| // The Webhook event name is "issues". | // The Webhook event name is "issues". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/types/#issuesevent | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#issuesevent | ||||||
| type IssuesEvent struct { | type IssuesEvent struct { | ||||||
| 	// Action is the action that was performed. Possible values are: "assigned", | 	// Action is the action that was performed. Possible values are: "opened", | ||||||
| 	// "unassigned", "labeled", "unlabeled", "opened", "closed", "reopened", "edited". | 	// "edited", "deleted", "transferred", "pinned", "unpinned", "closed", "reopened", | ||||||
|  | 	// "assigned", "unassigned", "labeled", "unlabeled", "locked", "unlocked", | ||||||
|  | 	// "milestoned", or "demilestoned". | ||||||
| 	Action   *string `json:"action,omitempty"` | 	Action   *string `json:"action,omitempty"` | ||||||
| 	Issue    *Issue  `json:"issue,omitempty"` | 	Issue    *Issue  `json:"issue,omitempty"` | ||||||
| 	Assignee *User   `json:"assignee,omitempty"` | 	Assignee *User   `json:"assignee,omitempty"` | ||||||
| @@ -376,6 +394,23 @@ type MembershipEvent struct { | |||||||
| 	Installation *Installation `json:"installation,omitempty"` | 	Installation *Installation `json:"installation,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // MetaEvent is triggered when the webhook that this event is configured on is deleted. | ||||||
|  | // This event will only listen for changes to the particular hook the event is installed on. | ||||||
|  | // Therefore, it must be selected for each hook that you'd like to receive meta events for. | ||||||
|  | // The Webhook event name is "meta". | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#metaevent | ||||||
|  | type MetaEvent struct { | ||||||
|  | 	// Action is the action that was performed. Possible value is: "deleted". | ||||||
|  | 	Action *string `json:"action,omitempty"` | ||||||
|  | 	// The ID of the modified webhook. | ||||||
|  | 	HookID *int64 `json:"hook_id,omitempty"` | ||||||
|  | 	// The modified webhook. | ||||||
|  | 	// This will contain different keys based on the type of webhook it is: repository, | ||||||
|  | 	// organization, business, app, or GitHub Marketplace. | ||||||
|  | 	Hook *Hook `json:"hook,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // MilestoneEvent is triggered when a milestone is created, closed, opened, edited, or deleted. | // MilestoneEvent is triggered when a milestone is created, closed, opened, edited, or deleted. | ||||||
| // The Webhook event name is "milestone". | // The Webhook event name is "milestone". | ||||||
| // | // | ||||||
| @@ -394,17 +429,18 @@ type MilestoneEvent struct { | |||||||
| 	Installation *Installation `json:"installation,omitempty"` | 	Installation *Installation `json:"installation,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // OrganizationEvent is triggered when a user is added, removed, or invited to an organization. | // OrganizationEvent is triggered when an organization is deleted and renamed, and when a user is added, | ||||||
|  | // removed, or invited to an organization. | ||||||
| // Events of this type are not visible in timelines. These events are only used to trigger organization hooks. | // Events of this type are not visible in timelines. These events are only used to trigger organization hooks. | ||||||
| // Webhook event name is "organization". | // Webhook event name is "organization". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/types/#organizationevent | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#organizationevent | ||||||
| type OrganizationEvent struct { | type OrganizationEvent struct { | ||||||
| 	// Action is the action that was performed. | 	// Action is the action that was performed. | ||||||
| 	// Can be one of "member_added", "member_removed", or "member_invited". | 	// Possible values are: "deleted", "renamed", "member_added", "member_removed", or "member_invited". | ||||||
| 	Action *string `json:"action,omitempty"` | 	Action *string `json:"action,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// Invitaion is the invitation for the user or email if the action is "member_invited". | 	// Invitation is the invitation for the user or email if the action is "member_invited". | ||||||
| 	Invitation *Invitation `json:"invitation,omitempty"` | 	Invitation *Invitation `json:"invitation,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// Membership is the membership between the user and the organization. | 	// Membership is the membership between the user and the organization. | ||||||
| @@ -432,6 +468,22 @@ type OrgBlockEvent struct { | |||||||
| 	Installation *Installation `json:"installation,omitempty"` | 	Installation *Installation `json:"installation,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // PackageEvent represents activity related to GitHub Packages. | ||||||
|  | // The Webhook event name is "package". | ||||||
|  | // | ||||||
|  | // This event is triggered when a GitHub Package is published or updated. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/webhooks/event-payloads/#package | ||||||
|  | type PackageEvent struct { | ||||||
|  | 	// Action is the action that was performed. | ||||||
|  | 	// Can be "published" or "updated". | ||||||
|  | 	Action  *string       `json:"action,omitempty"` | ||||||
|  | 	Package *Package      `json:"package,omitempty"` | ||||||
|  | 	Repo    *Repository   `json:"repository,omitempty"` | ||||||
|  | 	Org     *Organization `json:"organization,omitempty"` | ||||||
|  | 	Sender  *User         `json:"sender,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // PageBuildEvent represents an attempted build of a GitHub Pages site, whether | // PageBuildEvent represents an attempted build of a GitHub Pages site, whether | ||||||
| // successful or not. | // successful or not. | ||||||
| // The Webhook event name is "page_build". | // The Webhook event name is "page_build". | ||||||
| @@ -527,18 +579,20 @@ type PublicEvent struct { | |||||||
| 	Installation *Installation `json:"installation,omitempty"` | 	Installation *Installation `json:"installation,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // PullRequestEvent is triggered when a pull request is assigned, unassigned, | // PullRequestEvent is triggered when a pull request is assigned, unassigned, labeled, | ||||||
| // labeled, unlabeled, opened, closed, reopened, or synchronized. | // unlabeled, opened, edited, closed, reopened, synchronize, ready_for_review, | ||||||
|  | // locked, unlocked, a pull request review is requested, or a review request is removed. | ||||||
| // The Webhook event name is "pull_request". | // The Webhook event name is "pull_request". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/types/#pullrequestevent | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#pullrequestevent | ||||||
| type PullRequestEvent struct { | type PullRequestEvent struct { | ||||||
| 	// Action is the action that was performed. Possible values are: | 	// Action is the action that was performed. Possible values are: | ||||||
| 	// "assigned", "unassigned", "review_requested", "review_request_removed", "labeled", "unlabeled", | 	// "assigned", "unassigned", "review_requested", "review_request_removed", "labeled", "unlabeled", | ||||||
| 	// "opened", "closed", "reopened", "synchronize", "edited". | 	// "opened", "edited", "closed", "ready_for_review", "locked", "unlocked", or "reopened". | ||||||
| 	// If the action is "closed" and the merged key is false, | 	// If the action is "closed" and the "merged" key is "false", the pull request was closed with unmerged commits. | ||||||
| 	// the pull request was closed with unmerged commits. If the action is "closed" | 	// If the action is "closed" and the "merged" key is "true", the pull request was merged. | ||||||
| 	// and the merged key is true, the pull request was merged. | 	// While webhooks are also triggered when a pull request is synchronized, Events API timelines | ||||||
|  | 	// don't include pull request events with the "synchronize" action. | ||||||
| 	Action      *string      `json:"action,omitempty"` | 	Action      *string      `json:"action,omitempty"` | ||||||
| 	Assignee    *User        `json:"assignee,omitempty"` | 	Assignee    *User        `json:"assignee,omitempty"` | ||||||
| 	Number      *int         `json:"number,omitempty"` | 	Number      *int         `json:"number,omitempty"` | ||||||
| @@ -549,15 +603,22 @@ type PullRequestEvent struct { | |||||||
| 	// RequestedReviewer is populated in "review_requested", "review_request_removed" event deliveries. | 	// RequestedReviewer is populated in "review_requested", "review_request_removed" event deliveries. | ||||||
| 	// A request affecting multiple reviewers at once is split into multiple | 	// A request affecting multiple reviewers at once is split into multiple | ||||||
| 	// such event deliveries, each with a single, different RequestedReviewer. | 	// such event deliveries, each with a single, different RequestedReviewer. | ||||||
| 	RequestedReviewer *User         `json:"requested_reviewer,omitempty"` | 	RequestedReviewer *User `json:"requested_reviewer,omitempty"` | ||||||
| 	Repo              *Repository   `json:"repository,omitempty"` | 	// In the event that a team is requested instead of a user, "requested_team" gets sent in place of | ||||||
| 	Sender            *User         `json:"sender,omitempty"` | 	// "requested_user" with the same delivery behavior. | ||||||
| 	Installation      *Installation `json:"installation,omitempty"` | 	RequestedTeam *Team         `json:"requested_team,omitempty"` | ||||||
| 	Label             *Label        `json:"label,omitempty"` // Populated in "labeled" event deliveries. | 	Repo          *Repository   `json:"repository,omitempty"` | ||||||
|  | 	Sender        *User         `json:"sender,omitempty"` | ||||||
|  | 	Installation  *Installation `json:"installation,omitempty"` | ||||||
|  | 	Label         *Label        `json:"label,omitempty"` // Populated in "labeled" event deliveries. | ||||||
| 
 | 
 | ||||||
| 	// The following field is only present when the webhook is triggered on | 	// The following field is only present when the webhook is triggered on | ||||||
| 	// a repository belonging to an organization. | 	// a repository belonging to an organization. | ||||||
| 	Organization *Organization `json:"organization,omitempty"` | 	Organization *Organization `json:"organization,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// The following fields are only populated when the Action is "synchronize". | ||||||
|  | 	Before *string `json:"before,omitempty"` | ||||||
|  | 	After  *string `json:"after,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // PullRequestReviewEvent is triggered when a review is submitted on a pull | // PullRequestReviewEvent is triggered when a review is submitted on a pull | ||||||
| @@ -604,13 +665,13 @@ type PullRequestReviewCommentEvent struct { | |||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/types/#pushevent | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#pushevent | ||||||
| type PushEvent struct { | type PushEvent struct { | ||||||
| 	PushID       *int64            `json:"push_id,omitempty"` | 	PushID       *int64        `json:"push_id,omitempty"` | ||||||
| 	Head         *string           `json:"head,omitempty"` | 	Head         *string       `json:"head,omitempty"` | ||||||
| 	Ref          *string           `json:"ref,omitempty"` | 	Ref          *string       `json:"ref,omitempty"` | ||||||
| 	Size         *int              `json:"size,omitempty"` | 	Size         *int          `json:"size,omitempty"` | ||||||
| 	Commits      []PushEventCommit `json:"commits,omitempty"` | 	Commits      []*HeadCommit `json:"commits,omitempty"` | ||||||
| 	Before       *string           `json:"before,omitempty"` | 	Before       *string       `json:"before,omitempty"` | ||||||
| 	DistinctSize *int              `json:"distinct_size,omitempty"` | 	DistinctSize *int          `json:"distinct_size,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// The following fields are only populated by Webhook events. | 	// The following fields are only populated by Webhook events. | ||||||
| 	After        *string              `json:"after,omitempty"` | 	After        *string              `json:"after,omitempty"` | ||||||
| @@ -620,7 +681,7 @@ type PushEvent struct { | |||||||
| 	BaseRef      *string              `json:"base_ref,omitempty"` | 	BaseRef      *string              `json:"base_ref,omitempty"` | ||||||
| 	Compare      *string              `json:"compare,omitempty"` | 	Compare      *string              `json:"compare,omitempty"` | ||||||
| 	Repo         *PushEventRepository `json:"repository,omitempty"` | 	Repo         *PushEventRepository `json:"repository,omitempty"` | ||||||
| 	HeadCommit   *PushEventCommit     `json:"head_commit,omitempty"` | 	HeadCommit   *HeadCommit          `json:"head_commit,omitempty"` | ||||||
| 	Pusher       *User                `json:"pusher,omitempty"` | 	Pusher       *User                `json:"pusher,omitempty"` | ||||||
| 	Sender       *User                `json:"sender,omitempty"` | 	Sender       *User                `json:"sender,omitempty"` | ||||||
| 	Installation *Installation        `json:"installation,omitempty"` | 	Installation *Installation        `json:"installation,omitempty"` | ||||||
| @@ -630,8 +691,8 @@ func (p PushEvent) String() string { | |||||||
| 	return Stringify(p) | 	return Stringify(p) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // PushEventCommit represents a git commit in a GitHub PushEvent. | // HeadCommit represents a git commit in a GitHub PushEvent. | ||||||
| type PushEventCommit struct { | type HeadCommit struct { | ||||||
| 	Message  *string       `json:"message,omitempty"` | 	Message  *string       `json:"message,omitempty"` | ||||||
| 	Author   *CommitAuthor `json:"author,omitempty"` | 	Author   *CommitAuthor `json:"author,omitempty"` | ||||||
| 	URL      *string       `json:"url,omitempty"` | 	URL      *string       `json:"url,omitempty"` | ||||||
| @@ -650,7 +711,7 @@ type PushEventCommit struct { | |||||||
| 	Modified  []string      `json:"modified,omitempty"` | 	Modified  []string      `json:"modified,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (p PushEventCommit) String() string { | func (p HeadCommit) String() string { | ||||||
| 	return Stringify(p) | 	return Stringify(p) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -668,6 +729,7 @@ type PushEventRepository struct { | |||||||
| 	PushedAt        *Timestamp `json:"pushed_at,omitempty"` | 	PushedAt        *Timestamp `json:"pushed_at,omitempty"` | ||||||
| 	UpdatedAt       *Timestamp `json:"updated_at,omitempty"` | 	UpdatedAt       *Timestamp `json:"updated_at,omitempty"` | ||||||
| 	Homepage        *string    `json:"homepage,omitempty"` | 	Homepage        *string    `json:"homepage,omitempty"` | ||||||
|  | 	PullsURL        *string    `json:"pulls_url,omitempty"` | ||||||
| 	Size            *int       `json:"size,omitempty"` | 	Size            *int       `json:"size,omitempty"` | ||||||
| 	StargazersCount *int       `json:"stargazers_count,omitempty"` | 	StargazersCount *int       `json:"stargazers_count,omitempty"` | ||||||
| 	WatchersCount   *int       `json:"watchers_count,omitempty"` | 	WatchersCount   *int       `json:"watchers_count,omitempty"` | ||||||
| @@ -677,6 +739,8 @@ type PushEventRepository struct { | |||||||
| 	HasWiki         *bool      `json:"has_wiki,omitempty"` | 	HasWiki         *bool      `json:"has_wiki,omitempty"` | ||||||
| 	HasPages        *bool      `json:"has_pages,omitempty"` | 	HasPages        *bool      `json:"has_pages,omitempty"` | ||||||
| 	ForksCount      *int       `json:"forks_count,omitempty"` | 	ForksCount      *int       `json:"forks_count,omitempty"` | ||||||
|  | 	Archived        *bool      `json:"archived,omitempty"` | ||||||
|  | 	Disabled        *bool      `json:"disabled,omitempty"` | ||||||
| 	OpenIssuesCount *int       `json:"open_issues_count,omitempty"` | 	OpenIssuesCount *int       `json:"open_issues_count,omitempty"` | ||||||
| 	DefaultBranch   *string    `json:"default_branch,omitempty"` | 	DefaultBranch   *string    `json:"default_branch,omitempty"` | ||||||
| 	MasterBranch    *string    `json:"master_branch,omitempty"` | 	MasterBranch    *string    `json:"master_branch,omitempty"` | ||||||
| @@ -697,12 +761,14 @@ type PushEventRepoOwner struct { | |||||||
| 	Email *string `json:"email,omitempty"` | 	Email *string `json:"email,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ReleaseEvent is triggered when a release is published. | // ReleaseEvent is triggered when a release is published, unpublished, created, | ||||||
|  | // edited, deleted, or prereleased. | ||||||
| // The Webhook event name is "release". | // The Webhook event name is "release". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/types/#releaseevent | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#releaseevent | ||||||
| type ReleaseEvent struct { | type ReleaseEvent struct { | ||||||
| 	// Action is the action that was performed. Possible value is: "published". | 	// Action is the action that was performed. Possible values are: "published", "unpublished", | ||||||
|  | 	// "created", "edited", "deleted", or "prereleased". | ||||||
| 	Action  *string            `json:"action,omitempty"` | 	Action  *string            `json:"action,omitempty"` | ||||||
| 	Release *RepositoryRelease `json:"release,omitempty"` | 	Release *RepositoryRelease `json:"release,omitempty"` | ||||||
| 
 | 
 | ||||||
| @@ -712,7 +778,9 @@ type ReleaseEvent struct { | |||||||
| 	Installation *Installation `json:"installation,omitempty"` | 	Installation *Installation `json:"installation,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // RepositoryEvent is triggered when a repository is created. | // RepositoryEvent is triggered when a repository is created, archived, unarchived, | ||||||
|  | // renamed, edited, transferred, made public, or made private. Organization hooks are | ||||||
|  | // also trigerred when a repository is deleted. | ||||||
| // The Webhook event name is "repository". | // The Webhook event name is "repository". | ||||||
| // | // | ||||||
| // Events of this type are not visible in timelines, they are only used to | // Events of this type are not visible in timelines, they are only used to | ||||||
| @@ -720,8 +788,9 @@ type ReleaseEvent struct { | |||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/types/#repositoryevent | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#repositoryevent | ||||||
| type RepositoryEvent struct { | type RepositoryEvent struct { | ||||||
| 	// Action is the action that was performed. Possible values are: "created", "deleted", | 	// Action is the action that was performed. Possible values are: "created", | ||||||
| 	// "publicized", "privatized". | 	// "deleted" (organization hooks only), "archived", "unarchived", "edited", "renamed", | ||||||
|  | 	// "transferred", "publicized", or "privatized". | ||||||
| 	Action *string     `json:"action,omitempty"` | 	Action *string     `json:"action,omitempty"` | ||||||
| 	Repo   *Repository `json:"repository,omitempty"` | 	Repo   *Repository `json:"repository,omitempty"` | ||||||
| 
 | 
 | ||||||
| @@ -731,11 +800,27 @@ type RepositoryEvent struct { | |||||||
| 	Installation *Installation `json:"installation,omitempty"` | 	Installation *Installation `json:"installation,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // RepositoryDispatchEvent is triggered when a client sends a POST request to the repository dispatch event endpoint. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#repositorydispatchevent | ||||||
|  | type RepositoryDispatchEvent struct { | ||||||
|  | 	// Action is the event_type that submitted with the repository dispatch payload. Value can be any string. | ||||||
|  | 	Action        *string         `json:"action,omitempty"` | ||||||
|  | 	Branch        *string         `json:"branch,omitempty"` | ||||||
|  | 	ClientPayload json.RawMessage `json:"client_payload,omitempty"` | ||||||
|  | 	Repo          *Repository     `json:"repository,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// The following fields are only populated by Webhook events. | ||||||
|  | 	Org          *Organization `json:"organization,omitempty"` | ||||||
|  | 	Sender       *User         `json:"sender,omitempty"` | ||||||
|  | 	Installation *Installation `json:"installation,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // RepositoryVulnerabilityAlertEvent is triggered when a security alert is created, dismissed, or resolved. | // RepositoryVulnerabilityAlertEvent is triggered when a security alert is created, dismissed, or resolved. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/activity/events/types/#repositoryvulnerabilityalertevent | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#repositoryvulnerabilityalertevent | ||||||
| type RepositoryVulnerabilityAlertEvent struct { | type RepositoryVulnerabilityAlertEvent struct { | ||||||
| 	// Action is the action that was performed. This can be: "create", "dismiss", "resolve". | 	// Action is the action that was performed. Possible values are: "create", "dismiss", "resolve". | ||||||
| 	Action *string `json:"action,omitempty"` | 	Action *string `json:"action,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	//The security alert of the vulnerable dependency. | 	//The security alert of the vulnerable dependency. | ||||||
| @@ -750,6 +835,21 @@ type RepositoryVulnerabilityAlertEvent struct { | |||||||
| 		DismissReason       *string    `json:"dismiss_reason,omitempty"` | 		DismissReason       *string    `json:"dismiss_reason,omitempty"` | ||||||
| 		DismissedAt         *Timestamp `json:"dismissed_at,omitempty"` | 		DismissedAt         *Timestamp `json:"dismissed_at,omitempty"` | ||||||
| 	} `json:"alert,omitempty"` | 	} `json:"alert,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	//The repository of the vulnerable dependency. | ||||||
|  | 	Repository *Repository `json:"repository,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // StarEvent is triggered when a star is added or removed from a repository. | ||||||
|  | // The Webhook event name is "star". | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/activity/events/types/#starevent | ||||||
|  | type StarEvent struct { | ||||||
|  | 	// Action is the action that was performed. Possible values are: "created" or "deleted". | ||||||
|  | 	Action *string `json:"action,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// StarredAt is the time the star was created. It will be null for the "deleted" action. | ||||||
|  | 	StarredAt *Timestamp `json:"starred_at,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // StatusEvent is triggered when the status of a Git commit changes. | // StatusEvent is triggered when the status of a Git commit changes. | ||||||
| @@ -815,6 +915,20 @@ type TeamAddEvent struct { | |||||||
| 	Installation *Installation `json:"installation,omitempty"` | 	Installation *Installation `json:"installation,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // UserEvent is triggered when a user is created or deleted. | ||||||
|  | // The Webhook event name is "user". | ||||||
|  | // | ||||||
|  | // Only global webhooks can subscribe to this event type. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/enterprise/v3/activity/events/types/#userevent-enterprise | ||||||
|  | type UserEvent struct { | ||||||
|  | 	User *User `json:"user,omitempty"` | ||||||
|  | 	// The action performed. Possible values are: "created" or "deleted". | ||||||
|  | 	Action     *string     `json:"action,omitempty"` | ||||||
|  | 	Enterprise *Enterprise `json:"enterprise,omitempty"` | ||||||
|  | 	Sender     *User       `json:"sender,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // WatchEvent is related to starring a repository, not watching. See this API | // WatchEvent is related to starring a repository, not watching. See this API | ||||||
| // blog post for an explanation: https://developer.github.com/changes/2012-09-05-watcher-api/ | // blog post for an explanation: https://developer.github.com/changes/2012-09-05-watcher-api/ | ||||||
| // | // | ||||||
| @@ -96,15 +96,16 @@ type GistListOptions struct { | |||||||
| // is authenticated, it will returns all gists for the authenticated | // is authenticated, it will returns all gists for the authenticated | ||||||
| // user. | // user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/#list-gists | // GitHub API docs: https://developer.github.com/v3/gists/#list-gists-for-a-user | ||||||
| func (s *GistsService) List(ctx context.Context, user string, opt *GistListOptions) ([]*Gist, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/gists/#list-gists-for-the-authenticated-user | ||||||
|  | func (s *GistsService) List(ctx context.Context, user string, opts *GistListOptions) ([]*Gist, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if user != "" { | 	if user != "" { | ||||||
| 		u = fmt.Sprintf("users/%v/gists", user) | 		u = fmt.Sprintf("users/%v/gists", user) | ||||||
| 	} else { | 	} else { | ||||||
| 		u = "gists" | 		u = "gists" | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -125,9 +126,9 @@ func (s *GistsService) List(ctx context.Context, user string, opt *GistListOptio | |||||||
| 
 | 
 | ||||||
| // ListAll lists all public gists. | // ListAll lists all public gists. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/#list-gists | // GitHub API docs: https://developer.github.com/v3/gists/#list-public-gists | ||||||
| func (s *GistsService) ListAll(ctx context.Context, opt *GistListOptions) ([]*Gist, *Response, error) { | func (s *GistsService) ListAll(ctx context.Context, opts *GistListOptions) ([]*Gist, *Response, error) { | ||||||
| 	u, err := addOptions("gists/public", opt) | 	u, err := addOptions("gists/public", opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -148,9 +149,9 @@ func (s *GistsService) ListAll(ctx context.Context, opt *GistListOptions) ([]*Gi | |||||||
| 
 | 
 | ||||||
| // ListStarred lists starred gists of authenticated user. | // ListStarred lists starred gists of authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/#list-gists | // GitHub API docs: https://developer.github.com/v3/gists/#list-starred-gists | ||||||
| func (s *GistsService) ListStarred(ctx context.Context, opt *GistListOptions) ([]*Gist, *Response, error) { | func (s *GistsService) ListStarred(ctx context.Context, opts *GistListOptions) ([]*Gist, *Response, error) { | ||||||
| 	u, err := addOptions("gists/starred", opt) | 	u, err := addOptions("gists/starred", opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -171,7 +172,7 @@ func (s *GistsService) ListStarred(ctx context.Context, opt *GistListOptions) ([ | |||||||
| 
 | 
 | ||||||
| // Get a single gist. | // Get a single gist. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/#get-a-single-gist | // GitHub API docs: https://developer.github.com/v3/gists/#get-a-gist | ||||||
| func (s *GistsService) Get(ctx context.Context, id string) (*Gist, *Response, error) { | func (s *GistsService) Get(ctx context.Context, id string) (*Gist, *Response, error) { | ||||||
| 	u := fmt.Sprintf("gists/%v", id) | 	u := fmt.Sprintf("gists/%v", id) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -190,7 +191,7 @@ func (s *GistsService) Get(ctx context.Context, id string) (*Gist, *Response, er | |||||||
| 
 | 
 | ||||||
| // GetRevision gets a specific revision of a gist. | // GetRevision gets a specific revision of a gist. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/#get-a-specific-revision-of-a-gist | // GitHub API docs: https://developer.github.com/v3/gists/#get-a-gist-revision | ||||||
| func (s *GistsService) GetRevision(ctx context.Context, id, sha string) (*Gist, *Response, error) { | func (s *GistsService) GetRevision(ctx context.Context, id, sha string) (*Gist, *Response, error) { | ||||||
| 	u := fmt.Sprintf("gists/%v/%v", id, sha) | 	u := fmt.Sprintf("gists/%v/%v", id, sha) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -228,7 +229,7 @@ func (s *GistsService) Create(ctx context.Context, gist *Gist) (*Gist, *Response | |||||||
| 
 | 
 | ||||||
| // Edit a gist. | // Edit a gist. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/#edit-a-gist | // GitHub API docs: https://developer.github.com/v3/gists/#update-a-gist | ||||||
| func (s *GistsService) Edit(ctx context.Context, id string, gist *Gist) (*Gist, *Response, error) { | func (s *GistsService) Edit(ctx context.Context, id string, gist *Gist) (*Gist, *Response, error) { | ||||||
| 	u := fmt.Sprintf("gists/%v", id) | 	u := fmt.Sprintf("gists/%v", id) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, gist) | 	req, err := s.client.NewRequest("PATCH", u, gist) | ||||||
| @@ -248,9 +249,9 @@ func (s *GistsService) Edit(ctx context.Context, id string, gist *Gist) (*Gist, | |||||||
| // ListCommits lists commits of a gist. | // ListCommits lists commits of a gist. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/#list-gist-commits | // GitHub API docs: https://developer.github.com/v3/gists/#list-gist-commits | ||||||
| func (s *GistsService) ListCommits(ctx context.Context, id string, opt *ListOptions) ([]*GistCommit, *Response, error) { | func (s *GistsService) ListCommits(ctx context.Context, id string, opts *ListOptions) ([]*GistCommit, *Response, error) { | ||||||
| 	u := fmt.Sprintf("gists/%v/commits", id) | 	u := fmt.Sprintf("gists/%v/commits", id) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -341,8 +342,13 @@ func (s *GistsService) Fork(ctx context.Context, id string) (*Gist, *Response, e | |||||||
| // ListForks lists forks of a gist. | // ListForks lists forks of a gist. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/#list-gist-forks | // GitHub API docs: https://developer.github.com/v3/gists/#list-gist-forks | ||||||
| func (s *GistsService) ListForks(ctx context.Context, id string) ([]*GistFork, *Response, error) { | func (s *GistsService) ListForks(ctx context.Context, id string, opts *ListOptions) ([]*GistFork, *Response, error) { | ||||||
| 	u := fmt.Sprintf("gists/%v/forks", id) | 	u := fmt.Sprintf("gists/%v/forks", id) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| @@ -26,10 +26,10 @@ func (g GistComment) String() string { | |||||||
| 
 | 
 | ||||||
| // ListComments lists all comments for a gist. | // ListComments lists all comments for a gist. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/comments/#list-comments-on-a-gist | // GitHub API docs: https://developer.github.com/v3/gists/comments/#list-gist-comments | ||||||
| func (s *GistsService) ListComments(ctx context.Context, gistID string, opt *ListOptions) ([]*GistComment, *Response, error) { | func (s *GistsService) ListComments(ctx context.Context, gistID string, opts *ListOptions) ([]*GistComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("gists/%v/comments", gistID) | 	u := fmt.Sprintf("gists/%v/comments", gistID) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -50,7 +50,7 @@ func (s *GistsService) ListComments(ctx context.Context, gistID string, opt *Lis | |||||||
| 
 | 
 | ||||||
| // GetComment retrieves a single comment from a gist. | // GetComment retrieves a single comment from a gist. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/comments/#get-a-single-comment | // GitHub API docs: https://developer.github.com/v3/gists/comments/#get-a-gist-comment | ||||||
| func (s *GistsService) GetComment(ctx context.Context, gistID string, commentID int64) (*GistComment, *Response, error) { | func (s *GistsService) GetComment(ctx context.Context, gistID string, commentID int64) (*GistComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID) | 	u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -69,7 +69,7 @@ func (s *GistsService) GetComment(ctx context.Context, gistID string, commentID | |||||||
| 
 | 
 | ||||||
| // CreateComment creates a comment for a gist. | // CreateComment creates a comment for a gist. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/comments/#create-a-comment | // GitHub API docs: https://developer.github.com/v3/gists/comments/#create-a-gist-comment | ||||||
| func (s *GistsService) CreateComment(ctx context.Context, gistID string, comment *GistComment) (*GistComment, *Response, error) { | func (s *GistsService) CreateComment(ctx context.Context, gistID string, comment *GistComment) (*GistComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("gists/%v/comments", gistID) | 	u := fmt.Sprintf("gists/%v/comments", gistID) | ||||||
| 	req, err := s.client.NewRequest("POST", u, comment) | 	req, err := s.client.NewRequest("POST", u, comment) | ||||||
| @@ -88,7 +88,7 @@ func (s *GistsService) CreateComment(ctx context.Context, gistID string, comment | |||||||
| 
 | 
 | ||||||
| // EditComment edits an existing gist comment. | // EditComment edits an existing gist comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/comments/#edit-a-comment | // GitHub API docs: https://developer.github.com/v3/gists/comments/#update-a-gist-comment | ||||||
| func (s *GistsService) EditComment(ctx context.Context, gistID string, commentID int64, comment *GistComment) (*GistComment, *Response, error) { | func (s *GistsService) EditComment(ctx context.Context, gistID string, commentID int64, comment *GistComment) (*GistComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID) | 	u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, comment) | 	req, err := s.client.NewRequest("PATCH", u, comment) | ||||||
| @@ -107,7 +107,7 @@ func (s *GistsService) EditComment(ctx context.Context, gistID string, commentID | |||||||
| 
 | 
 | ||||||
| // DeleteComment deletes a gist comment. | // DeleteComment deletes a gist comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gists/comments/#delete-a-comment | // GitHub API docs: https://developer.github.com/v3/gists/comments/#delete-a-gist-comment | ||||||
| func (s *GistsService) DeleteComment(ctx context.Context, gistID string, commentID int64) (*Response, error) { | func (s *GistsService) DeleteComment(ctx context.Context, gistID string, commentID int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID) | 	u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -6,9 +6,14 @@ | |||||||
| package github | package github | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"bytes" | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/crypto/openpgp" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // SignatureVerification represents GPG signature verification. | // SignatureVerification represents GPG signature verification. | ||||||
| @@ -26,7 +31,7 @@ type Commit struct { | |||||||
| 	Committer    *CommitAuthor          `json:"committer,omitempty"` | 	Committer    *CommitAuthor          `json:"committer,omitempty"` | ||||||
| 	Message      *string                `json:"message,omitempty"` | 	Message      *string                `json:"message,omitempty"` | ||||||
| 	Tree         *Tree                  `json:"tree,omitempty"` | 	Tree         *Tree                  `json:"tree,omitempty"` | ||||||
| 	Parents      []Commit               `json:"parents,omitempty"` | 	Parents      []*Commit              `json:"parents,omitempty"` | ||||||
| 	Stats        *CommitStats           `json:"stats,omitempty"` | 	Stats        *CommitStats           `json:"stats,omitempty"` | ||||||
| 	HTMLURL      *string                `json:"html_url,omitempty"` | 	HTMLURL      *string                `json:"html_url,omitempty"` | ||||||
| 	URL          *string                `json:"url,omitempty"` | 	URL          *string                `json:"url,omitempty"` | ||||||
| @@ -37,6 +42,11 @@ type Commit struct { | |||||||
| 	// is only populated for requests that fetch GitHub data like | 	// is only populated for requests that fetch GitHub data like | ||||||
| 	// Pulls.ListCommits, Repositories.ListCommits, etc. | 	// Pulls.ListCommits, Repositories.ListCommits, etc. | ||||||
| 	CommentCount *int `json:"comment_count,omitempty"` | 	CommentCount *int `json:"comment_count,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// SigningKey denotes a key to sign the commit with. If not nil this key will | ||||||
|  | 	// be used to sign the commit. The private key must be present and already | ||||||
|  | 	// decrypted. Ignored if Verification.Signature is defined. | ||||||
|  | 	SigningKey *openpgp.Entity `json:"-"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c Commit) String() string { | func (c Commit) String() string { | ||||||
| @@ -116,6 +126,13 @@ func (s *GitService) CreateCommit(ctx context.Context, owner string, repo string | |||||||
| 	if commit.Tree != nil { | 	if commit.Tree != nil { | ||||||
| 		body.Tree = commit.Tree.SHA | 		body.Tree = commit.Tree.SHA | ||||||
| 	} | 	} | ||||||
|  | 	if commit.SigningKey != nil { | ||||||
|  | 		signature, err := createSignature(commit.SigningKey, body) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, nil, err | ||||||
|  | 		} | ||||||
|  | 		body.Signature = &signature | ||||||
|  | 	} | ||||||
| 	if commit.Verification != nil { | 	if commit.Verification != nil { | ||||||
| 		body.Signature = commit.Verification.Signature | 		body.Signature = commit.Verification.Signature | ||||||
| 	} | 	} | ||||||
| @@ -133,3 +150,51 @@ func (s *GitService) CreateCommit(ctx context.Context, owner string, repo string | |||||||
| 
 | 
 | ||||||
| 	return c, resp, nil | 	return c, resp, nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func createSignature(signingKey *openpgp.Entity, commit *createCommit) (string, error) { | ||||||
|  | 	if signingKey == nil || commit == nil { | ||||||
|  | 		return "", errors.New("createSignature: invalid parameters") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	message, err := createSignatureMessage(commit) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	writer := new(bytes.Buffer) | ||||||
|  | 	reader := bytes.NewReader([]byte(message)) | ||||||
|  | 	if err := openpgp.ArmoredDetachSign(writer, signingKey, reader, nil); err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return writer.String(), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func createSignatureMessage(commit *createCommit) (string, error) { | ||||||
|  | 	if commit == nil || commit.Message == nil || *commit.Message == "" || commit.Author == nil { | ||||||
|  | 		return "", errors.New("createSignatureMessage: invalid parameters") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var message []string | ||||||
|  | 
 | ||||||
|  | 	if commit.Tree != nil { | ||||||
|  | 		message = append(message, fmt.Sprintf("tree %s", *commit.Tree)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, parent := range commit.Parents { | ||||||
|  | 		message = append(message, fmt.Sprintf("parent %s", parent)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	message = append(message, fmt.Sprintf("author %s <%s> %d %s", commit.Author.GetName(), commit.Author.GetEmail(), commit.Author.GetDate().Unix(), commit.Author.GetDate().Format("-0700"))) | ||||||
|  | 
 | ||||||
|  | 	committer := commit.Committer | ||||||
|  | 	if committer == nil { | ||||||
|  | 		committer = commit.Author | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// There needs to be a double newline after committer | ||||||
|  | 	message = append(message, fmt.Sprintf("committer %s <%s> %d %s\n", committer.GetName(), committer.GetEmail(), committer.GetDate().Unix(), committer.GetDate().Format("-0700"))) | ||||||
|  | 	message = append(message, *commit.Message) | ||||||
|  | 
 | ||||||
|  | 	return strings.Join(message, "\n"), nil | ||||||
|  | } | ||||||
| @@ -7,8 +7,6 @@ package github | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"encoding/json" |  | ||||||
| 	"errors" |  | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"strings" | 	"strings" | ||||||
| @@ -49,16 +47,12 @@ type updateRefRequest struct { | |||||||
| 	Force *bool   `json:"force"` | 	Force *bool   `json:"force"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetRef fetches a single Reference object for a given Git ref. | // GetRef fetches a single reference in a repository. | ||||||
| // If there is no exact match, GetRef will return an error. |  | ||||||
| // |  | ||||||
| // Note: The GitHub API can return multiple matches. |  | ||||||
| // If you wish to use this functionality please use the GetRefs() method. |  | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/git/refs/#get-a-reference | // GitHub API docs: https://developer.github.com/v3/git/refs/#get-a-reference | ||||||
| func (s *GitService) GetRef(ctx context.Context, owner string, repo string, ref string) (*Reference, *Response, error) { | func (s *GitService) GetRef(ctx context.Context, owner string, repo string, ref string) (*Reference, *Response, error) { | ||||||
| 	ref = strings.TrimPrefix(ref, "refs/") | 	ref = strings.TrimPrefix(ref, "refs/") | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, url.QueryEscape(ref)) | 	u := fmt.Sprintf("repos/%v/%v/git/ref/%v", owner, repo, refURLEscape(ref)) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| @@ -66,80 +60,42 @@ func (s *GitService) GetRef(ctx context.Context, owner string, repo string, ref | |||||||
| 
 | 
 | ||||||
| 	r := new(Reference) | 	r := new(Reference) | ||||||
| 	resp, err := s.client.Do(ctx, req, r) | 	resp, err := s.client.Do(ctx, req, r) | ||||||
| 	if _, ok := err.(*json.UnmarshalTypeError); ok { | 	if err != nil { | ||||||
| 		// Multiple refs, means there wasn't an exact match. |  | ||||||
| 		return nil, resp, errors.New("no exact match found for this ref") |  | ||||||
| 	} else if err != nil { |  | ||||||
| 		return nil, resp, err | 		return nil, resp, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return r, resp, nil | 	return r, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetRefs fetches a slice of Reference objects for a given Git ref. | // refURLEscape escapes every path segment of the given ref. Those must | ||||||
| // If there is an exact match, only that ref is returned. | // not contain escaped "/" - as "%2F" - or github will not recognize it. | ||||||
| // If there is no exact match, GitHub returns all refs that start with ref. | func refURLEscape(ref string) string { | ||||||
| // If returned error is nil, there will be at least 1 ref returned. | 	parts := strings.Split(ref, "/") | ||||||
| // For example: | 	for i, s := range parts { | ||||||
| // | 		parts[i] = url.PathEscape(s) | ||||||
| // 	"heads/featureA" -> ["refs/heads/featureA"]                         // Exact match, single ref is returned. |  | ||||||
| // 	"heads/feature"  -> ["refs/heads/featureA", "refs/heads/featureB"]  // All refs that start with ref. |  | ||||||
| // 	"heads/notexist" -> []                                              // Returns an error. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/git/refs/#get-a-reference |  | ||||||
| func (s *GitService) GetRefs(ctx context.Context, owner string, repo string, ref string) ([]*Reference, *Response, error) { |  | ||||||
| 	ref = strings.TrimPrefix(ref, "refs/") |  | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, url.QueryEscape(ref)) |  | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} | 	} | ||||||
| 
 | 	return strings.Join(parts, "/") | ||||||
| 	var rawJSON json.RawMessage |  | ||||||
| 	resp, err := s.client.Do(ctx, req, &rawJSON) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Prioritize the most common case: a single returned ref. |  | ||||||
| 	r := new(Reference) |  | ||||||
| 	singleUnmarshalError := json.Unmarshal(rawJSON, r) |  | ||||||
| 	if singleUnmarshalError == nil { |  | ||||||
| 		return []*Reference{r}, resp, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Attempt to unmarshal multiple refs. |  | ||||||
| 	var rs []*Reference |  | ||||||
| 	multipleUnmarshalError := json.Unmarshal(rawJSON, &rs) |  | ||||||
| 	if multipleUnmarshalError == nil { |  | ||||||
| 		if len(rs) == 0 { |  | ||||||
| 			return nil, resp, fmt.Errorf("unexpected response from GitHub API: an array of refs with length 0") |  | ||||||
| 		} |  | ||||||
| 		return rs, resp, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil, resp, fmt.Errorf("unmarshalling failed for both single and multiple refs: %s and %s", singleUnmarshalError, multipleUnmarshalError) |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ReferenceListOptions specifies optional parameters to the | // ReferenceListOptions specifies optional parameters to the | ||||||
| // GitService.ListRefs method. | // GitService.ListMatchingRefs method. | ||||||
| type ReferenceListOptions struct { | type ReferenceListOptions struct { | ||||||
| 	Type string `url:"-"` | 	Ref string `url:"-"` | ||||||
| 
 | 
 | ||||||
| 	ListOptions | 	ListOptions | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ListRefs lists all refs in a repository. | // ListMatchingRefs lists references in a repository that match a supplied ref. | ||||||
|  | // Use an empty ref to list all references. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/git/refs/#get-all-references | // GitHub API docs: https://developer.github.com/v3/git/refs/#list-matching-references | ||||||
| func (s *GitService) ListRefs(ctx context.Context, owner, repo string, opt *ReferenceListOptions) ([]*Reference, *Response, error) { | func (s *GitService) ListMatchingRefs(ctx context.Context, owner, repo string, opts *ReferenceListOptions) ([]*Reference, *Response, error) { | ||||||
| 	var u string | 	var ref string | ||||||
| 	if opt != nil && opt.Type != "" { | 	if opts != nil { | ||||||
| 		u = fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, opt.Type) | 		ref = strings.TrimPrefix(opts.Ref, "refs/") | ||||||
| 	} else { |  | ||||||
| 		u = fmt.Sprintf("repos/%v/%v/git/refs", owner, repo) |  | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u := fmt.Sprintf("repos/%v/%v/git/matching-refs/%v", owner, repo, refURLEscape(ref)) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -209,7 +165,7 @@ func (s *GitService) UpdateRef(ctx context.Context, owner string, repo string, r | |||||||
| // GitHub API docs: https://developer.github.com/v3/git/refs/#delete-a-reference | // GitHub API docs: https://developer.github.com/v3/git/refs/#delete-a-reference | ||||||
| func (s *GitService) DeleteRef(ctx context.Context, owner string, repo string, ref string) (*Response, error) { | func (s *GitService) DeleteRef(ctx context.Context, owner string, repo string, ref string) (*Response, error) { | ||||||
| 	ref = strings.TrimPrefix(ref, "refs/") | 	ref = strings.TrimPrefix(ref, "refs/") | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, url.QueryEscape(ref)) | 	u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, refURLEscape(ref)) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @@ -7,13 +7,14 @@ package github | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Tree represents a GitHub tree. | // Tree represents a GitHub tree. | ||||||
| type Tree struct { | type Tree struct { | ||||||
| 	SHA     *string     `json:"sha,omitempty"` | 	SHA     *string      `json:"sha,omitempty"` | ||||||
| 	Entries []TreeEntry `json:"tree,omitempty"` | 	Entries []*TreeEntry `json:"tree,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// Truncated is true if the number of items in the tree | 	// Truncated is true if the number of items in the tree | ||||||
| 	// exceeded GitHub's maximum limit and the Entries were truncated | 	// exceeded GitHub's maximum limit and the Entries were truncated | ||||||
| @@ -43,6 +44,53 @@ func (t TreeEntry) String() string { | |||||||
| 	return Stringify(t) | 	return Stringify(t) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // treeEntryWithFileDelete is used internally to delete a file whose | ||||||
|  | // Content and SHA fields are empty. It does this by removing the "omitempty" | ||||||
|  | // tag modifier on the SHA field which causes the GitHub API to receive | ||||||
|  | // {"sha":null} and thereby delete the file. | ||||||
|  | type treeEntryWithFileDelete struct { | ||||||
|  | 	SHA     *string `json:"sha"` | ||||||
|  | 	Path    *string `json:"path,omitempty"` | ||||||
|  | 	Mode    *string `json:"mode,omitempty"` | ||||||
|  | 	Type    *string `json:"type,omitempty"` | ||||||
|  | 	Size    *int    `json:"size,omitempty"` | ||||||
|  | 	Content *string `json:"content,omitempty"` | ||||||
|  | 	URL     *string `json:"url,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (t *TreeEntry) MarshalJSON() ([]byte, error) { | ||||||
|  | 	if t.SHA == nil && t.Content == nil { | ||||||
|  | 		return json.Marshal(struct { | ||||||
|  | 			SHA  *string `json:"sha"` | ||||||
|  | 			Path *string `json:"path,omitempty"` | ||||||
|  | 			Mode *string `json:"mode,omitempty"` | ||||||
|  | 			Type *string `json:"type,omitempty"` | ||||||
|  | 		}{ | ||||||
|  | 			nil, | ||||||
|  | 			t.Path, | ||||||
|  | 			t.Mode, | ||||||
|  | 			t.Type, | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 	return json.Marshal(struct { | ||||||
|  | 		SHA     *string `json:"sha,omitempty"` | ||||||
|  | 		Path    *string `json:"path,omitempty"` | ||||||
|  | 		Mode    *string `json:"mode,omitempty"` | ||||||
|  | 		Type    *string `json:"type,omitempty"` | ||||||
|  | 		Size    *int    `json:"size,omitempty"` | ||||||
|  | 		Content *string `json:"content,omitempty"` | ||||||
|  | 		URL     *string `json:"url,omitempty"` | ||||||
|  | 	}{ | ||||||
|  | 		SHA:     t.SHA, | ||||||
|  | 		Path:    t.Path, | ||||||
|  | 		Mode:    t.Mode, | ||||||
|  | 		Type:    t.Type, | ||||||
|  | 		Size:    t.Size, | ||||||
|  | 		Content: t.Content, | ||||||
|  | 		URL:     t.URL, | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // GetTree fetches the Tree object for a given sha hash from a repository. | // GetTree fetches the Tree object for a given sha hash from a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/git/trees/#get-a-tree | // GitHub API docs: https://developer.github.com/v3/git/trees/#get-a-tree | ||||||
| @@ -68,8 +116,8 @@ func (s *GitService) GetTree(ctx context.Context, owner string, repo string, sha | |||||||
| 
 | 
 | ||||||
| // createTree represents the body of a CreateTree request. | // createTree represents the body of a CreateTree request. | ||||||
| type createTree struct { | type createTree struct { | ||||||
| 	BaseTree string      `json:"base_tree,omitempty"` | 	BaseTree string        `json:"base_tree,omitempty"` | ||||||
| 	Entries  []TreeEntry `json:"tree"` | 	Entries  []interface{} `json:"tree"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // CreateTree creates a new tree in a repository. If both a tree and a nested | // CreateTree creates a new tree in a repository. If both a tree and a nested | ||||||
| @@ -77,12 +125,27 @@ type createTree struct { | |||||||
| // that tree with the new path contents and write a new tree out. | // that tree with the new path contents and write a new tree out. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/git/trees/#create-a-tree | // GitHub API docs: https://developer.github.com/v3/git/trees/#create-a-tree | ||||||
| func (s *GitService) CreateTree(ctx context.Context, owner string, repo string, baseTree string, entries []TreeEntry) (*Tree, *Response, error) { | func (s *GitService) CreateTree(ctx context.Context, owner string, repo string, baseTree string, entries []*TreeEntry) (*Tree, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/git/trees", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/git/trees", owner, repo) | ||||||
| 
 | 
 | ||||||
|  | 	newEntries := make([]interface{}, 0, len(entries)) | ||||||
|  | 	for _, entry := range entries { | ||||||
|  | 		if entry.Content == nil && entry.SHA == nil { | ||||||
|  | 			newEntries = append(newEntries, treeEntryWithFileDelete{ | ||||||
|  | 				Path: entry.Path, | ||||||
|  | 				Mode: entry.Mode, | ||||||
|  | 				Type: entry.Type, | ||||||
|  | 				Size: entry.Size, | ||||||
|  | 				URL:  entry.URL, | ||||||
|  | 			}) | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		newEntries = append(newEntries, entry) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	body := &createTree{ | 	body := &createTree{ | ||||||
| 		BaseTree: baseTree, | 		BaseTree: baseTree, | ||||||
| 		Entries:  entries, | 		Entries:  newEntries, | ||||||
| 	} | 	} | ||||||
| 	req, err := s.client.NewRequest("POST", u, body) | 	req, err := s.client.NewRequest("POST", u, body) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -4,6 +4,7 @@ | |||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
| //go:generate go run gen-accessors.go | //go:generate go run gen-accessors.go | ||||||
|  | //go:generate go run gen-stringify-test.go | ||||||
| 
 | 
 | ||||||
| package github | package github | ||||||
| 
 | 
 | ||||||
| @@ -57,18 +58,12 @@ const ( | |||||||
| 	// https://developer.github.com/changes/2018-10-16-deployments-environments-states-and-auto-inactive-updates/ | 	// https://developer.github.com/changes/2018-10-16-deployments-environments-states-and-auto-inactive-updates/ | ||||||
| 	mediaTypeExpandDeploymentStatusPreview = "application/vnd.github.flash-preview+json" | 	mediaTypeExpandDeploymentStatusPreview = "application/vnd.github.flash-preview+json" | ||||||
| 
 | 
 | ||||||
| 	// https://developer.github.com/changes/2016-02-19-source-import-preview-api/ |  | ||||||
| 	mediaTypeImportPreview = "application/vnd.github.barred-rock-preview" |  | ||||||
| 
 |  | ||||||
| 	// https://developer.github.com/changes/2016-05-12-reactions-api-preview/ | 	// https://developer.github.com/changes/2016-05-12-reactions-api-preview/ | ||||||
| 	mediaTypeReactionsPreview = "application/vnd.github.squirrel-girl-preview" | 	mediaTypeReactionsPreview = "application/vnd.github.squirrel-girl-preview" | ||||||
| 
 | 
 | ||||||
| 	// https://developer.github.com/changes/2016-05-23-timeline-preview-api/ | 	// https://developer.github.com/changes/2016-05-23-timeline-preview-api/ | ||||||
| 	mediaTypeTimelinePreview = "application/vnd.github.mockingbird-preview+json" | 	mediaTypeTimelinePreview = "application/vnd.github.mockingbird-preview+json" | ||||||
| 
 | 
 | ||||||
| 	// https://developer.github.com/changes/2016-07-06-github-pages-preiew-api/ |  | ||||||
| 	mediaTypePagesPreview = "application/vnd.github.mister-fantastic-preview+json" |  | ||||||
| 
 |  | ||||||
| 	// https://developer.github.com/changes/2016-09-14-projects-api/ | 	// https://developer.github.com/changes/2016-09-14-projects-api/ | ||||||
| 	mediaTypeProjectsPreview = "application/vnd.github.inertia-preview+json" | 	mediaTypeProjectsPreview = "application/vnd.github.inertia-preview+json" | ||||||
| 
 | 
 | ||||||
| @@ -90,27 +85,9 @@ const ( | |||||||
| 	// https://developer.github.com/changes/2017-07-17-update-topics-on-repositories/ | 	// https://developer.github.com/changes/2017-07-17-update-topics-on-repositories/ | ||||||
| 	mediaTypeTopicsPreview = "application/vnd.github.mercy-preview+json" | 	mediaTypeTopicsPreview = "application/vnd.github.mercy-preview+json" | ||||||
| 
 | 
 | ||||||
| 	// https://developer.github.com/changes/2017-08-30-preview-nested-teams/ |  | ||||||
| 	mediaTypeNestedTeamsPreview = "application/vnd.github.hellcat-preview+json" |  | ||||||
| 
 |  | ||||||
| 	// https://developer.github.com/changes/2017-11-09-repository-transfer-api-preview/ |  | ||||||
| 	mediaTypeRepositoryTransferPreview = "application/vnd.github.nightshade-preview+json" |  | ||||||
| 
 |  | ||||||
| 	// https://developer.github.com/changes/2018-01-25-organization-invitation-api-preview/ |  | ||||||
| 	mediaTypeOrganizationInvitationPreview = "application/vnd.github.dazzler-preview+json" |  | ||||||
| 
 |  | ||||||
| 	// https://developer.github.com/changes/2018-03-16-protected-branches-required-approving-reviews/ | 	// https://developer.github.com/changes/2018-03-16-protected-branches-required-approving-reviews/ | ||||||
| 	mediaTypeRequiredApprovingReviewsPreview = "application/vnd.github.luke-cage-preview+json" | 	mediaTypeRequiredApprovingReviewsPreview = "application/vnd.github.luke-cage-preview+json" | ||||||
| 
 | 
 | ||||||
| 	// https://developer.github.com/changes/2018-02-22-label-description-search-preview/ |  | ||||||
| 	mediaTypeLabelDescriptionSearchPreview = "application/vnd.github.symmetra-preview+json" |  | ||||||
| 
 |  | ||||||
| 	// https://developer.github.com/changes/2018-02-07-team-discussions-api/ |  | ||||||
| 	mediaTypeTeamDiscussionsPreview = "application/vnd.github.echo-preview+json" |  | ||||||
| 
 |  | ||||||
| 	// https://developer.github.com/changes/2018-03-21-hovercard-api-preview/ |  | ||||||
| 	mediaTypeHovercardPreview = "application/vnd.github.hagar-preview+json" |  | ||||||
| 
 |  | ||||||
| 	// https://developer.github.com/changes/2018-01-10-lock-reason-api-preview/ | 	// https://developer.github.com/changes/2018-01-10-lock-reason-api-preview/ | ||||||
| 	mediaTypeLockReasonPreview = "application/vnd.github.sailor-v-preview+json" | 	mediaTypeLockReasonPreview = "application/vnd.github.sailor-v-preview+json" | ||||||
| 
 | 
 | ||||||
| @@ -129,8 +106,35 @@ const ( | |||||||
| 	// https://developer.github.com/changes/2018-12-18-interactions-preview/ | 	// https://developer.github.com/changes/2018-12-18-interactions-preview/ | ||||||
| 	mediaTypeInteractionRestrictionsPreview = "application/vnd.github.sombra-preview+json" | 	mediaTypeInteractionRestrictionsPreview = "application/vnd.github.sombra-preview+json" | ||||||
| 
 | 
 | ||||||
| 	// https://developer.github.com/changes/2019-02-14-draft-pull-requests/ | 	// https://developer.github.com/changes/2019-03-14-enabling-disabling-pages/ | ||||||
| 	mediaTypeDraftPreview = "application/vnd.github.shadow-cat-preview+json" | 	mediaTypeEnablePagesAPIPreview = "application/vnd.github.switcheroo-preview+json" | ||||||
|  | 
 | ||||||
|  | 	// https://developer.github.com/changes/2019-04-24-vulnerability-alerts/ | ||||||
|  | 	mediaTypeRequiredVulnerabilityAlertsPreview = "application/vnd.github.dorian-preview+json" | ||||||
|  | 
 | ||||||
|  | 	// https://developer.github.com/changes/2019-06-04-automated-security-fixes/ | ||||||
|  | 	mediaTypeRequiredAutomatedSecurityFixesPreview = "application/vnd.github.london-preview+json" | ||||||
|  | 
 | ||||||
|  | 	// https://developer.github.com/changes/2019-05-29-update-branch-api/ | ||||||
|  | 	mediaTypeUpdatePullRequestBranchPreview = "application/vnd.github.lydian-preview+json" | ||||||
|  | 
 | ||||||
|  | 	// https://developer.github.com/changes/2019-04-11-pulls-branches-for-commit/ | ||||||
|  | 	mediaTypeListPullsOrBranchesForCommitPreview = "application/vnd.github.groot-preview+json" | ||||||
|  | 
 | ||||||
|  | 	// https://developer.github.com/v3/previews/#repository-creation-permissions | ||||||
|  | 	mediaTypeMemberAllowedRepoCreationTypePreview = "application/vnd.github.surtur-preview+json" | ||||||
|  | 
 | ||||||
|  | 	// https://developer.github.com/v3/previews/#create-and-use-repository-templates | ||||||
|  | 	mediaTypeRepositoryTemplatePreview = "application/vnd.github.baptiste-preview+json" | ||||||
|  | 
 | ||||||
|  | 	// https://developer.github.com/changes/2019-10-03-multi-line-comments/ | ||||||
|  | 	mediaTypeMultiLineCommentsPreview = "application/vnd.github.comfort-fade-preview+json" | ||||||
|  | 
 | ||||||
|  | 	// https://developer.github.com/changes/2019-11-05-deprecated-passwords-and-authorizations-api/ | ||||||
|  | 	mediaTypeOAuthAppPreview = "application/vnd.github.doctor-strange-preview+json" | ||||||
|  | 
 | ||||||
|  | 	// https://developer.github.com/changes/2019-12-03-internal-visibility-changes/ | ||||||
|  | 	mediaTypeRepositoryVisibilityPreview = "application/vnd.github.nebula-preview+json" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // A Client manages communication with the GitHub API. | // A Client manages communication with the GitHub API. | ||||||
| @@ -155,11 +159,13 @@ type Client struct { | |||||||
| 	common service // Reuse a single struct instead of allocating one for each service on the heap. | 	common service // Reuse a single struct instead of allocating one for each service on the heap. | ||||||
| 
 | 
 | ||||||
| 	// Services used for talking to different parts of the GitHub API. | 	// Services used for talking to different parts of the GitHub API. | ||||||
|  | 	Actions        *ActionsService | ||||||
| 	Activity       *ActivityService | 	Activity       *ActivityService | ||||||
| 	Admin          *AdminService | 	Admin          *AdminService | ||||||
| 	Apps           *AppsService | 	Apps           *AppsService | ||||||
| 	Authorizations *AuthorizationsService | 	Authorizations *AuthorizationsService | ||||||
| 	Checks         *ChecksService | 	Checks         *ChecksService | ||||||
|  | 	CodeScanning   *CodeScanningService | ||||||
| 	Gists          *GistsService | 	Gists          *GistsService | ||||||
| 	Git            *GitService | 	Git            *GitService | ||||||
| 	Gitignores     *GitignoresService | 	Gitignores     *GitignoresService | ||||||
| @@ -183,7 +189,7 @@ type service struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ListOptions specifies the optional parameters to various List methods that | // ListOptions specifies the optional parameters to various List methods that | ||||||
| // support pagination. | // support offset pagination. | ||||||
| type ListOptions struct { | type ListOptions struct { | ||||||
| 	// For paginated result sets, page of results to retrieve. | 	// For paginated result sets, page of results to retrieve. | ||||||
| 	Page int `url:"page,omitempty"` | 	Page int `url:"page,omitempty"` | ||||||
| @@ -192,6 +198,16 @@ type ListOptions struct { | |||||||
| 	PerPage int `url:"per_page,omitempty"` | 	PerPage int `url:"per_page,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // ListCursorOptions specifies the optional parameters to various List methods that | ||||||
|  | // support cursor pagination. | ||||||
|  | type ListCursorOptions struct { | ||||||
|  | 	// For paginated result sets, page of results to retrieve. | ||||||
|  | 	Page string `url:"page,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// For paginated result sets, the number of results to include per page. | ||||||
|  | 	PerPage int `url:"per_page,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // UploadOptions specifies the parameters to methods that support uploads. | // UploadOptions specifies the parameters to methods that support uploads. | ||||||
| type UploadOptions struct { | type UploadOptions struct { | ||||||
| 	Name      string `url:"name,omitempty"` | 	Name      string `url:"name,omitempty"` | ||||||
| @@ -215,10 +231,10 @@ type RawOptions struct { | |||||||
| 	Type RawType | 	Type RawType | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // addOptions adds the parameters in opt as URL query parameters to s. opt | // addOptions adds the parameters in opts as URL query parameters to s. opts | ||||||
| // must be a struct whose fields may contain "url" tags. | // must be a struct whose fields may contain "url" tags. | ||||||
| func addOptions(s string, opt interface{}) (string, error) { | func addOptions(s string, opts interface{}) (string, error) { | ||||||
| 	v := reflect.ValueOf(opt) | 	v := reflect.ValueOf(opts) | ||||||
| 	if v.Kind() == reflect.Ptr && v.IsNil() { | 	if v.Kind() == reflect.Ptr && v.IsNil() { | ||||||
| 		return s, nil | 		return s, nil | ||||||
| 	} | 	} | ||||||
| @@ -228,7 +244,7 @@ func addOptions(s string, opt interface{}) (string, error) { | |||||||
| 		return s, err | 		return s, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	qs, err := query.Values(opt) | 	qs, err := query.Values(opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return s, err | 		return s, err | ||||||
| 	} | 	} | ||||||
| @@ -238,23 +254,25 @@ func addOptions(s string, opt interface{}) (string, error) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewClient returns a new GitHub API client. If a nil httpClient is | // NewClient returns a new GitHub API client. If a nil httpClient is | ||||||
| // provided, http.DefaultClient will be used. To use API methods which require | // provided, a new http.Client will be used. To use API methods which require | ||||||
| // authentication, provide an http.Client that will perform the authentication | // authentication, provide an http.Client that will perform the authentication | ||||||
| // for you (such as that provided by the golang.org/x/oauth2 library). | // for you (such as that provided by the golang.org/x/oauth2 library). | ||||||
| func NewClient(httpClient *http.Client) *Client { | func NewClient(httpClient *http.Client) *Client { | ||||||
| 	if httpClient == nil { | 	if httpClient == nil { | ||||||
| 		httpClient = http.DefaultClient | 		httpClient = &http.Client{} | ||||||
| 	} | 	} | ||||||
| 	baseURL, _ := url.Parse(defaultBaseURL) | 	baseURL, _ := url.Parse(defaultBaseURL) | ||||||
| 	uploadURL, _ := url.Parse(uploadBaseURL) | 	uploadURL, _ := url.Parse(uploadBaseURL) | ||||||
| 
 | 
 | ||||||
| 	c := &Client{client: httpClient, BaseURL: baseURL, UserAgent: userAgent, UploadURL: uploadURL} | 	c := &Client{client: httpClient, BaseURL: baseURL, UserAgent: userAgent, UploadURL: uploadURL} | ||||||
| 	c.common.client = c | 	c.common.client = c | ||||||
|  | 	c.Actions = (*ActionsService)(&c.common) | ||||||
| 	c.Activity = (*ActivityService)(&c.common) | 	c.Activity = (*ActivityService)(&c.common) | ||||||
| 	c.Admin = (*AdminService)(&c.common) | 	c.Admin = (*AdminService)(&c.common) | ||||||
| 	c.Apps = (*AppsService)(&c.common) | 	c.Apps = (*AppsService)(&c.common) | ||||||
| 	c.Authorizations = (*AuthorizationsService)(&c.common) | 	c.Authorizations = (*AuthorizationsService)(&c.common) | ||||||
| 	c.Checks = (*ChecksService)(&c.common) | 	c.Checks = (*ChecksService)(&c.common) | ||||||
|  | 	c.CodeScanning = (*CodeScanningService)(&c.common) | ||||||
| 	c.Gists = (*GistsService)(&c.common) | 	c.Gists = (*GistsService)(&c.common) | ||||||
| 	c.Git = (*GitService)(&c.common) | 	c.Git = (*GitService)(&c.common) | ||||||
| 	c.Gitignores = (*GitignoresService)(&c.common) | 	c.Gitignores = (*GitignoresService)(&c.common) | ||||||
| @@ -275,13 +293,18 @@ func NewClient(httpClient *http.Client) *Client { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewEnterpriseClient returns a new GitHub API client with provided | // NewEnterpriseClient returns a new GitHub API client with provided | ||||||
| // base URL and upload URL (often the same URL). | // base URL and upload URL (often is your GitHub Enterprise hostname). | ||||||
| // If either URL does not have a trailing slash, one is added automatically. | // If the base URL does not have the suffix "/api/v3/", it will be added automatically. | ||||||
| // If a nil httpClient is provided, http.DefaultClient will be used. | // If the upload URL does not have the suffix "/api/uploads", it will be added automatically. | ||||||
|  | // If a nil httpClient is provided, a new http.Client will be used. | ||||||
| // | // | ||||||
| // Note that NewEnterpriseClient is a convenience helper only; | // Note that NewEnterpriseClient is a convenience helper only; | ||||||
| // its behavior is equivalent to using NewClient, followed by setting | // its behavior is equivalent to using NewClient, followed by setting | ||||||
| // the BaseURL and UploadURL fields. | // the BaseURL and UploadURL fields. | ||||||
|  | // | ||||||
|  | // Another important thing is that by default, the GitHub Enterprise URL format | ||||||
|  | // should be http(s)://[hostname]/api/v3/ or you will always receive the 406 status code. | ||||||
|  | // The upload URL format should be http(s)://[hostname]/api/uploads/. | ||||||
| func NewEnterpriseClient(baseURL, uploadURL string, httpClient *http.Client) (*Client, error) { | func NewEnterpriseClient(baseURL, uploadURL string, httpClient *http.Client) (*Client, error) { | ||||||
| 	baseEndpoint, err := url.Parse(baseURL) | 	baseEndpoint, err := url.Parse(baseURL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -290,6 +313,9 @@ func NewEnterpriseClient(baseURL, uploadURL string, httpClient *http.Client) (*C | |||||||
| 	if !strings.HasSuffix(baseEndpoint.Path, "/") { | 	if !strings.HasSuffix(baseEndpoint.Path, "/") { | ||||||
| 		baseEndpoint.Path += "/" | 		baseEndpoint.Path += "/" | ||||||
| 	} | 	} | ||||||
|  | 	if !strings.HasSuffix(baseEndpoint.Path, "/api/v3/") { | ||||||
|  | 		baseEndpoint.Path += "api/v3/" | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	uploadEndpoint, err := url.Parse(uploadURL) | 	uploadEndpoint, err := url.Parse(uploadURL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -298,6 +324,9 @@ func NewEnterpriseClient(baseURL, uploadURL string, httpClient *http.Client) (*C | |||||||
| 	if !strings.HasSuffix(uploadEndpoint.Path, "/") { | 	if !strings.HasSuffix(uploadEndpoint.Path, "/") { | ||||||
| 		uploadEndpoint.Path += "/" | 		uploadEndpoint.Path += "/" | ||||||
| 	} | 	} | ||||||
|  | 	if !strings.HasSuffix(uploadEndpoint.Path, "/api/uploads/") { | ||||||
|  | 		uploadEndpoint.Path += "api/uploads/" | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	c := NewClient(httpClient) | 	c := NewClient(httpClient) | ||||||
| 	c.BaseURL = baseEndpoint | 	c.BaseURL = baseEndpoint | ||||||
| @@ -321,7 +350,7 @@ func (c *Client) NewRequest(method, urlStr string, body interface{}) (*http.Requ | |||||||
| 
 | 
 | ||||||
| 	var buf io.ReadWriter | 	var buf io.ReadWriter | ||||||
| 	if body != nil { | 	if body != nil { | ||||||
| 		buf = new(bytes.Buffer) | 		buf = &bytes.Buffer{} | ||||||
| 		enc := json.NewEncoder(buf) | 		enc := json.NewEncoder(buf) | ||||||
| 		enc.SetEscapeHTML(false) | 		enc.SetEscapeHTML(false) | ||||||
| 		err := enc.Encode(body) | 		err := enc.Encode(body) | ||||||
| @@ -382,12 +411,27 @@ type Response struct { | |||||||
| 	// results. Any or all of these may be set to the zero value for | 	// results. Any or all of these may be set to the zero value for | ||||||
| 	// responses that are not part of a paginated set, or for which there | 	// responses that are not part of a paginated set, or for which there | ||||||
| 	// are no additional pages. | 	// are no additional pages. | ||||||
| 
 | 	// | ||||||
|  | 	// These fields support what is called "offset pagination" and should | ||||||
|  | 	// be used with the ListOptions struct. | ||||||
| 	NextPage  int | 	NextPage  int | ||||||
| 	PrevPage  int | 	PrevPage  int | ||||||
| 	FirstPage int | 	FirstPage int | ||||||
| 	LastPage  int | 	LastPage  int | ||||||
| 
 | 
 | ||||||
|  | 	// Additionally, some APIs support "cursor pagination" instead of offset. | ||||||
|  | 	// This means that a token points directly to the next record which | ||||||
|  | 	// can lead to O(1) performance compared to O(n) performance provided | ||||||
|  | 	// by offset pagination. | ||||||
|  | 	// | ||||||
|  | 	// For APIs that support cursor pagination (such as | ||||||
|  | 	// TeamsService.ListIDPGroupsInOrganization), the following field | ||||||
|  | 	// will be populated to point to the next page. | ||||||
|  | 	// | ||||||
|  | 	// To use this token, set ListCursorOptions.Page to this value before | ||||||
|  | 	// calling the endpoint again. | ||||||
|  | 	NextPageToken string | ||||||
|  | 
 | ||||||
| 	// Explicitly specify the Rate type so Rate's String() receiver doesn't | 	// Explicitly specify the Rate type so Rate's String() receiver doesn't | ||||||
| 	// propagate to Response. | 	// propagate to Response. | ||||||
| 	Rate Rate | 	Rate Rate | ||||||
| @@ -432,7 +476,9 @@ func (r *Response) populatePageValues() { | |||||||
| 			for _, segment := range segments[1:] { | 			for _, segment := range segments[1:] { | ||||||
| 				switch strings.TrimSpace(segment) { | 				switch strings.TrimSpace(segment) { | ||||||
| 				case `rel="next"`: | 				case `rel="next"`: | ||||||
| 					r.NextPage, _ = strconv.Atoi(page) | 					if r.NextPage, err = strconv.Atoi(page); err != nil { | ||||||
|  | 						r.NextPageToken = page | ||||||
|  | 					} | ||||||
| 				case `rel="prev"`: | 				case `rel="prev"`: | ||||||
| 					r.PrevPage, _ = strconv.Atoi(page) | 					r.PrevPage, _ = strconv.Atoi(page) | ||||||
| 				case `rel="first"`: | 				case `rel="first"`: | ||||||
| @@ -470,9 +516,12 @@ func parseRate(r *http.Response) Rate { | |||||||
| // first decode it. If rate limit is exceeded and reset time is in the future, | // first decode it. If rate limit is exceeded and reset time is in the future, | ||||||
| // Do returns *RateLimitError immediately without making a network API call. | // Do returns *RateLimitError immediately without making a network API call. | ||||||
| // | // | ||||||
| // The provided ctx must be non-nil. If it is canceled or times out, | // The provided ctx must be non-nil, if it is nil an error is returned. If it is canceled or times out, | ||||||
| // ctx.Err() will be returned. | // ctx.Err() will be returned. | ||||||
| func (c *Client) Do(ctx context.Context, req *http.Request, v interface{}) (*Response, error) { | func (c *Client) Do(ctx context.Context, req *http.Request, v interface{}) (*Response, error) { | ||||||
|  | 	if ctx == nil { | ||||||
|  | 		return nil, errors.New("context must be non-nil") | ||||||
|  | 	} | ||||||
| 	req = withContext(ctx, req) | 	req = withContext(ctx, req) | ||||||
| 
 | 
 | ||||||
| 	rateLimitCategory := category(req.URL.Path) | 	rateLimitCategory := category(req.URL.Path) | ||||||
| @@ -614,7 +663,7 @@ type TwoFactorAuthError ErrorResponse | |||||||
| func (r *TwoFactorAuthError) Error() string { return (*ErrorResponse)(r).Error() } | func (r *TwoFactorAuthError) Error() string { return (*ErrorResponse)(r).Error() } | ||||||
| 
 | 
 | ||||||
| // RateLimitError occurs when GitHub returns 403 Forbidden response with a rate limit | // RateLimitError occurs when GitHub returns 403 Forbidden response with a rate limit | ||||||
| // remaining value of 0, and error message starts with "API rate limit exceeded for ". | // remaining value of 0. | ||||||
| type RateLimitError struct { | type RateLimitError struct { | ||||||
| 	Rate     Rate           // Rate specifies last known rate limit for the client | 	Rate     Rate           // Rate specifies last known rate limit for the client | ||||||
| 	Response *http.Response // HTTP response that caused this error | 	Response *http.Response // HTTP response that caused this error | ||||||
| @@ -624,7 +673,7 @@ type RateLimitError struct { | |||||||
| func (r *RateLimitError) Error() string { | func (r *RateLimitError) Error() string { | ||||||
| 	return fmt.Sprintf("%v %v: %d %v %v", | 	return fmt.Sprintf("%v %v: %d %v %v", | ||||||
| 		r.Response.Request.Method, sanitizeURL(r.Response.Request.URL), | 		r.Response.Request.Method, sanitizeURL(r.Response.Request.URL), | ||||||
| 		r.Response.StatusCode, r.Message, formatRateReset(r.Rate.Reset.Time.Sub(time.Now()))) | 		r.Response.StatusCode, r.Message, formatRateReset(time.Until(r.Rate.Reset.Time))) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // AcceptedError occurs when GitHub returns 202 Accepted response with an | // AcceptedError occurs when GitHub returns 202 Accepted response with an | ||||||
| @@ -690,6 +739,10 @@ These are the possible validation error codes: | |||||||
|         some resources return this (e.g. github.User.CreateKey()), additional |         some resources return this (e.g. github.User.CreateKey()), additional | ||||||
|         information is set in the Message field of the Error |         information is set in the Message field of the Error | ||||||
| 
 | 
 | ||||||
|  | GitHub error responses structure are often undocumented and inconsistent. | ||||||
|  | Sometimes error is just a simple string (Issue #540). | ||||||
|  | In such cases, Message represents an error message as a workaround. | ||||||
|  | 
 | ||||||
| GitHub API docs: https://developer.github.com/v3/#client-errors | GitHub API docs: https://developer.github.com/v3/#client-errors | ||||||
| */ | */ | ||||||
| type Error struct { | type Error struct { | ||||||
| @@ -704,12 +757,19 @@ func (e *Error) Error() string { | |||||||
| 		e.Code, e.Field, e.Resource) | 		e.Code, e.Field, e.Resource) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (e *Error) UnmarshalJSON(data []byte) error { | ||||||
|  | 	type aliasError Error // avoid infinite recursion by using type alias. | ||||||
|  | 	if err := json.Unmarshal(data, (*aliasError)(e)); err != nil { | ||||||
|  | 		return json.Unmarshal(data, &e.Message) // data can be json string. | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // CheckResponse checks the API response for errors, and returns them if | // CheckResponse checks the API response for errors, and returns them if | ||||||
| // present. A response is considered an error if it has a status code outside | // present. A response is considered an error if it has a status code outside | ||||||
| // the 200 range or equal to 202 Accepted. | // the 200 range or equal to 202 Accepted. | ||||||
| // API error responses are expected to have either no response | // API error responses are expected to have response | ||||||
| // body, or a JSON response body that maps to ErrorResponse. Any other | // body, and a JSON response body that maps to ErrorResponse. | ||||||
| // response body will be silently ignored. |  | ||||||
| // | // | ||||||
| // The error type will be *RateLimitError for rate limit exceeded errors, | // The error type will be *RateLimitError for rate limit exceeded errors, | ||||||
| // *AcceptedError for 202 Accepted status codes, | // *AcceptedError for 202 Accepted status codes, | ||||||
| @@ -726,10 +786,14 @@ func CheckResponse(r *http.Response) error { | |||||||
| 	if err == nil && data != nil { | 	if err == nil && data != nil { | ||||||
| 		json.Unmarshal(data, errorResponse) | 		json.Unmarshal(data, errorResponse) | ||||||
| 	} | 	} | ||||||
|  | 	// Re-populate error response body because GitHub error responses are often | ||||||
|  | 	// undocumented and inconsistent. | ||||||
|  | 	// Issue #1136, #540. | ||||||
|  | 	r.Body = ioutil.NopCloser(bytes.NewBuffer(data)) | ||||||
| 	switch { | 	switch { | ||||||
| 	case r.StatusCode == http.StatusUnauthorized && strings.HasPrefix(r.Header.Get(headerOTP), "required"): | 	case r.StatusCode == http.StatusUnauthorized && strings.HasPrefix(r.Header.Get(headerOTP), "required"): | ||||||
| 		return (*TwoFactorAuthError)(errorResponse) | 		return (*TwoFactorAuthError)(errorResponse) | ||||||
| 	case r.StatusCode == http.StatusForbidden && r.Header.Get(headerRateRemaining) == "0" && strings.HasPrefix(errorResponse.Message, "API rate limit exceeded for "): | 	case r.StatusCode == http.StatusForbidden && r.Header.Get(headerRateRemaining) == "0": | ||||||
| 		return &RateLimitError{ | 		return &RateLimitError{ | ||||||
| 			Rate:     parseRate(r), | 			Rate:     parseRate(r), | ||||||
| 			Response: errorResponse.Response, | 			Response: errorResponse.Response, | ||||||
| @@ -858,6 +922,24 @@ func (c *Client) RateLimits(ctx context.Context) (*RateLimits, *Response, error) | |||||||
| 	return response.Resources, resp, nil | 	return response.Resources, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func setCredentialsAsHeaders(req *http.Request, id, secret string) *http.Request { | ||||||
|  | 	// To set extra headers, we must make a copy of the Request so | ||||||
|  | 	// that we don't modify the Request we were given. This is required by the | ||||||
|  | 	// specification of http.RoundTripper. | ||||||
|  | 	// | ||||||
|  | 	// Since we are going to modify only req.Header here, we only need a deep copy | ||||||
|  | 	// of req.Header. | ||||||
|  | 	convertedRequest := new(http.Request) | ||||||
|  | 	*convertedRequest = *req | ||||||
|  | 	convertedRequest.Header = make(http.Header, len(req.Header)) | ||||||
|  | 
 | ||||||
|  | 	for k, s := range req.Header { | ||||||
|  | 		convertedRequest.Header[k] = append([]string(nil), s...) | ||||||
|  | 	} | ||||||
|  | 	convertedRequest.SetBasicAuth(id, secret) | ||||||
|  | 	return convertedRequest | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* | /* | ||||||
| UnauthenticatedRateLimitedTransport allows you to make unauthenticated calls | UnauthenticatedRateLimitedTransport allows you to make unauthenticated calls | ||||||
| that need to use a higher rate limit associated with your OAuth application. | that need to use a higher rate limit associated with your OAuth application. | ||||||
| @@ -868,8 +950,8 @@ that need to use a higher rate limit associated with your OAuth application. | |||||||
| 	} | 	} | ||||||
| 	client := github.NewClient(t.Client()) | 	client := github.NewClient(t.Client()) | ||||||
| 
 | 
 | ||||||
| This will append the querystring params client_id=xxx&client_secret=yyy to all | This will add the client id and secret as a base64-encoded string in the format | ||||||
| requests. | ClientID:ClientSecret and apply it as an "Authorization": "Basic" header. | ||||||
| 
 | 
 | ||||||
| See https://developer.github.com/v3/#unauthenticated-rate-limited-requests for | See https://developer.github.com/v3/#unauthenticated-rate-limited-requests for | ||||||
| more information. | more information. | ||||||
| @@ -898,22 +980,7 @@ func (t *UnauthenticatedRateLimitedTransport) RoundTrip(req *http.Request) (*htt | |||||||
| 		return nil, errors.New("t.ClientSecret is empty") | 		return nil, errors.New("t.ClientSecret is empty") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// To set extra querystring params, we must make a copy of the Request so | 	req2 := setCredentialsAsHeaders(req, t.ClientID, t.ClientSecret) | ||||||
| 	// that we don't modify the Request we were given. This is required by the |  | ||||||
| 	// specification of http.RoundTripper. |  | ||||||
| 	// |  | ||||||
| 	// Since we are going to modify only req.URL here, we only need a deep copy |  | ||||||
| 	// of req.URL. |  | ||||||
| 	req2 := new(http.Request) |  | ||||||
| 	*req2 = *req |  | ||||||
| 	req2.URL = new(url.URL) |  | ||||||
| 	*req2.URL = *req.URL |  | ||||||
| 
 |  | ||||||
| 	q := req2.URL.Query() |  | ||||||
| 	q.Set("client_id", t.ClientID) |  | ||||||
| 	q.Set("client_secret", t.ClientSecret) |  | ||||||
| 	req2.URL.RawQuery = q.Encode() |  | ||||||
| 
 |  | ||||||
| 	// Make the HTTP request. | 	// Make the HTTP request. | ||||||
| 	return t.transport().RoundTrip(req2) | 	return t.transport().RoundTrip(req2) | ||||||
| } | } | ||||||
| @@ -947,20 +1014,7 @@ type BasicAuthTransport struct { | |||||||
| 
 | 
 | ||||||
| // RoundTrip implements the RoundTripper interface. | // RoundTrip implements the RoundTripper interface. | ||||||
| func (t *BasicAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) { | func (t *BasicAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) { | ||||||
| 	// To set extra headers, we must make a copy of the Request so | 	req2 := setCredentialsAsHeaders(req, t.Username, t.Password) | ||||||
| 	// that we don't modify the Request we were given. This is required by the |  | ||||||
| 	// specification of http.RoundTripper. |  | ||||||
| 	// |  | ||||||
| 	// Since we are going to modify only req.Header here, we only need a deep copy |  | ||||||
| 	// of req.Header. |  | ||||||
| 	req2 := new(http.Request) |  | ||||||
| 	*req2 = *req |  | ||||||
| 	req2.Header = make(http.Header, len(req.Header)) |  | ||||||
| 	for k, s := range req.Header { |  | ||||||
| 		req2.Header[k] = append([]string(nil), s...) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	req2.SetBasicAuth(t.Username, t.Password) |  | ||||||
| 	if t.OTP != "" { | 	if t.OTP != "" { | ||||||
| 		req2.Header.Set(headerOTP, t.OTP) | 		req2.Header.Set(headerOTP, t.OTP) | ||||||
| 	} | 	} | ||||||
| @@ -29,7 +29,7 @@ func (g Gitignore) String() string { | |||||||
| // List all available Gitignore templates. | // List all available Gitignore templates. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gitignore/#listing-available-templates | // GitHub API docs: https://developer.github.com/v3/gitignore/#listing-available-templates | ||||||
| func (s GitignoresService) List(ctx context.Context) ([]string, *Response, error) { | func (s *GitignoresService) List(ctx context.Context) ([]string, *Response, error) { | ||||||
| 	req, err := s.client.NewRequest("GET", "gitignore/templates", nil) | 	req, err := s.client.NewRequest("GET", "gitignore/templates", nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| @@ -46,8 +46,8 @@ func (s GitignoresService) List(ctx context.Context) ([]string, *Response, error | |||||||
| 
 | 
 | ||||||
| // Get a Gitignore by name. | // Get a Gitignore by name. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/gitignore/#get-a-single-template | // GitHub API docs: https://developer.github.com/v3/gitignore/#get-a-gitignore-template | ||||||
| func (s GitignoresService) Get(ctx context.Context, name string) (*Gitignore, *Response, error) { | func (s *GitignoresService) Get(ctx context.Context, name string) (*Gitignore, *Response, error) { | ||||||
| 	u := fmt.Sprintf("gitignore/templates/%v", name) | 	u := fmt.Sprintf("gitignore/templates/%v", name) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -39,7 +39,7 @@ func (s *InteractionsService) GetRestrictionsForOrg(ctx context.Context, organiz | |||||||
| // in public repositories for the given organization. | // in public repositories for the given organization. | ||||||
| // Possible values are: "existing_users", "contributors_only", "collaborators_only". | // Possible values are: "existing_users", "contributors_only", "collaborators_only". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/interactions/orgs/#add-or-update-interaction-restrictions-for-an-organization | // GitHub API docs: https://developer.github.com/v3/interactions/orgs/#set-interaction-restrictions-for-an-organization | ||||||
| func (s *InteractionsService) UpdateRestrictionsForOrg(ctx context.Context, organization, limit string) (*InteractionRestriction, *Response, error) { | func (s *InteractionsService) UpdateRestrictionsForOrg(ctx context.Context, organization, limit string) (*InteractionRestriction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/interaction-limits", organization) | 	u := fmt.Sprintf("orgs/%v/interaction-limits", organization) | ||||||
| 
 | 
 | ||||||
| @@ -39,7 +39,7 @@ func (s *InteractionsService) GetRestrictionsForRepo(ctx context.Context, owner, | |||||||
| // for the given repository. | // for the given repository. | ||||||
| // Possible values are: "existing_users", "contributors_only", "collaborators_only". | // Possible values are: "existing_users", "contributors_only", "collaborators_only". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/interactions/repos/#add-or-update-interaction-restrictions-for-a-repository | // GitHub API docs: https://developer.github.com/v3/interactions/repos/#set-interaction-restrictions-for-a-repository | ||||||
| func (s *InteractionsService) UpdateRestrictionsForRepo(ctx context.Context, owner, repo, limit string) (*InteractionRestriction, *Response, error) { | func (s *InteractionsService) UpdateRestrictionsForRepo(ctx context.Context, owner, repo, limit string) (*InteractionRestriction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/interaction-limits", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/interaction-limits", owner, repo) | ||||||
| 
 | 
 | ||||||
| @@ -26,36 +26,37 @@ type IssuesService service | |||||||
| // this is an issue, and if PullRequestLinks is not nil, this is a pull request. | // this is an issue, and if PullRequestLinks is not nil, this is a pull request. | ||||||
| // The IsPullRequest helper method can be used to check that. | // The IsPullRequest helper method can be used to check that. | ||||||
| type Issue struct { | type Issue struct { | ||||||
| 	ID               *int64            `json:"id,omitempty"` | 	ID                *int64            `json:"id,omitempty"` | ||||||
| 	Number           *int              `json:"number,omitempty"` | 	Number            *int              `json:"number,omitempty"` | ||||||
| 	State            *string           `json:"state,omitempty"` | 	State             *string           `json:"state,omitempty"` | ||||||
| 	Locked           *bool             `json:"locked,omitempty"` | 	Locked            *bool             `json:"locked,omitempty"` | ||||||
| 	Title            *string           `json:"title,omitempty"` | 	Title             *string           `json:"title,omitempty"` | ||||||
| 	Body             *string           `json:"body,omitempty"` | 	Body              *string           `json:"body,omitempty"` | ||||||
| 	User             *User             `json:"user,omitempty"` | 	AuthorAssociation *string           `json:"author_association,omitempty"` | ||||||
| 	Labels           []Label           `json:"labels,omitempty"` | 	User              *User             `json:"user,omitempty"` | ||||||
| 	Assignee         *User             `json:"assignee,omitempty"` | 	Labels            []*Label          `json:"labels,omitempty"` | ||||||
| 	Comments         *int              `json:"comments,omitempty"` | 	Assignee          *User             `json:"assignee,omitempty"` | ||||||
| 	ClosedAt         *time.Time        `json:"closed_at,omitempty"` | 	Comments          *int              `json:"comments,omitempty"` | ||||||
| 	CreatedAt        *time.Time        `json:"created_at,omitempty"` | 	ClosedAt          *time.Time        `json:"closed_at,omitempty"` | ||||||
| 	UpdatedAt        *time.Time        `json:"updated_at,omitempty"` | 	CreatedAt         *time.Time        `json:"created_at,omitempty"` | ||||||
| 	ClosedBy         *User             `json:"closed_by,omitempty"` | 	UpdatedAt         *time.Time        `json:"updated_at,omitempty"` | ||||||
| 	URL              *string           `json:"url,omitempty"` | 	ClosedBy          *User             `json:"closed_by,omitempty"` | ||||||
| 	HTMLURL          *string           `json:"html_url,omitempty"` | 	URL               *string           `json:"url,omitempty"` | ||||||
| 	CommentsURL      *string           `json:"comments_url,omitempty"` | 	HTMLURL           *string           `json:"html_url,omitempty"` | ||||||
| 	EventsURL        *string           `json:"events_url,omitempty"` | 	CommentsURL       *string           `json:"comments_url,omitempty"` | ||||||
| 	LabelsURL        *string           `json:"labels_url,omitempty"` | 	EventsURL         *string           `json:"events_url,omitempty"` | ||||||
| 	RepositoryURL    *string           `json:"repository_url,omitempty"` | 	LabelsURL         *string           `json:"labels_url,omitempty"` | ||||||
| 	Milestone        *Milestone        `json:"milestone,omitempty"` | 	RepositoryURL     *string           `json:"repository_url,omitempty"` | ||||||
| 	PullRequestLinks *PullRequestLinks `json:"pull_request,omitempty"` | 	Milestone         *Milestone        `json:"milestone,omitempty"` | ||||||
| 	Repository       *Repository       `json:"repository,omitempty"` | 	PullRequestLinks  *PullRequestLinks `json:"pull_request,omitempty"` | ||||||
| 	Reactions        *Reactions        `json:"reactions,omitempty"` | 	Repository        *Repository       `json:"repository,omitempty"` | ||||||
| 	Assignees        []*User           `json:"assignees,omitempty"` | 	Reactions         *Reactions        `json:"reactions,omitempty"` | ||||||
| 	NodeID           *string           `json:"node_id,omitempty"` | 	Assignees         []*User           `json:"assignees,omitempty"` | ||||||
|  | 	NodeID            *string           `json:"node_id,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// TextMatches is only populated from search results that request text matches | 	// TextMatches is only populated from search results that request text matches | ||||||
| 	// See: search.go and https://developer.github.com/v3/search/#text-match-metadata | 	// See: search.go and https://developer.github.com/v3/search/#text-match-metadata | ||||||
| 	TextMatches []TextMatch `json:"text_matches,omitempty"` | 	TextMatches []*TextMatch `json:"text_matches,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// ActiveLockReason is populated only when LockReason is provided while locking the issue. | 	// ActiveLockReason is populated only when LockReason is provided while locking the issue. | ||||||
| 	// Possible values are: "off-topic", "too heated", "resolved", and "spam". | 	// Possible values are: "off-topic", "too heated", "resolved", and "spam". | ||||||
| @@ -128,28 +129,29 @@ type PullRequestLinks struct { | |||||||
| // organization repositories; if false, list only owned and member | // organization repositories; if false, list only owned and member | ||||||
| // repositories. | // repositories. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/#list-issues | // GitHub API docs: https://developer.github.com/v3/issues/#list-issues-assigned-to-the-authenticated-user | ||||||
| func (s *IssuesService) List(ctx context.Context, all bool, opt *IssueListOptions) ([]*Issue, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/issues/#list-user-account-issues-assigned-to-the-authenticated-user | ||||||
|  | func (s *IssuesService) List(ctx context.Context, all bool, opts *IssueListOptions) ([]*Issue, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if all { | 	if all { | ||||||
| 		u = "issues" | 		u = "issues" | ||||||
| 	} else { | 	} else { | ||||||
| 		u = "user/issues" | 		u = "user/issues" | ||||||
| 	} | 	} | ||||||
| 	return s.listIssues(ctx, u, opt) | 	return s.listIssues(ctx, u, opts) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ListByOrg fetches the issues in the specified organization for the | // ListByOrg fetches the issues in the specified organization for the | ||||||
| // authenticated user. | // authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/#list-issues | // GitHub API docs: https://developer.github.com/v3/issues/#list-organization-issues-assigned-to-the-authenticated-user | ||||||
| func (s *IssuesService) ListByOrg(ctx context.Context, org string, opt *IssueListOptions) ([]*Issue, *Response, error) { | func (s *IssuesService) ListByOrg(ctx context.Context, org string, opts *IssueListOptions) ([]*Issue, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/issues", org) | 	u := fmt.Sprintf("orgs/%v/issues", org) | ||||||
| 	return s.listIssues(ctx, u, opt) | 	return s.listIssues(ctx, u, opts) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *IssuesService) listIssues(ctx context.Context, u string, opt *IssueListOptions) ([]*Issue, *Response, error) { | func (s *IssuesService) listIssues(ctx context.Context, u string, opts *IssueListOptions) ([]*Issue, *Response, error) { | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -160,7 +162,7 @@ func (s *IssuesService) listIssues(ctx context.Context, u string, opt *IssueList | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept headers when APIs fully launch. | 	// TODO: remove custom Accept headers when APIs fully launch. | ||||||
| 	acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeLabelDescriptionSearchPreview, mediaTypeLockReasonPreview} | 	acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeLockReasonPreview} | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 
 | 
 | ||||||
| 	var issues []*Issue | 	var issues []*Issue | ||||||
| @@ -214,10 +216,10 @@ type IssueListByRepoOptions struct { | |||||||
| 
 | 
 | ||||||
| // ListByRepo lists the issues for the specified repository. | // ListByRepo lists the issues for the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/#list-issues-for-a-repository | // GitHub API docs: https://developer.github.com/v3/issues/#list-repository-issues | ||||||
| func (s *IssuesService) ListByRepo(ctx context.Context, owner string, repo string, opt *IssueListByRepoOptions) ([]*Issue, *Response, error) { | func (s *IssuesService) ListByRepo(ctx context.Context, owner string, repo string, opts *IssueListByRepoOptions) ([]*Issue, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/issues", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -228,7 +230,7 @@ func (s *IssuesService) ListByRepo(ctx context.Context, owner string, repo strin | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept headers when APIs fully launch. | 	// TODO: remove custom Accept headers when APIs fully launch. | ||||||
| 	acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeLabelDescriptionSearchPreview, mediaTypeIntegrationPreview} | 	acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeIntegrationPreview} | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 
 | 
 | ||||||
| 	var issues []*Issue | 	var issues []*Issue | ||||||
| @@ -242,7 +244,7 @@ func (s *IssuesService) ListByRepo(ctx context.Context, owner string, repo strin | |||||||
| 
 | 
 | ||||||
| // Get a single issue. | // Get a single issue. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/#get-a-single-issue | // GitHub API docs: https://developer.github.com/v3/issues/#get-an-issue | ||||||
| func (s *IssuesService) Get(ctx context.Context, owner string, repo string, number int) (*Issue, *Response, error) { | func (s *IssuesService) Get(ctx context.Context, owner string, repo string, number int) (*Issue, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/%d", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/issues/%d", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -251,7 +253,7 @@ func (s *IssuesService) Get(ctx context.Context, owner string, repo string, numb | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept headers when APIs fully launch. | 	// TODO: remove custom Accept headers when APIs fully launch. | ||||||
| 	acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeLabelDescriptionSearchPreview, mediaTypeLockReasonPreview} | 	acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeLockReasonPreview} | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 
 | 
 | ||||||
| 	issue := new(Issue) | 	issue := new(Issue) | ||||||
| @@ -273,9 +275,6 @@ func (s *IssuesService) Create(ctx context.Context, owner string, repo string, i | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	i := new(Issue) | 	i := new(Issue) | ||||||
| 	resp, err := s.client.Do(ctx, req, i) | 	resp, err := s.client.Do(ctx, req, i) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -287,7 +286,7 @@ func (s *IssuesService) Create(ctx context.Context, owner string, repo string, i | |||||||
| 
 | 
 | ||||||
| // Edit an issue. | // Edit an issue. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/#edit-an-issue | // GitHub API docs: https://developer.github.com/v3/issues/#update-an-issue | ||||||
| func (s *IssuesService) Edit(ctx context.Context, owner string, repo string, number int, issue *IssueRequest) (*Issue, *Response, error) { | func (s *IssuesService) Edit(ctx context.Context, owner string, repo string, number int, issue *IssueRequest) (*Issue, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/%d", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/issues/%d", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, issue) | 	req, err := s.client.NewRequest("PATCH", u, issue) | ||||||
| @@ -295,9 +294,6 @@ func (s *IssuesService) Edit(ctx context.Context, owner string, repo string, num | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	i := new(Issue) | 	i := new(Issue) | ||||||
| 	resp, err := s.client.Do(ctx, req, i) | 	resp, err := s.client.Do(ctx, req, i) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -319,14 +315,14 @@ type LockIssueOptions struct { | |||||||
| // Lock an issue's conversation. | // Lock an issue's conversation. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/#lock-an-issue | // GitHub API docs: https://developer.github.com/v3/issues/#lock-an-issue | ||||||
| func (s *IssuesService) Lock(ctx context.Context, owner string, repo string, number int, opt *LockIssueOptions) (*Response, error) { | func (s *IssuesService) Lock(ctx context.Context, owner string, repo string, number int, opts *LockIssueOptions) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/%d/lock", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/issues/%d/lock", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, opt) | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if opt != nil { | 	if opts != nil { | ||||||
| 		req.Header.Set("Accept", mediaTypeLockReasonPreview) | 		req.Header.Set("Accept", mediaTypeLockReasonPreview) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @@ -14,9 +14,9 @@ import ( | |||||||
| // which issues may be assigned. | // which issues may be assigned. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/assignees/#list-assignees | // GitHub API docs: https://developer.github.com/v3/issues/assignees/#list-assignees | ||||||
| func (s *IssuesService) ListAssignees(ctx context.Context, owner, repo string, opt *ListOptions) ([]*User, *Response, error) { | func (s *IssuesService) ListAssignees(ctx context.Context, owner, repo string, opts *ListOptions) ([]*User, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/assignees", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/assignees", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -36,7 +36,7 @@ func (s *IssuesService) ListAssignees(ctx context.Context, owner, repo string, o | |||||||
| 
 | 
 | ||||||
| // IsAssignee checks if a user is an assignee for the specified repository. | // IsAssignee checks if a user is an assignee for the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/assignees/#check-assignee | // GitHub API docs: https://developer.github.com/v3/issues/assignees/#check-if-a-user-can-be-assigned | ||||||
| func (s *IssuesService) IsAssignee(ctx context.Context, owner, repo, user string) (bool, *Response, error) { | func (s *IssuesService) IsAssignee(ctx context.Context, owner, repo, user string) (bool, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/assignees/%v", owner, repo, user) | 	u := fmt.Sprintf("repos/%v/%v/assignees/%v", owner, repo, user) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -36,13 +36,13 @@ func (i IssueComment) String() string { | |||||||
| // IssuesService.ListComments method. | // IssuesService.ListComments method. | ||||||
| type IssueListCommentsOptions struct { | type IssueListCommentsOptions struct { | ||||||
| 	// Sort specifies how to sort comments. Possible values are: created, updated. | 	// Sort specifies how to sort comments. Possible values are: created, updated. | ||||||
| 	Sort string `url:"sort,omitempty"` | 	Sort *string `url:"sort,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// Direction in which to sort comments. Possible values are: asc, desc. | 	// Direction in which to sort comments. Possible values are: asc, desc. | ||||||
| 	Direction string `url:"direction,omitempty"` | 	Direction *string `url:"direction,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// Since filters comments by time. | 	// Since filters comments by time. | ||||||
| 	Since time.Time `url:"since,omitempty"` | 	Since *time.Time `url:"since,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	ListOptions | 	ListOptions | ||||||
| } | } | ||||||
| @@ -50,15 +50,16 @@ type IssueListCommentsOptions struct { | |||||||
| // ListComments lists all comments on the specified issue. Specifying an issue | // ListComments lists all comments on the specified issue. Specifying an issue | ||||||
| // number of 0 will return all comments on all issues for the repository. | // number of 0 will return all comments on all issues for the repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/comments/#list-comments-on-an-issue | // GitHub API docs: https://developer.github.com/v3/issues/comments/#list-issue-comments | ||||||
| func (s *IssuesService) ListComments(ctx context.Context, owner string, repo string, number int, opt *IssueListCommentsOptions) ([]*IssueComment, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/issues/comments/#list-issue-comments-for-a-repository | ||||||
|  | func (s *IssuesService) ListComments(ctx context.Context, owner string, repo string, number int, opts *IssueListCommentsOptions) ([]*IssueComment, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if number == 0 { | 	if number == 0 { | ||||||
| 		u = fmt.Sprintf("repos/%v/%v/issues/comments", owner, repo) | 		u = fmt.Sprintf("repos/%v/%v/issues/comments", owner, repo) | ||||||
| 	} else { | 	} else { | ||||||
| 		u = fmt.Sprintf("repos/%v/%v/issues/%d/comments", owner, repo, number) | 		u = fmt.Sprintf("repos/%v/%v/issues/%d/comments", owner, repo, number) | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -82,7 +83,7 @@ func (s *IssuesService) ListComments(ctx context.Context, owner string, repo str | |||||||
| 
 | 
 | ||||||
| // GetComment fetches the specified issue comment. | // GetComment fetches the specified issue comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/comments/#get-a-single-comment | // GitHub API docs: https://developer.github.com/v3/issues/comments/#get-an-issue-comment | ||||||
| func (s *IssuesService) GetComment(ctx context.Context, owner string, repo string, commentID int64) (*IssueComment, *Response, error) { | func (s *IssuesService) GetComment(ctx context.Context, owner string, repo string, commentID int64) (*IssueComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, commentID) | 	u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, commentID) | ||||||
| 
 | 
 | ||||||
| @@ -105,7 +106,7 @@ func (s *IssuesService) GetComment(ctx context.Context, owner string, repo strin | |||||||
| 
 | 
 | ||||||
| // CreateComment creates a new comment on the specified issue. | // CreateComment creates a new comment on the specified issue. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/comments/#create-a-comment | // GitHub API docs: https://developer.github.com/v3/issues/comments/#create-an-issue-comment | ||||||
| func (s *IssuesService) CreateComment(ctx context.Context, owner string, repo string, number int, comment *IssueComment) (*IssueComment, *Response, error) { | func (s *IssuesService) CreateComment(ctx context.Context, owner string, repo string, number int, comment *IssueComment) (*IssueComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/%d/comments", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/issues/%d/comments", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("POST", u, comment) | 	req, err := s.client.NewRequest("POST", u, comment) | ||||||
| @@ -124,7 +125,7 @@ func (s *IssuesService) CreateComment(ctx context.Context, owner string, repo st | |||||||
| // EditComment updates an issue comment. | // EditComment updates an issue comment. | ||||||
| // A non-nil comment.Body must be provided. Other comment fields should be left nil. | // A non-nil comment.Body must be provided. Other comment fields should be left nil. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/comments/#edit-a-comment | // GitHub API docs: https://developer.github.com/v3/issues/comments/#update-an-issue-comment | ||||||
| func (s *IssuesService) EditComment(ctx context.Context, owner string, repo string, commentID int64, comment *IssueComment) (*IssueComment, *Response, error) { | func (s *IssuesService) EditComment(ctx context.Context, owner string, repo string, commentID int64, comment *IssueComment) (*IssueComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, commentID) | 	u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, commentID) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, comment) | 	req, err := s.client.NewRequest("PATCH", u, comment) | ||||||
| @@ -142,7 +143,7 @@ func (s *IssuesService) EditComment(ctx context.Context, owner string, repo stri | |||||||
| 
 | 
 | ||||||
| // DeleteComment deletes an issue comment. | // DeleteComment deletes an issue comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/comments/#delete-a-comment | // GitHub API docs: https://developer.github.com/v3/issues/comments/#delete-an-issue-comment | ||||||
| func (s *IssuesService) DeleteComment(ctx context.Context, owner string, repo string, commentID int64) (*Response, error) { | func (s *IssuesService) DeleteComment(ctx context.Context, owner string, repo string, commentID int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, commentID) | 	u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, commentID) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -63,28 +63,42 @@ type IssueEvent struct { | |||||||
| 	//     head_ref_deleted, head_ref_restored | 	//     head_ref_deleted, head_ref_restored | ||||||
| 	//       The pull request’s branch was deleted or restored. | 	//       The pull request’s branch was deleted or restored. | ||||||
| 	// | 	// | ||||||
|  | 	//    review_dismissed | ||||||
|  | 	//       The review was dismissed and `DismissedReview` will be populated below. | ||||||
|  | 	// | ||||||
| 	Event *string `json:"event,omitempty"` | 	Event *string `json:"event,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	CreatedAt *time.Time `json:"created_at,omitempty"` | 	CreatedAt *time.Time `json:"created_at,omitempty"` | ||||||
| 	Issue     *Issue     `json:"issue,omitempty"` | 	Issue     *Issue     `json:"issue,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// Only present on certain events; see above. | 	// Only present on certain events; see above. | ||||||
| 	Assignee    *User        `json:"assignee,omitempty"` | 	Assignee        *User            `json:"assignee,omitempty"` | ||||||
| 	Assigner    *User        `json:"assigner,omitempty"` | 	Assigner        *User            `json:"assigner,omitempty"` | ||||||
| 	CommitID    *string      `json:"commit_id,omitempty"` | 	CommitID        *string          `json:"commit_id,omitempty"` | ||||||
| 	Milestone   *Milestone   `json:"milestone,omitempty"` | 	Milestone       *Milestone       `json:"milestone,omitempty"` | ||||||
| 	Label       *Label       `json:"label,omitempty"` | 	Label           *Label           `json:"label,omitempty"` | ||||||
| 	Rename      *Rename      `json:"rename,omitempty"` | 	Rename          *Rename          `json:"rename,omitempty"` | ||||||
| 	LockReason  *string      `json:"lock_reason,omitempty"` | 	LockReason      *string          `json:"lock_reason,omitempty"` | ||||||
| 	ProjectCard *ProjectCard `json:"project_card,omitempty"` | 	ProjectCard     *ProjectCard     `json:"project_card,omitempty"` | ||||||
|  | 	DismissedReview *DismissedReview `json:"dismissed_review,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DismissedReview represents details for 'dismissed_review' events. | ||||||
|  | type DismissedReview struct { | ||||||
|  | 	// State represents the state of the dismissed review. | ||||||
|  | 	// Possible values are: "commented", "approved", and "changes_requested". | ||||||
|  | 	State             *string `json:"state,omitempty"` | ||||||
|  | 	ReviewID          *int64  `json:"review_id,omitempty"` | ||||||
|  | 	DismissalMessage  *string `json:"dismissal_message,omitempty"` | ||||||
|  | 	DismissalCommitID *string `json:"dismissal_commit_id,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ListIssueEvents lists events for the specified issue. | // ListIssueEvents lists events for the specified issue. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/events/#list-events-for-an-issue | // GitHub API docs: https://developer.github.com/v3/issues/events/#list-issue-events | ||||||
| func (s *IssuesService) ListIssueEvents(ctx context.Context, owner, repo string, number int, opt *ListOptions) ([]*IssueEvent, *Response, error) { | func (s *IssuesService) ListIssueEvents(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*IssueEvent, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/%v/events", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/issues/%v/events", owner, repo, number) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -108,10 +122,10 @@ func (s *IssuesService) ListIssueEvents(ctx context.Context, owner, repo string, | |||||||
| 
 | 
 | ||||||
| // ListRepositoryEvents lists events for the specified repository. | // ListRepositoryEvents lists events for the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/events/#list-events-for-a-repository | // GitHub API docs: https://developer.github.com/v3/issues/events/#list-issue-events-for-a-repository | ||||||
| func (s *IssuesService) ListRepositoryEvents(ctx context.Context, owner, repo string, opt *ListOptions) ([]*IssueEvent, *Response, error) { | func (s *IssuesService) ListRepositoryEvents(ctx context.Context, owner, repo string, opts *ListOptions) ([]*IssueEvent, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/events", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/issues/events", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -132,7 +146,7 @@ func (s *IssuesService) ListRepositoryEvents(ctx context.Context, owner, repo st | |||||||
| 
 | 
 | ||||||
| // GetEvent returns the specified issue event. | // GetEvent returns the specified issue event. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/events/#get-a-single-event | // GitHub API docs: https://developer.github.com/v3/issues/events/#get-an-issue-event | ||||||
| func (s *IssuesService) GetEvent(ctx context.Context, owner, repo string, id int64) (*IssueEvent, *Response, error) { | func (s *IssuesService) GetEvent(ctx context.Context, owner, repo string, id int64) (*IssueEvent, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/events/%v", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/issues/events/%v", owner, repo, id) | ||||||
| 
 | 
 | ||||||
| @@ -27,10 +27,10 @@ func (l Label) String() string { | |||||||
| 
 | 
 | ||||||
| // ListLabels lists all labels for a repository. | // ListLabels lists all labels for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository | // GitHub API docs: https://developer.github.com/v3/issues/labels/#list-labels-for-a-repository | ||||||
| func (s *IssuesService) ListLabels(ctx context.Context, owner string, repo string, opt *ListOptions) ([]*Label, *Response, error) { | func (s *IssuesService) ListLabels(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*Label, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/labels", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/labels", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -40,9 +40,6 @@ func (s *IssuesService) ListLabels(ctx context.Context, owner string, repo strin | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	var labels []*Label | 	var labels []*Label | ||||||
| 	resp, err := s.client.Do(ctx, req, &labels) | 	resp, err := s.client.Do(ctx, req, &labels) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -54,7 +51,7 @@ func (s *IssuesService) ListLabels(ctx context.Context, owner string, repo strin | |||||||
| 
 | 
 | ||||||
| // GetLabel gets a single label. | // GetLabel gets a single label. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/labels/#get-a-single-label | // GitHub API docs: https://developer.github.com/v3/issues/labels/#get-a-label | ||||||
| func (s *IssuesService) GetLabel(ctx context.Context, owner string, repo string, name string) (*Label, *Response, error) { | func (s *IssuesService) GetLabel(ctx context.Context, owner string, repo string, name string) (*Label, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/labels/%v", owner, repo, name) | 	u := fmt.Sprintf("repos/%v/%v/labels/%v", owner, repo, name) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -62,9 +59,6 @@ func (s *IssuesService) GetLabel(ctx context.Context, owner string, repo string, | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	label := new(Label) | 	label := new(Label) | ||||||
| 	resp, err := s.client.Do(ctx, req, label) | 	resp, err := s.client.Do(ctx, req, label) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -84,9 +78,6 @@ func (s *IssuesService) CreateLabel(ctx context.Context, owner string, repo stri | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	l := new(Label) | 	l := new(Label) | ||||||
| 	resp, err := s.client.Do(ctx, req, l) | 	resp, err := s.client.Do(ctx, req, l) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -106,9 +97,6 @@ func (s *IssuesService) EditLabel(ctx context.Context, owner string, repo string | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	l := new(Label) | 	l := new(Label) | ||||||
| 	resp, err := s.client.Do(ctx, req, l) | 	resp, err := s.client.Do(ctx, req, l) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -132,10 +120,10 @@ func (s *IssuesService) DeleteLabel(ctx context.Context, owner string, repo stri | |||||||
| 
 | 
 | ||||||
| // ListLabelsByIssue lists all labels for an issue. | // ListLabelsByIssue lists all labels for an issue. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/labels/#list-labels-on-an-issue | // GitHub API docs: https://developer.github.com/v3/issues/labels/#list-labels-for-an-issue | ||||||
| func (s *IssuesService) ListLabelsByIssue(ctx context.Context, owner string, repo string, number int, opt *ListOptions) ([]*Label, *Response, error) { | func (s *IssuesService) ListLabelsByIssue(ctx context.Context, owner string, repo string, number int, opts *ListOptions) ([]*Label, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -145,9 +133,6 @@ func (s *IssuesService) ListLabelsByIssue(ctx context.Context, owner string, rep | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	var labels []*Label | 	var labels []*Label | ||||||
| 	resp, err := s.client.Do(ctx, req, &labels) | 	resp, err := s.client.Do(ctx, req, &labels) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -167,9 +152,6 @@ func (s *IssuesService) AddLabelsToIssue(ctx context.Context, owner string, repo | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	var l []*Label | 	var l []*Label | ||||||
| 	resp, err := s.client.Do(ctx, req, &l) | 	resp, err := s.client.Do(ctx, req, &l) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -189,15 +171,12 @@ func (s *IssuesService) RemoveLabelForIssue(ctx context.Context, owner string, r | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	return s.client.Do(ctx, req, nil) | 	return s.client.Do(ctx, req, nil) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ReplaceLabelsForIssue replaces all labels for an issue. | // ReplaceLabelsForIssue replaces all labels for an issue. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/labels/#replace-all-labels-for-an-issue | // GitHub API docs: https://developer.github.com/v3/issues/labels/#set-labels-for-an-issue | ||||||
| func (s *IssuesService) ReplaceLabelsForIssue(ctx context.Context, owner string, repo string, number int, labels []string) ([]*Label, *Response, error) { | func (s *IssuesService) ReplaceLabelsForIssue(ctx context.Context, owner string, repo string, number int, labels []string) ([]*Label, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, labels) | 	req, err := s.client.NewRequest("PUT", u, labels) | ||||||
| @@ -205,9 +184,6 @@ func (s *IssuesService) ReplaceLabelsForIssue(ctx context.Context, owner string, | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	var l []*Label | 	var l []*Label | ||||||
| 	resp, err := s.client.Do(ctx, req, &l) | 	resp, err := s.client.Do(ctx, req, &l) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -227,18 +203,15 @@ func (s *IssuesService) RemoveLabelsForIssue(ctx context.Context, owner string, | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	return s.client.Do(ctx, req, nil) | 	return s.client.Do(ctx, req, nil) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ListLabelsForMilestone lists labels for every issue in a milestone. | // ListLabelsForMilestone lists labels for every issue in a milestone. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/labels/#get-labels-for-every-issue-in-a-milestone | // GitHub API docs: https://developer.github.com/v3/issues/labels/#list-labels-for-issues-in-a-milestone | ||||||
| func (s *IssuesService) ListLabelsForMilestone(ctx context.Context, owner string, repo string, number int, opt *ListOptions) ([]*Label, *Response, error) { | func (s *IssuesService) ListLabelsForMilestone(ctx context.Context, owner string, repo string, number int, opts *ListOptions) ([]*Label, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/milestones/%d/labels", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/milestones/%d/labels", owner, repo, number) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -248,9 +221,6 @@ func (s *IssuesService) ListLabelsForMilestone(ctx context.Context, owner string | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	var labels []*Label | 	var labels []*Label | ||||||
| 	resp, err := s.client.Do(ctx, req, &labels) | 	resp, err := s.client.Do(ctx, req, &labels) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -55,10 +55,10 @@ type MilestoneListOptions struct { | |||||||
| 
 | 
 | ||||||
| // ListMilestones lists all milestones for a repository. | // ListMilestones lists all milestones for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/milestones/#list-milestones-for-a-repository | // GitHub API docs: https://developer.github.com/v3/issues/milestones/#list-milestones | ||||||
| func (s *IssuesService) ListMilestones(ctx context.Context, owner string, repo string, opt *MilestoneListOptions) ([]*Milestone, *Response, error) { | func (s *IssuesService) ListMilestones(ctx context.Context, owner string, repo string, opts *MilestoneListOptions) ([]*Milestone, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/milestones", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/milestones", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -79,7 +79,7 @@ func (s *IssuesService) ListMilestones(ctx context.Context, owner string, repo s | |||||||
| 
 | 
 | ||||||
| // GetMilestone gets a single milestone. | // GetMilestone gets a single milestone. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/milestones/#get-a-single-milestone | // GitHub API docs: https://developer.github.com/v3/issues/milestones/#get-a-milestone | ||||||
| func (s *IssuesService) GetMilestone(ctx context.Context, owner string, repo string, number int) (*Milestone, *Response, error) { | func (s *IssuesService) GetMilestone(ctx context.Context, owner string, repo string, number int) (*Milestone, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/milestones/%d", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/milestones/%d", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -131,10 +131,10 @@ type Source struct { | |||||||
| 
 | 
 | ||||||
| // ListIssueTimeline lists events for the specified issue. | // ListIssueTimeline lists events for the specified issue. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/issues/timeline/#list-events-for-an-issue | // GitHub API docs: https://developer.github.com/v3/issues/timeline/#list-timeline-events-for-an-issue | ||||||
| func (s *IssuesService) ListIssueTimeline(ctx context.Context, owner, repo string, number int, opt *ListOptions) ([]*Timeline, *Response, error) { | func (s *IssuesService) ListIssueTimeline(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*Timeline, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/%v/timeline", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/issues/%v/timeline", owner, repo, number) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -78,7 +78,7 @@ func (s *LicensesService) List(ctx context.Context) ([]*License, *Response, erro | |||||||
| 
 | 
 | ||||||
| // Get extended metadata for one license. | // Get extended metadata for one license. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/licenses/#get-an-individual-license | // GitHub API docs: https://developer.github.com/v3/licenses/#get-a-license | ||||||
| func (s *LicensesService) Get(ctx context.Context, licenseName string) (*License, *Response, error) { | func (s *LicensesService) Get(ctx context.Context, licenseName string) (*License, *Response, error) { | ||||||
| 	u := fmt.Sprintf("licenses/%s", licenseName) | 	u := fmt.Sprintf("licenses/%s", licenseName) | ||||||
| 
 | 
 | ||||||
| @@ -46,9 +46,11 @@ var ( | |||||||
| 		"commit_comment":                 "CommitCommentEvent", | 		"commit_comment":                 "CommitCommentEvent", | ||||||
| 		"create":                         "CreateEvent", | 		"create":                         "CreateEvent", | ||||||
| 		"delete":                         "DeleteEvent", | 		"delete":                         "DeleteEvent", | ||||||
|  | 		"deploy_key":                     "DeployKeyEvent", | ||||||
| 		"deployment":                     "DeploymentEvent", | 		"deployment":                     "DeploymentEvent", | ||||||
| 		"deployment_status":              "DeploymentStatusEvent", | 		"deployment_status":              "DeploymentStatusEvent", | ||||||
| 		"fork":                           "ForkEvent", | 		"fork":                           "ForkEvent", | ||||||
|  | 		"github_app_authorization":       "GitHubAppAuthorizationEvent", | ||||||
| 		"gollum":                         "GollumEvent", | 		"gollum":                         "GollumEvent", | ||||||
| 		"installation":                   "InstallationEvent", | 		"installation":                   "InstallationEvent", | ||||||
| 		"installation_repositories":      "InstallationRepositoriesEvent", | 		"installation_repositories":      "InstallationRepositoriesEvent", | ||||||
| @@ -58,9 +60,11 @@ var ( | |||||||
| 		"marketplace_purchase":           "MarketplacePurchaseEvent", | 		"marketplace_purchase":           "MarketplacePurchaseEvent", | ||||||
| 		"member":                         "MemberEvent", | 		"member":                         "MemberEvent", | ||||||
| 		"membership":                     "MembershipEvent", | 		"membership":                     "MembershipEvent", | ||||||
|  | 		"meta":                           "MetaEvent", | ||||||
| 		"milestone":                      "MilestoneEvent", | 		"milestone":                      "MilestoneEvent", | ||||||
| 		"organization":                   "OrganizationEvent", | 		"organization":                   "OrganizationEvent", | ||||||
| 		"org_block":                      "OrgBlockEvent", | 		"org_block":                      "OrgBlockEvent", | ||||||
|  | 		"package":                        "PackageEvent", | ||||||
| 		"page_build":                     "PageBuildEvent", | 		"page_build":                     "PageBuildEvent", | ||||||
| 		"ping":                           "PingEvent", | 		"ping":                           "PingEvent", | ||||||
| 		"project":                        "ProjectEvent", | 		"project":                        "ProjectEvent", | ||||||
| @@ -72,11 +76,14 @@ var ( | |||||||
| 		"pull_request":                   "PullRequestEvent", | 		"pull_request":                   "PullRequestEvent", | ||||||
| 		"push":                           "PushEvent", | 		"push":                           "PushEvent", | ||||||
| 		"repository":                     "RepositoryEvent", | 		"repository":                     "RepositoryEvent", | ||||||
|  | 		"repository_dispatch":            "RepositoryDispatchEvent", | ||||||
| 		"repository_vulnerability_alert": "RepositoryVulnerabilityAlertEvent", | 		"repository_vulnerability_alert": "RepositoryVulnerabilityAlertEvent", | ||||||
| 		"release":                        "ReleaseEvent", | 		"release":                        "ReleaseEvent", | ||||||
|  | 		"star":                           "StarEvent", | ||||||
| 		"status":                         "StatusEvent", | 		"status":                         "StatusEvent", | ||||||
| 		"team":                           "TeamEvent", | 		"team":                           "TeamEvent", | ||||||
| 		"team_add":                       "TeamAddEvent", | 		"team_add":                       "TeamAddEvent", | ||||||
|  | 		"user":                           "UserEvent", | ||||||
| 		"watch":                          "WatchEvent", | 		"watch":                          "WatchEvent", | ||||||
| 	} | 	} | ||||||
| ) | ) | ||||||
| @@ -129,7 +136,9 @@ func messageMAC(signature string) ([]byte, func() hash.Hash, error) { | |||||||
| // and returns the (JSON) payload. | // and returns the (JSON) payload. | ||||||
| // The Content-Type header of the payload can be "application/json" or "application/x-www-form-urlencoded". | // The Content-Type header of the payload can be "application/json" or "application/x-www-form-urlencoded". | ||||||
| // If the Content-Type is neither then an error is returned. | // If the Content-Type is neither then an error is returned. | ||||||
| // secretKey is the GitHub Webhook secret message. | // secretToken is the GitHub Webhook secret token. | ||||||
|  | // If your webhook does not contain a secret token, you can pass nil or an empty slice. | ||||||
|  | // This is intended for local development purposes only and all webhooks should ideally set up a secret token. | ||||||
| // | // | ||||||
| // Example usage: | // Example usage: | ||||||
| // | // | ||||||
| @@ -139,7 +148,7 @@ func messageMAC(signature string) ([]byte, func() hash.Hash, error) { | |||||||
| //       // Process payload... | //       // Process payload... | ||||||
| //     } | //     } | ||||||
| // | // | ||||||
| func ValidatePayload(r *http.Request, secretKey []byte) (payload []byte, err error) { | func ValidatePayload(r *http.Request, secretToken []byte) (payload []byte, err error) { | ||||||
| 	var body []byte // Raw body that GitHub uses to calculate the signature. | 	var body []byte // Raw body that GitHub uses to calculate the signature. | ||||||
| 
 | 
 | ||||||
| 	switch ct := r.Header.Get("Content-Type"); ct { | 	switch ct := r.Header.Get("Content-Type"); ct { | ||||||
| @@ -175,25 +184,30 @@ func ValidatePayload(r *http.Request, secretKey []byte) (payload []byte, err err | |||||||
| 		return nil, fmt.Errorf("Webhook request has unsupported Content-Type %q", ct) | 		return nil, fmt.Errorf("Webhook request has unsupported Content-Type %q", ct) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	sig := r.Header.Get(signatureHeader) | 	// Only validate the signature if a secret token exists. This is intended for | ||||||
| 	if err := ValidateSignature(sig, body, secretKey); err != nil { | 	// local development only and all webhooks should ideally set up a secret token. | ||||||
| 		return nil, err | 	if len(secretToken) > 0 { | ||||||
|  | 		sig := r.Header.Get(signatureHeader) | ||||||
|  | 		if err := ValidateSignature(sig, body, secretToken); err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	return payload, nil | 	return payload, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ValidateSignature validates the signature for the given payload. | // ValidateSignature validates the signature for the given payload. | ||||||
| // signature is the GitHub hash signature delivered in the X-Hub-Signature header. | // signature is the GitHub hash signature delivered in the X-Hub-Signature header. | ||||||
| // payload is the JSON payload sent by GitHub Webhooks. | // payload is the JSON payload sent by GitHub Webhooks. | ||||||
| // secretKey is the GitHub Webhook secret message. | // secretToken is the GitHub Webhook secret token. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/webhooks/securing/#validating-payloads-from-github | // GitHub API docs: https://developer.github.com/webhooks/securing/#validating-payloads-from-github | ||||||
| func ValidateSignature(signature string, payload, secretKey []byte) error { | func ValidateSignature(signature string, payload, secretToken []byte) error { | ||||||
| 	messageMAC, hashFunc, err := messageMAC(signature) | 	messageMAC, hashFunc, err := messageMAC(signature) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if !checkMAC(payload, messageMAC, secretKey, hashFunc) { | 	if !checkMAC(payload, messageMAC, secretToken, hashFunc) { | ||||||
| 		return errors.New("payload signature check failed") | 		return errors.New("payload signature check failed") | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| @@ -74,14 +74,14 @@ type startMigration struct { | |||||||
| // StartMigration starts the generation of a migration archive. | // StartMigration starts the generation of a migration archive. | ||||||
| // repos is a slice of repository names to migrate. | // repos is a slice of repository names to migrate. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/migrations/#start-a-migration | // GitHub API docs: https://developer.github.com/v3/migrations/orgs/#start-an-organization-migration | ||||||
| func (s *MigrationService) StartMigration(ctx context.Context, org string, repos []string, opt *MigrationOptions) (*Migration, *Response, error) { | func (s *MigrationService) StartMigration(ctx context.Context, org string, repos []string, opts *MigrationOptions) (*Migration, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/migrations", org) | 	u := fmt.Sprintf("orgs/%v/migrations", org) | ||||||
| 
 | 
 | ||||||
| 	body := &startMigration{Repositories: repos} | 	body := &startMigration{Repositories: repos} | ||||||
| 	if opt != nil { | 	if opts != nil { | ||||||
| 		body.LockRepositories = Bool(opt.LockRepositories) | 		body.LockRepositories = Bool(opts.LockRepositories) | ||||||
| 		body.ExcludeAttachments = Bool(opt.ExcludeAttachments) | 		body.ExcludeAttachments = Bool(opts.ExcludeAttachments) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("POST", u, body) | 	req, err := s.client.NewRequest("POST", u, body) | ||||||
| @@ -103,9 +103,13 @@ func (s *MigrationService) StartMigration(ctx context.Context, org string, repos | |||||||
| 
 | 
 | ||||||
| // ListMigrations lists the most recent migrations. | // ListMigrations lists the most recent migrations. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/migrations/#get-a-list-of-migrations | // GitHub API docs: https://developer.github.com/v3/migrations/orgs/#list-organization-migrations | ||||||
| func (s *MigrationService) ListMigrations(ctx context.Context, org string) ([]*Migration, *Response, error) { | func (s *MigrationService) ListMigrations(ctx context.Context, org string, opts *ListOptions) ([]*Migration, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/migrations", org) | 	u := fmt.Sprintf("orgs/%v/migrations", org) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -127,7 +131,7 @@ func (s *MigrationService) ListMigrations(ctx context.Context, org string) ([]*M | |||||||
| // MigrationStatus gets the status of a specific migration archive. | // MigrationStatus gets the status of a specific migration archive. | ||||||
| // id is the migration ID. | // id is the migration ID. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/migrations/#get-the-status-of-a-migration | // GitHub API docs: https://developer.github.com/v3/migrations/orgs/#get-an-organization-migration-status | ||||||
| func (s *MigrationService) MigrationStatus(ctx context.Context, org string, id int64) (*Migration, *Response, error) { | func (s *MigrationService) MigrationStatus(ctx context.Context, org string, id int64) (*Migration, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/migrations/%v", org, id) | 	u := fmt.Sprintf("orgs/%v/migrations/%v", org, id) | ||||||
| 
 | 
 | ||||||
| @@ -151,7 +155,7 @@ func (s *MigrationService) MigrationStatus(ctx context.Context, org string, id i | |||||||
| // MigrationArchiveURL fetches a migration archive URL. | // MigrationArchiveURL fetches a migration archive URL. | ||||||
| // id is the migration ID. | // id is the migration ID. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/migrations/#download-a-migration-archive | // GitHub API docs: https://developer.github.com/v3/migrations/orgs/#download-an-organization-migration-archive | ||||||
| func (s *MigrationService) MigrationArchiveURL(ctx context.Context, org string, id int64) (url string, err error) { | func (s *MigrationService) MigrationArchiveURL(ctx context.Context, org string, id int64) (url string, err error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/migrations/%v/archive", org, id) | 	u := fmt.Sprintf("orgs/%v/migrations/%v/archive", org, id) | ||||||
| 
 | 
 | ||||||
| @@ -188,7 +192,7 @@ func (s *MigrationService) MigrationArchiveURL(ctx context.Context, org string, | |||||||
| // DeleteMigration deletes a previous migration archive. | // DeleteMigration deletes a previous migration archive. | ||||||
| // id is the migration ID. | // id is the migration ID. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/migrations/#delete-a-migration-archive | // GitHub API docs: https://developer.github.com/v3/migrations/orgs/#delete-an-organization-migration-archive | ||||||
| func (s *MigrationService) DeleteMigration(ctx context.Context, org string, id int64) (*Response, error) { | func (s *MigrationService) DeleteMigration(ctx context.Context, org string, id int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/migrations/%v/archive", org, id) | 	u := fmt.Sprintf("orgs/%v/migrations/%v/archive", org, id) | ||||||
| 
 | 
 | ||||||
| @@ -208,7 +212,7 @@ func (s *MigrationService) DeleteMigration(ctx context.Context, org string, id i | |||||||
| // You should unlock each migrated repository and delete them when the migration | // You should unlock each migrated repository and delete them when the migration | ||||||
| // is complete and you no longer need the source data. | // is complete and you no longer need the source data. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/migrations/#unlock-a-repository | // GitHub API docs: https://developer.github.com/v3/migrations/orgs/#unlock-an-organization-repository | ||||||
| func (s *MigrationService) UnlockRepo(ctx context.Context, org string, id int64, repo string) (*Response, error) { | func (s *MigrationService) UnlockRepo(ctx context.Context, org string, id int64, repo string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/migrations/%v/repos/%v/lock", org, id, repo) | 	u := fmt.Sprintf("orgs/%v/migrations/%v/repos/%v/lock", org, id, repo) | ||||||
| 
 | 
 | ||||||
| @@ -106,7 +106,7 @@ type Import struct { | |||||||
| 	// When the importer finds several projects or repositories at the | 	// When the importer finds several projects or repositories at the | ||||||
| 	// provided URLs, this will identify the available choices. Call | 	// provided URLs, this will identify the available choices. Call | ||||||
| 	// UpdateImport with the selected Import value. | 	// UpdateImport with the selected Import value. | ||||||
| 	ProjectChoices []Import `json:"project_choices,omitempty"` | 	ProjectChoices []*Import `json:"project_choices,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (i Import) String() string { | func (i Import) String() string { | ||||||
| @@ -146,7 +146,7 @@ func (f LargeFile) String() string { | |||||||
| 
 | 
 | ||||||
| // StartImport initiates a repository import. | // StartImport initiates a repository import. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/source_imports/#start-an-import | // GitHub API docs: https://developer.github.com/v3/migrations/source_imports/#start-an-import | ||||||
| func (s *MigrationService) StartImport(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) { | func (s *MigrationService) StartImport(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/import", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/import", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, in) | 	req, err := s.client.NewRequest("PUT", u, in) | ||||||
| @@ -154,9 +154,6 @@ func (s *MigrationService) StartImport(ctx context.Context, owner, repo string, | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches |  | ||||||
| 	req.Header.Set("Accept", mediaTypeImportPreview) |  | ||||||
| 
 |  | ||||||
| 	out := new(Import) | 	out := new(Import) | ||||||
| 	resp, err := s.client.Do(ctx, req, out) | 	resp, err := s.client.Do(ctx, req, out) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -168,7 +165,7 @@ func (s *MigrationService) StartImport(ctx context.Context, owner, repo string, | |||||||
| 
 | 
 | ||||||
| // ImportProgress queries for the status and progress of an ongoing repository import. | // ImportProgress queries for the status and progress of an ongoing repository import. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/source_imports/#get-import-progress | // GitHub API docs: https://developer.github.com/v3/migrations/source_imports/#get-an-import-status | ||||||
| func (s *MigrationService) ImportProgress(ctx context.Context, owner, repo string) (*Import, *Response, error) { | func (s *MigrationService) ImportProgress(ctx context.Context, owner, repo string) (*Import, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/import", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/import", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -176,9 +173,6 @@ func (s *MigrationService) ImportProgress(ctx context.Context, owner, repo strin | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches |  | ||||||
| 	req.Header.Set("Accept", mediaTypeImportPreview) |  | ||||||
| 
 |  | ||||||
| 	out := new(Import) | 	out := new(Import) | ||||||
| 	resp, err := s.client.Do(ctx, req, out) | 	resp, err := s.client.Do(ctx, req, out) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -190,7 +184,7 @@ func (s *MigrationService) ImportProgress(ctx context.Context, owner, repo strin | |||||||
| 
 | 
 | ||||||
| // UpdateImport initiates a repository import. | // UpdateImport initiates a repository import. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/source_imports/#update-existing-import | // GitHub API docs: https://developer.github.com/v3/migrations/source_imports/#update-an-import | ||||||
| func (s *MigrationService) UpdateImport(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) { | func (s *MigrationService) UpdateImport(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/import", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/import", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, in) | 	req, err := s.client.NewRequest("PATCH", u, in) | ||||||
| @@ -198,9 +192,6 @@ func (s *MigrationService) UpdateImport(ctx context.Context, owner, repo string, | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches |  | ||||||
| 	req.Header.Set("Accept", mediaTypeImportPreview) |  | ||||||
| 
 |  | ||||||
| 	out := new(Import) | 	out := new(Import) | ||||||
| 	resp, err := s.client.Do(ctx, req, out) | 	resp, err := s.client.Do(ctx, req, out) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -222,7 +213,7 @@ func (s *MigrationService) UpdateImport(ctx context.Context, owner, repo string, | |||||||
| // This method and MapCommitAuthor allow you to provide correct Git author | // This method and MapCommitAuthor allow you to provide correct Git author | ||||||
| // information. | // information. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/source_imports/#get-commit-authors | // GitHub API docs: https://developer.github.com/v3/migrations/source_imports/#get-commit-authors | ||||||
| func (s *MigrationService) CommitAuthors(ctx context.Context, owner, repo string) ([]*SourceImportAuthor, *Response, error) { | func (s *MigrationService) CommitAuthors(ctx context.Context, owner, repo string) ([]*SourceImportAuthor, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/import/authors", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/import/authors", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -230,9 +221,6 @@ func (s *MigrationService) CommitAuthors(ctx context.Context, owner, repo string | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches |  | ||||||
| 	req.Header.Set("Accept", mediaTypeImportPreview) |  | ||||||
| 
 |  | ||||||
| 	var authors []*SourceImportAuthor | 	var authors []*SourceImportAuthor | ||||||
| 	resp, err := s.client.Do(ctx, req, &authors) | 	resp, err := s.client.Do(ctx, req, &authors) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -246,7 +234,7 @@ func (s *MigrationService) CommitAuthors(ctx context.Context, owner, repo string | |||||||
| // application can continue updating authors any time before you push new | // application can continue updating authors any time before you push new | ||||||
| // commits to the repository. | // commits to the repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/source_imports/#map-a-commit-author | // GitHub API docs: https://developer.github.com/v3/migrations/source_imports/#map-a-commit-author | ||||||
| func (s *MigrationService) MapCommitAuthor(ctx context.Context, owner, repo string, id int64, author *SourceImportAuthor) (*SourceImportAuthor, *Response, error) { | func (s *MigrationService) MapCommitAuthor(ctx context.Context, owner, repo string, id int64, author *SourceImportAuthor) (*SourceImportAuthor, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/import/authors/%v", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/import/authors/%v", owner, repo, id) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, author) | 	req, err := s.client.NewRequest("PATCH", u, author) | ||||||
| @@ -254,9 +242,6 @@ func (s *MigrationService) MapCommitAuthor(ctx context.Context, owner, repo stri | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches |  | ||||||
| 	req.Header.Set("Accept", mediaTypeImportPreview) |  | ||||||
| 
 |  | ||||||
| 	out := new(SourceImportAuthor) | 	out := new(SourceImportAuthor) | ||||||
| 	resp, err := s.client.Do(ctx, req, out) | 	resp, err := s.client.Do(ctx, req, out) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -270,7 +255,7 @@ func (s *MigrationService) MapCommitAuthor(ctx context.Context, owner, repo stri | |||||||
| // files larger than 100MB. Only the UseLFS field on the provided Import is | // files larger than 100MB. Only the UseLFS field on the provided Import is | ||||||
| // used. | // used. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/source_imports/#set-git-lfs-preference | // GitHub API docs: https://developer.github.com/v3/migrations/source_imports/#update-git-lfs-preference | ||||||
| func (s *MigrationService) SetLFSPreference(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) { | func (s *MigrationService) SetLFSPreference(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/import/lfs", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/import/lfs", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, in) | 	req, err := s.client.NewRequest("PATCH", u, in) | ||||||
| @@ -278,9 +263,6 @@ func (s *MigrationService) SetLFSPreference(ctx context.Context, owner, repo str | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches |  | ||||||
| 	req.Header.Set("Accept", mediaTypeImportPreview) |  | ||||||
| 
 |  | ||||||
| 	out := new(Import) | 	out := new(Import) | ||||||
| 	resp, err := s.client.Do(ctx, req, out) | 	resp, err := s.client.Do(ctx, req, out) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -292,7 +274,7 @@ func (s *MigrationService) SetLFSPreference(ctx context.Context, owner, repo str | |||||||
| 
 | 
 | ||||||
| // LargeFiles lists files larger than 100MB found during the import. | // LargeFiles lists files larger than 100MB found during the import. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/source_imports/#get-large-files | // GitHub API docs: https://developer.github.com/v3/migrations/source_imports/#get-large-files | ||||||
| func (s *MigrationService) LargeFiles(ctx context.Context, owner, repo string) ([]*LargeFile, *Response, error) { | func (s *MigrationService) LargeFiles(ctx context.Context, owner, repo string) ([]*LargeFile, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/import/large_files", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/import/large_files", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -300,9 +282,6 @@ func (s *MigrationService) LargeFiles(ctx context.Context, owner, repo string) ( | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches |  | ||||||
| 	req.Header.Set("Accept", mediaTypeImportPreview) |  | ||||||
| 
 |  | ||||||
| 	var files []*LargeFile | 	var files []*LargeFile | ||||||
| 	resp, err := s.client.Do(ctx, req, &files) | 	resp, err := s.client.Do(ctx, req, &files) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -314,7 +293,7 @@ func (s *MigrationService) LargeFiles(ctx context.Context, owner, repo string) ( | |||||||
| 
 | 
 | ||||||
| // CancelImport stops an import for a repository. | // CancelImport stops an import for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migration/source_imports/#cancel-an-import | // GitHub API docs: https://developer.github.com/v3/migrations/source_imports/#cancel-an-import | ||||||
| func (s *MigrationService) CancelImport(ctx context.Context, owner, repo string) (*Response, error) { | func (s *MigrationService) CancelImport(ctx context.Context, owner, repo string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/import", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/import", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -322,8 +301,5 @@ func (s *MigrationService) CancelImport(ctx context.Context, owner, repo string) | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches |  | ||||||
| 	req.Header.Set("Accept", mediaTypeImportPreview) |  | ||||||
| 
 |  | ||||||
| 	return s.client.Do(ctx, req, nil) | 	return s.client.Do(ctx, req, nil) | ||||||
| } | } | ||||||
| @@ -68,13 +68,13 @@ type startUserMigration struct { | |||||||
| // repos is a slice of repository names to migrate. | // repos is a slice of repository names to migrate. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migrations/users/#start-a-user-migration | // GitHub API docs: https://developer.github.com/v3/migrations/users/#start-a-user-migration | ||||||
| func (s *MigrationService) StartUserMigration(ctx context.Context, repos []string, opt *UserMigrationOptions) (*UserMigration, *Response, error) { | func (s *MigrationService) StartUserMigration(ctx context.Context, repos []string, opts *UserMigrationOptions) (*UserMigration, *Response, error) { | ||||||
| 	u := "user/migrations" | 	u := "user/migrations" | ||||||
| 
 | 
 | ||||||
| 	body := &startUserMigration{Repositories: repos} | 	body := &startUserMigration{Repositories: repos} | ||||||
| 	if opt != nil { | 	if opts != nil { | ||||||
| 		body.LockRepositories = Bool(opt.LockRepositories) | 		body.LockRepositories = Bool(opts.LockRepositories) | ||||||
| 		body.ExcludeAttachments = Bool(opt.ExcludeAttachments) | 		body.ExcludeAttachments = Bool(opts.ExcludeAttachments) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("POST", u, body) | 	req, err := s.client.NewRequest("POST", u, body) | ||||||
| @@ -96,7 +96,7 @@ func (s *MigrationService) StartUserMigration(ctx context.Context, repos []strin | |||||||
| 
 | 
 | ||||||
| // ListUserMigrations lists the most recent migrations. | // ListUserMigrations lists the most recent migrations. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migrations/users/#get-a-list-of-user-migrations | // GitHub API docs: https://developer.github.com/v3/migrations/users/#list-user-migrations | ||||||
| func (s *MigrationService) ListUserMigrations(ctx context.Context) ([]*UserMigration, *Response, error) { | func (s *MigrationService) ListUserMigrations(ctx context.Context) ([]*UserMigration, *Response, error) { | ||||||
| 	u := "user/migrations" | 	u := "user/migrations" | ||||||
| 
 | 
 | ||||||
| @@ -120,7 +120,7 @@ func (s *MigrationService) ListUserMigrations(ctx context.Context) ([]*UserMigra | |||||||
| // UserMigrationStatus gets the status of a specific migration archive. | // UserMigrationStatus gets the status of a specific migration archive. | ||||||
| // id is the migration ID. | // id is the migration ID. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/migrations/users/#get-the-status-of-a-user-migration | // GitHub API docs: https://developer.github.com/v3/migrations/users/#get-a-user-migration-status | ||||||
| func (s *MigrationService) UserMigrationStatus(ctx context.Context, id int64) (*UserMigration, *Response, error) { | func (s *MigrationService) UserMigrationStatus(ctx context.Context, id int64) (*UserMigration, *Response, error) { | ||||||
| 	u := fmt.Sprintf("user/migrations/%v", id) | 	u := fmt.Sprintf("user/migrations/%v", id) | ||||||
| 
 | 
 | ||||||
| @@ -40,14 +40,14 @@ type markdownRequest struct { | |||||||
| // Markdown renders an arbitrary Markdown document. | // Markdown renders an arbitrary Markdown document. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/markdown/ | // GitHub API docs: https://developer.github.com/v3/markdown/ | ||||||
| func (c *Client) Markdown(ctx context.Context, text string, opt *MarkdownOptions) (string, *Response, error) { | func (c *Client) Markdown(ctx context.Context, text string, opts *MarkdownOptions) (string, *Response, error) { | ||||||
| 	request := &markdownRequest{Text: String(text)} | 	request := &markdownRequest{Text: String(text)} | ||||||
| 	if opt != nil { | 	if opts != nil { | ||||||
| 		if opt.Mode != "" { | 		if opts.Mode != "" { | ||||||
| 			request.Mode = String(opt.Mode) | 			request.Mode = String(opts.Mode) | ||||||
| 		} | 		} | ||||||
| 		if opt.Context != "" { | 		if opts.Context != "" { | ||||||
| 			request.Context = String(opt.Context) | 			request.Context = String(opts.Context) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @@ -29,6 +29,7 @@ type Organization struct { | |||||||
| 	Blog                        *string    `json:"blog,omitempty"` | 	Blog                        *string    `json:"blog,omitempty"` | ||||||
| 	Location                    *string    `json:"location,omitempty"` | 	Location                    *string    `json:"location,omitempty"` | ||||||
| 	Email                       *string    `json:"email,omitempty"` | 	Email                       *string    `json:"email,omitempty"` | ||||||
|  | 	TwitterUsername             *string    `json:"twitter_username,omitempty"` | ||||||
| 	Description                 *string    `json:"description,omitempty"` | 	Description                 *string    `json:"description,omitempty"` | ||||||
| 	PublicRepos                 *int       `json:"public_repos,omitempty"` | 	PublicRepos                 *int       `json:"public_repos,omitempty"` | ||||||
| 	PublicGists                 *int       `json:"public_gists,omitempty"` | 	PublicGists                 *int       `json:"public_gists,omitempty"` | ||||||
| @@ -45,6 +46,9 @@ type Organization struct { | |||||||
| 	Type                        *string    `json:"type,omitempty"` | 	Type                        *string    `json:"type,omitempty"` | ||||||
| 	Plan                        *Plan      `json:"plan,omitempty"` | 	Plan                        *Plan      `json:"plan,omitempty"` | ||||||
| 	TwoFactorRequirementEnabled *bool      `json:"two_factor_requirement_enabled,omitempty"` | 	TwoFactorRequirementEnabled *bool      `json:"two_factor_requirement_enabled,omitempty"` | ||||||
|  | 	IsVerified                  *bool      `json:"is_verified,omitempty"` | ||||||
|  | 	HasOrganizationProjects     *bool      `json:"has_organization_projects,omitempty"` | ||||||
|  | 	HasRepositoryProjects       *bool      `json:"has_repository_projects,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// DefaultRepoPermission can be one of: "read", "write", "admin", or "none". (Default: "read"). | 	// DefaultRepoPermission can be one of: "read", "write", "admin", or "none". (Default: "read"). | ||||||
| 	// It is only used in OrganizationsService.Edit. | 	// It is only used in OrganizationsService.Edit. | ||||||
| @@ -56,6 +60,19 @@ type Organization struct { | |||||||
| 	// MembersCanCreateRepos default value is true and is only used in Organizations.Edit. | 	// MembersCanCreateRepos default value is true and is only used in Organizations.Edit. | ||||||
| 	MembersCanCreateRepos *bool `json:"members_can_create_repositories,omitempty"` | 	MembersCanCreateRepos *bool `json:"members_can_create_repositories,omitempty"` | ||||||
| 
 | 
 | ||||||
|  | 	// https://developer.github.com/changes/2019-12-03-internal-visibility-changes/#rest-v3-api | ||||||
|  | 	MembersCanCreatePublicRepos   *bool `json:"members_can_create_public_repositories,omitempty"` | ||||||
|  | 	MembersCanCreatePrivateRepos  *bool `json:"members_can_create_private_repositories,omitempty"` | ||||||
|  | 	MembersCanCreateInternalRepos *bool `json:"members_can_create_internal_repositories,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// MembersAllowedRepositoryCreationType denotes if organization members can create repositories | ||||||
|  | 	// and the type of repositories they can create. Possible values are: "all", "private", or "none". | ||||||
|  | 	// | ||||||
|  | 	// Deprecated: Use MembersCanCreatePublicRepos, MembersCanCreatePrivateRepos, MembersCanCreateInternalRepos | ||||||
|  | 	// instead. The new fields overrides the existing MembersAllowedRepositoryCreationType during 'edit' | ||||||
|  | 	// operation and does not consider 'internal' repositories during 'get' operation | ||||||
|  | 	MembersAllowedRepositoryCreationType *string `json:"members_allowed_repository_creation_type,omitempty"` | ||||||
|  | 
 | ||||||
| 	// API URLs | 	// API URLs | ||||||
| 	URL              *string `json:"url,omitempty"` | 	URL              *string `json:"url,omitempty"` | ||||||
| 	EventsURL        *string `json:"events_url,omitempty"` | 	EventsURL        *string `json:"events_url,omitempty"` | ||||||
| @@ -66,6 +83,12 @@ type Organization struct { | |||||||
| 	ReposURL         *string `json:"repos_url,omitempty"` | 	ReposURL         *string `json:"repos_url,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // OrganizationInstallations represents GitHub app installations for an organization. | ||||||
|  | type OrganizationInstallations struct { | ||||||
|  | 	TotalCount    *int            `json:"total_count,omitempty"` | ||||||
|  | 	Installations []*Installation `json:"installations,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (o Organization) String() string { | func (o Organization) String() string { | ||||||
| 	return Stringify(o) | 	return Stringify(o) | ||||||
| } | } | ||||||
| @@ -76,6 +99,8 @@ type Plan struct { | |||||||
| 	Space         *int    `json:"space,omitempty"` | 	Space         *int    `json:"space,omitempty"` | ||||||
| 	Collaborators *int    `json:"collaborators,omitempty"` | 	Collaborators *int    `json:"collaborators,omitempty"` | ||||||
| 	PrivateRepos  *int    `json:"private_repos,omitempty"` | 	PrivateRepos  *int    `json:"private_repos,omitempty"` | ||||||
|  | 	FilledSeats   *int    `json:"filled_seats,omitempty"` | ||||||
|  | 	Seats         *int    `json:"seats,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (p Plan) String() string { | func (p Plan) String() string { | ||||||
| @@ -100,9 +125,9 @@ type OrganizationsListOptions struct { | |||||||
| // listing the next set of organizations, use the ID of the last-returned organization | // listing the next set of organizations, use the ID of the last-returned organization | ||||||
| // as the opts.Since parameter for the next call. | // as the opts.Since parameter for the next call. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/#list-all-organizations | // GitHub API docs: https://developer.github.com/v3/orgs/#list-organizations | ||||||
| func (s *OrganizationsService) ListAll(ctx context.Context, opt *OrganizationsListOptions) ([]*Organization, *Response, error) { | func (s *OrganizationsService) ListAll(ctx context.Context, opts *OrganizationsListOptions) ([]*Organization, *Response, error) { | ||||||
| 	u, err := addOptions("organizations", opt) | 	u, err := addOptions("organizations", opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -123,15 +148,16 @@ func (s *OrganizationsService) ListAll(ctx context.Context, opt *OrganizationsLi | |||||||
| // List the organizations for a user. Passing the empty string will list | // List the organizations for a user. Passing the empty string will list | ||||||
| // organizations for the authenticated user. | // organizations for the authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/#list-user-organizations | // GitHub API docs: https://developer.github.com/v3/orgs/#oauth-scope-requirements | ||||||
| func (s *OrganizationsService) List(ctx context.Context, user string, opt *ListOptions) ([]*Organization, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/orgs/#list-organizations-for-a-user | ||||||
|  | func (s *OrganizationsService) List(ctx context.Context, user string, opts *ListOptions) ([]*Organization, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if user != "" { | 	if user != "" { | ||||||
| 		u = fmt.Sprintf("users/%v/orgs", user) | 		u = fmt.Sprintf("users/%v/orgs", user) | ||||||
| 	} else { | 	} else { | ||||||
| 		u = "user/orgs" | 		u = "user/orgs" | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -160,6 +186,9 @@ func (s *OrganizationsService) Get(ctx context.Context, org string) (*Organizati | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeMemberAllowedRepoCreationTypePreview) | ||||||
|  | 
 | ||||||
| 	organization := new(Organization) | 	organization := new(Organization) | ||||||
| 	resp, err := s.client.Do(ctx, req, organization) | 	resp, err := s.client.Do(ctx, req, organization) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -190,7 +219,7 @@ func (s *OrganizationsService) GetByID(ctx context.Context, id int64) (*Organiza | |||||||
| 
 | 
 | ||||||
| // Edit an organization. | // Edit an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/#edit-an-organization | // GitHub API docs: https://developer.github.com/v3/orgs/#members_can_create_repositories | ||||||
| func (s *OrganizationsService) Edit(ctx context.Context, name string, org *Organization) (*Organization, *Response, error) { | func (s *OrganizationsService) Edit(ctx context.Context, name string, org *Organization) (*Organization, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v", name) | 	u := fmt.Sprintf("orgs/%v", name) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, org) | 	req, err := s.client.NewRequest("PATCH", u, org) | ||||||
| @@ -198,6 +227,9 @@ func (s *OrganizationsService) Edit(ctx context.Context, name string, org *Organ | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeMemberAllowedRepoCreationTypePreview) | ||||||
|  | 
 | ||||||
| 	o := new(Organization) | 	o := new(Organization) | ||||||
| 	resp, err := s.client.Do(ctx, req, o) | 	resp, err := s.client.Do(ctx, req, o) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -206,3 +238,31 @@ func (s *OrganizationsService) Edit(ctx context.Context, name string, org *Organ | |||||||
| 
 | 
 | ||||||
| 	return o, resp, nil | 	return o, resp, nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // ListInstallations lists installations for an organization. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/orgs/#list-app-installations-for-an-organization | ||||||
|  | func (s *OrganizationsService) ListInstallations(ctx context.Context, org string, opts *ListOptions) (*OrganizationInstallations, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/installations", org) | ||||||
|  | 
 | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeIntegrationPreview) | ||||||
|  | 
 | ||||||
|  | 	result := new(OrganizationInstallations) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, result) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return result, resp, nil | ||||||
|  | } | ||||||
| @@ -12,10 +12,10 @@ import ( | |||||||
| 
 | 
 | ||||||
| // ListHooks lists all Hooks for the specified organization. | // ListHooks lists all Hooks for the specified organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#list-hooks | // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#list-organization-webhooks | ||||||
| func (s *OrganizationsService) ListHooks(ctx context.Context, org string, opt *ListOptions) ([]*Hook, *Response, error) { | func (s *OrganizationsService) ListHooks(ctx context.Context, org string, opts *ListOptions) ([]*Hook, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/hooks", org) | 	u := fmt.Sprintf("orgs/%v/hooks", org) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -36,7 +36,7 @@ func (s *OrganizationsService) ListHooks(ctx context.Context, org string, opt *L | |||||||
| 
 | 
 | ||||||
| // GetHook returns a single specified Hook. | // GetHook returns a single specified Hook. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#get-single-hook | // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#get-an-organization-webhook | ||||||
| func (s *OrganizationsService) GetHook(ctx context.Context, org string, id int64) (*Hook, *Response, error) { | func (s *OrganizationsService) GetHook(ctx context.Context, org string, id int64) (*Hook, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/hooks/%d", org, id) | 	u := fmt.Sprintf("orgs/%v/hooks/%d", org, id) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -54,11 +54,12 @@ func (s *OrganizationsService) GetHook(ctx context.Context, org string, id int64 | |||||||
| // Note that only a subset of the hook fields are used and hook must | // Note that only a subset of the hook fields are used and hook must | ||||||
| // not be nil. | // not be nil. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#create-a-hook | // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#create-an-organization-webhook | ||||||
| func (s *OrganizationsService) CreateHook(ctx context.Context, org string, hook *Hook) (*Hook, *Response, error) { | func (s *OrganizationsService) CreateHook(ctx context.Context, org string, hook *Hook) (*Hook, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/hooks", org) | 	u := fmt.Sprintf("orgs/%v/hooks", org) | ||||||
| 
 | 
 | ||||||
| 	hookReq := &createHookRequest{ | 	hookReq := &createHookRequest{ | ||||||
|  | 		Name:   "web", | ||||||
| 		Events: hook.Events, | 		Events: hook.Events, | ||||||
| 		Active: hook.Active, | 		Active: hook.Active, | ||||||
| 		Config: hook.Config, | 		Config: hook.Config, | ||||||
| @@ -80,7 +81,7 @@ func (s *OrganizationsService) CreateHook(ctx context.Context, org string, hook | |||||||
| 
 | 
 | ||||||
| // EditHook updates a specified Hook. | // EditHook updates a specified Hook. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#edit-a-hook | // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#update-an-organization-webhook | ||||||
| func (s *OrganizationsService) EditHook(ctx context.Context, org string, id int64, hook *Hook) (*Hook, *Response, error) { | func (s *OrganizationsService) EditHook(ctx context.Context, org string, id int64, hook *Hook) (*Hook, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/hooks/%d", org, id) | 	u := fmt.Sprintf("orgs/%v/hooks/%d", org, id) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, hook) | 	req, err := s.client.NewRequest("PATCH", u, hook) | ||||||
| @@ -94,7 +95,7 @@ func (s *OrganizationsService) EditHook(ctx context.Context, org string, id int6 | |||||||
| 
 | 
 | ||||||
| // PingHook triggers a 'ping' event to be sent to the Hook. | // PingHook triggers a 'ping' event to be sent to the Hook. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#ping-a-hook | // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#ping-an-organization-webhook | ||||||
| func (s *OrganizationsService) PingHook(ctx context.Context, org string, id int64) (*Response, error) { | func (s *OrganizationsService) PingHook(ctx context.Context, org string, id int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/hooks/%d/pings", org, id) | 	u := fmt.Sprintf("orgs/%v/hooks/%d/pings", org, id) | ||||||
| 	req, err := s.client.NewRequest("POST", u, nil) | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
| @@ -106,7 +107,7 @@ func (s *OrganizationsService) PingHook(ctx context.Context, org string, id int6 | |||||||
| 
 | 
 | ||||||
| // DeleteHook deletes a specified Hook. | // DeleteHook deletes a specified Hook. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#delete-a-hook | // GitHub API docs: https://developer.github.com/v3/orgs/hooks/#delete-an-organization-webhook | ||||||
| func (s *OrganizationsService) DeleteHook(ctx context.Context, org string, id int64) (*Response, error) { | func (s *OrganizationsService) DeleteHook(ctx context.Context, org string, id int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/hooks/%d", org, id) | 	u := fmt.Sprintf("orgs/%v/hooks/%d", org, id) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -71,15 +71,16 @@ type ListMembersOptions struct { | |||||||
| // user is an owner of the organization, this will return both concealed and | // user is an owner of the organization, this will return both concealed and | ||||||
| // public members, otherwise it will only return public members. | // public members, otherwise it will only return public members. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#members-list | // GitHub API docs: https://developer.github.com/v3/orgs/members/#list-organization-members | ||||||
| func (s *OrganizationsService) ListMembers(ctx context.Context, org string, opt *ListMembersOptions) ([]*User, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/orgs/members/#list-public-organization-members | ||||||
|  | func (s *OrganizationsService) ListMembers(ctx context.Context, org string, opts *ListMembersOptions) ([]*User, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if opt != nil && opt.PublicOnly { | 	if opts != nil && opts.PublicOnly { | ||||||
| 		u = fmt.Sprintf("orgs/%v/public_members", org) | 		u = fmt.Sprintf("orgs/%v/public_members", org) | ||||||
| 	} else { | 	} else { | ||||||
| 		u = fmt.Sprintf("orgs/%v/members", org) | 		u = fmt.Sprintf("orgs/%v/members", org) | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -100,7 +101,7 @@ func (s *OrganizationsService) ListMembers(ctx context.Context, org string, opt | |||||||
| 
 | 
 | ||||||
| // IsMember checks if a user is a member of an organization. | // IsMember checks if a user is a member of an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#check-membership | // GitHub API docs: https://developer.github.com/v3/orgs/members/#check-organization-membership-for-a-user | ||||||
| func (s *OrganizationsService) IsMember(ctx context.Context, org, user string) (bool, *Response, error) { | func (s *OrganizationsService) IsMember(ctx context.Context, org, user string) (bool, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/members/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/members/%v", org, user) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -115,7 +116,7 @@ func (s *OrganizationsService) IsMember(ctx context.Context, org, user string) ( | |||||||
| 
 | 
 | ||||||
| // IsPublicMember checks if a user is a public member of an organization. | // IsPublicMember checks if a user is a public member of an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#check-public-membership | // GitHub API docs: https://developer.github.com/v3/orgs/members/#check-public-organization-membership-for-a-user | ||||||
| func (s *OrganizationsService) IsPublicMember(ctx context.Context, org, user string) (bool, *Response, error) { | func (s *OrganizationsService) IsPublicMember(ctx context.Context, org, user string) (bool, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -130,7 +131,7 @@ func (s *OrganizationsService) IsPublicMember(ctx context.Context, org, user str | |||||||
| 
 | 
 | ||||||
| // RemoveMember removes a user from all teams of an organization. | // RemoveMember removes a user from all teams of an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#remove-a-member | // GitHub API docs: https://developer.github.com/v3/orgs/members/#remove-an-organization-member | ||||||
| func (s *OrganizationsService) RemoveMember(ctx context.Context, org, user string) (*Response, error) { | func (s *OrganizationsService) RemoveMember(ctx context.Context, org, user string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/members/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/members/%v", org, user) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -144,7 +145,7 @@ func (s *OrganizationsService) RemoveMember(ctx context.Context, org, user strin | |||||||
| // PublicizeMembership publicizes a user's membership in an organization. (A | // PublicizeMembership publicizes a user's membership in an organization. (A | ||||||
| // user cannot publicize the membership for another user.) | // user cannot publicize the membership for another user.) | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#publicize-a-users-membership | // GitHub API docs: https://developer.github.com/v3/orgs/members/#set-public-organization-membership-for-the-authenticated-user | ||||||
| func (s *OrganizationsService) PublicizeMembership(ctx context.Context, org, user string) (*Response, error) { | func (s *OrganizationsService) PublicizeMembership(ctx context.Context, org, user string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, nil) | 	req, err := s.client.NewRequest("PUT", u, nil) | ||||||
| @@ -157,7 +158,7 @@ func (s *OrganizationsService) PublicizeMembership(ctx context.Context, org, use | |||||||
| 
 | 
 | ||||||
| // ConcealMembership conceals a user's membership in an organization. | // ConcealMembership conceals a user's membership in an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#conceal-a-users-membership | // GitHub API docs: https://developer.github.com/v3/orgs/members/#remove-public-organization-membership-for-the-authenticated-user | ||||||
| func (s *OrganizationsService) ConcealMembership(ctx context.Context, org, user string) (*Response, error) { | func (s *OrganizationsService) ConcealMembership(ctx context.Context, org, user string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -180,10 +181,10 @@ type ListOrgMembershipsOptions struct { | |||||||
| 
 | 
 | ||||||
| // ListOrgMemberships lists the organization memberships for the authenticated user. | // ListOrgMemberships lists the organization memberships for the authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#list-your-organization-memberships | // GitHub API docs: https://developer.github.com/v3/orgs/members/#list-organization-memberships-for-the-authenticated-user | ||||||
| func (s *OrganizationsService) ListOrgMemberships(ctx context.Context, opt *ListOrgMembershipsOptions) ([]*Membership, *Response, error) { | func (s *OrganizationsService) ListOrgMemberships(ctx context.Context, opts *ListOrgMembershipsOptions) ([]*Membership, *Response, error) { | ||||||
| 	u := "user/memberships/orgs" | 	u := "user/memberships/orgs" | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -206,9 +207,8 @@ func (s *OrganizationsService) ListOrgMemberships(ctx context.Context, opt *List | |||||||
| // Passing an empty string for user will get the membership for the | // Passing an empty string for user will get the membership for the | ||||||
| // authenticated user. | // authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: | // GitHub API docs: https://developer.github.com/v3/orgs/members/#get-an-organization-membership-for-the-authenticated-user | ||||||
| // https://developer.github.com/v3/orgs/members/#get-organization-membership | // GitHub API docs: https://developer.github.com/v3/orgs/members/#get-organization-membership-for-a-user | ||||||
| // https://developer.github.com/v3/orgs/members/#get-your-organization-membership |  | ||||||
| func (s *OrganizationsService) GetOrgMembership(ctx context.Context, user, org string) (*Membership, *Response, error) { | func (s *OrganizationsService) GetOrgMembership(ctx context.Context, user, org string) (*Membership, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if user != "" { | 	if user != "" { | ||||||
| @@ -235,8 +235,8 @@ func (s *OrganizationsService) GetOrgMembership(ctx context.Context, user, org s | |||||||
| // Passing an empty string for user will edit the membership for the | // Passing an empty string for user will edit the membership for the | ||||||
| // authenticated user. | // authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#add-or-update-organization-membership | // GitHub API docs: https://developer.github.com/v3/orgs/members/#update-an-organization-membership-for-the-authenticated-user | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#edit-your-organization-membership | // GitHub API docs: https://developer.github.com/v3/orgs/members/#set-organization-membership-for-a-user | ||||||
| func (s *OrganizationsService) EditOrgMembership(ctx context.Context, user, org string, membership *Membership) (*Membership, *Response, error) { | func (s *OrganizationsService) EditOrgMembership(ctx context.Context, user, org string, membership *Membership) (*Membership, *Response, error) { | ||||||
| 	var u, method string | 	var u, method string | ||||||
| 	if user != "" { | 	if user != "" { | ||||||
| @@ -264,7 +264,7 @@ func (s *OrganizationsService) EditOrgMembership(ctx context.Context, user, org | |||||||
| // RemoveOrgMembership removes user from the specified organization. If the | // RemoveOrgMembership removes user from the specified organization. If the | ||||||
| // user has been invited to the organization, this will cancel their invitation. | // user has been invited to the organization, this will cancel their invitation. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#remove-organization-membership | // GitHub API docs: https://developer.github.com/v3/orgs/members/#remove-organization-membership-for-a-user | ||||||
| func (s *OrganizationsService) RemoveOrgMembership(ctx context.Context, user, org string) (*Response, error) { | func (s *OrganizationsService) RemoveOrgMembership(ctx context.Context, user, org string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/memberships/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/memberships/%v", org, user) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -278,9 +278,9 @@ func (s *OrganizationsService) RemoveOrgMembership(ctx context.Context, user, or | |||||||
| // ListPendingOrgInvitations returns a list of pending invitations. | // ListPendingOrgInvitations returns a list of pending invitations. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#list-pending-organization-invitations | // GitHub API docs: https://developer.github.com/v3/orgs/members/#list-pending-organization-invitations | ||||||
| func (s *OrganizationsService) ListPendingOrgInvitations(ctx context.Context, org string, opt *ListOptions) ([]*Invitation, *Response, error) { | func (s *OrganizationsService) ListPendingOrgInvitations(ctx context.Context, org string, opts *ListOptions) ([]*Invitation, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/invitations", org) | 	u := fmt.Sprintf("orgs/%v/invitations", org) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -322,18 +322,15 @@ type CreateOrgInvitationOptions struct { | |||||||
| // In order to create invitations in an organization, | // In order to create invitations in an organization, | ||||||
| // the authenticated user must be an organization owner. | // the authenticated user must be an organization owner. | ||||||
| // | // | ||||||
| // https://developer.github.com/v3/orgs/members/#create-organization-invitation | // GitHub API docs: https://developer.github.com/v3/orgs/members/#create-an-organization-invitation | ||||||
| func (s *OrganizationsService) CreateOrgInvitation(ctx context.Context, org string, opt *CreateOrgInvitationOptions) (*Invitation, *Response, error) { | func (s *OrganizationsService) CreateOrgInvitation(ctx context.Context, org string, opts *CreateOrgInvitationOptions) (*Invitation, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/invitations", org) | 	u := fmt.Sprintf("orgs/%v/invitations", org) | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("POST", u, opt) | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeOrganizationInvitationPreview) |  | ||||||
| 
 |  | ||||||
| 	var invitation *Invitation | 	var invitation *Invitation | ||||||
| 	resp, err := s.client.Do(ctx, req, &invitation) | 	resp, err := s.client.Do(ctx, req, &invitation) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -346,9 +343,9 @@ func (s *OrganizationsService) CreateOrgInvitation(ctx context.Context, org stri | |||||||
| // the authenticated user must be an organization owner. | // the authenticated user must be an organization owner. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/members/#list-organization-invitation-teams | // GitHub API docs: https://developer.github.com/v3/orgs/members/#list-organization-invitation-teams | ||||||
| func (s *OrganizationsService) ListOrgInvitationTeams(ctx context.Context, org, invitationID string, opt *ListOptions) ([]*Team, *Response, error) { | func (s *OrganizationsService) ListOrgInvitationTeams(ctx context.Context, org, invitationID string, opts *ListOptions) ([]*Team, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/invitations/%v/teams", org, invitationID) | 	u := fmt.Sprintf("orgs/%v/invitations/%v/teams", org, invitationID) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -358,9 +355,6 @@ func (s *OrganizationsService) ListOrgInvitationTeams(ctx context.Context, org, | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeOrganizationInvitationPreview) |  | ||||||
| 
 |  | ||||||
| 	var orgInvitationTeams []*Team | 	var orgInvitationTeams []*Team | ||||||
| 	resp, err := s.client.Do(ctx, req, &orgInvitationTeams) | 	resp, err := s.client.Do(ctx, req, &orgInvitationTeams) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -27,10 +27,10 @@ type ListOutsideCollaboratorsOptions struct { | |||||||
| // Warning: The API may change without advance notice during the preview period. | // Warning: The API may change without advance notice during the preview period. | ||||||
| // Preview features are not supported for production use. | // Preview features are not supported for production use. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/outside_collaborators/#list-outside-collaborators | // GitHub API docs: https://developer.github.com/v3/orgs/outside_collaborators/#list-outside-collaborators-for-an-organization | ||||||
| func (s *OrganizationsService) ListOutsideCollaborators(ctx context.Context, org string, opt *ListOutsideCollaboratorsOptions) ([]*User, *Response, error) { | func (s *OrganizationsService) ListOutsideCollaborators(ctx context.Context, org string, opts *ListOutsideCollaboratorsOptions) ([]*User, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/outside_collaborators", org) | 	u := fmt.Sprintf("orgs/%v/outside_collaborators", org) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -52,7 +52,7 @@ func (s *OrganizationsService) ListOutsideCollaborators(ctx context.Context, org | |||||||
| // RemoveOutsideCollaborator removes a user from the list of outside collaborators; | // RemoveOutsideCollaborator removes a user from the list of outside collaborators; | ||||||
| // consequently, removing them from all the organization's repositories. | // consequently, removing them from all the organization's repositories. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/outside_collaborators/#remove-outside-collaborator | // GitHub API docs: https://developer.github.com/v3/orgs/outside_collaborators/#remove-outside-collaborator-from-an-organization | ||||||
| func (s *OrganizationsService) RemoveOutsideCollaborator(ctx context.Context, org string, user string) (*Response, error) { | func (s *OrganizationsService) RemoveOutsideCollaborator(ctx context.Context, org string, user string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/outside_collaborators/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/outside_collaborators/%v", org, user) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -69,7 +69,7 @@ func (s *OrganizationsService) RemoveOutsideCollaborator(ctx context.Context, or | |||||||
| // Responses for converting a non-member or the last owner to an outside collaborator | // Responses for converting a non-member or the last owner to an outside collaborator | ||||||
| // are listed in GitHub API docs. | // are listed in GitHub API docs. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/outside_collaborators/#convert-member-to-outside-collaborator | // GitHub API docs: https://developer.github.com/v3/orgs/outside_collaborators/#convert-an-organization-member-to-outside-collaborator | ||||||
| func (s *OrganizationsService) ConvertMemberToOutsideCollaborator(ctx context.Context, org string, user string) (*Response, error) { | func (s *OrganizationsService) ConvertMemberToOutsideCollaborator(ctx context.Context, org string, user string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/outside_collaborators/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/outside_collaborators/%v", org, user) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, nil) | 	req, err := s.client.NewRequest("PUT", u, nil) | ||||||
| @@ -13,9 +13,9 @@ import ( | |||||||
| // ListProjects lists the projects for an organization. | // ListProjects lists the projects for an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/#list-organization-projects | // GitHub API docs: https://developer.github.com/v3/projects/#list-organization-projects | ||||||
| func (s *OrganizationsService) ListProjects(ctx context.Context, org string, opt *ProjectListOptions) ([]*Project, *Response, error) { | func (s *OrganizationsService) ListProjects(ctx context.Context, org string, opts *ProjectListOptions) ([]*Project, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/projects", org) | 	u := fmt.Sprintf("orgs/%v/projects", org) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -40,9 +40,9 @@ func (s *OrganizationsService) ListProjects(ctx context.Context, org string, opt | |||||||
| // CreateProject creates a GitHub Project for the specified organization. | // CreateProject creates a GitHub Project for the specified organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/#create-an-organization-project | // GitHub API docs: https://developer.github.com/v3/projects/#create-an-organization-project | ||||||
| func (s *OrganizationsService) CreateProject(ctx context.Context, org string, opt *ProjectOptions) (*Project, *Response, error) { | func (s *OrganizationsService) CreateProject(ctx context.Context, org string, opts *ProjectOptions) (*Project, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/projects", org) | 	u := fmt.Sprintf("orgs/%v/projects", org) | ||||||
| 	req, err := s.client.NewRequest("POST", u, opt) | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -12,10 +12,10 @@ import ( | |||||||
| 
 | 
 | ||||||
| // ListBlockedUsers lists all the users blocked by an organization. | // ListBlockedUsers lists all the users blocked by an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/blocking/#list-blocked-users | // GitHub API docs: https://developer.github.com/v3/orgs/blocking/#list-users-blocked-by-an-organization | ||||||
| func (s *OrganizationsService) ListBlockedUsers(ctx context.Context, org string, opt *ListOptions) ([]*User, *Response, error) { | func (s *OrganizationsService) ListBlockedUsers(ctx context.Context, org string, opts *ListOptions) ([]*User, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/blocks", org) | 	u := fmt.Sprintf("orgs/%v/blocks", org) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -39,7 +39,7 @@ func (s *OrganizationsService) ListBlockedUsers(ctx context.Context, org string, | |||||||
| 
 | 
 | ||||||
| // IsBlocked reports whether specified user is blocked from an organization. | // IsBlocked reports whether specified user is blocked from an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/blocking/#check-whether-a-user-is-blocked-from-an-organization | // GitHub API docs: https://developer.github.com/v3/orgs/blocking/#check-if-a-user-is-blocked-by-an-organization | ||||||
| func (s *OrganizationsService) IsBlocked(ctx context.Context, org string, user string) (bool, *Response, error) { | func (s *OrganizationsService) IsBlocked(ctx context.Context, org string, user string) (bool, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/blocks/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/blocks/%v", org, user) | ||||||
| 
 | 
 | ||||||
| @@ -58,7 +58,7 @@ func (s *OrganizationsService) IsBlocked(ctx context.Context, org string, user s | |||||||
| 
 | 
 | ||||||
| // BlockUser blocks specified user from an organization. | // BlockUser blocks specified user from an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/blocking/#block-a-user | // GitHub API docs: https://developer.github.com/v3/orgs/blocking/#block-a-user-from-an-organization | ||||||
| func (s *OrganizationsService) BlockUser(ctx context.Context, org string, user string) (*Response, error) { | func (s *OrganizationsService) BlockUser(ctx context.Context, org string, user string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/blocks/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/blocks/%v", org, user) | ||||||
| 
 | 
 | ||||||
| @@ -75,7 +75,7 @@ func (s *OrganizationsService) BlockUser(ctx context.Context, org string, user s | |||||||
| 
 | 
 | ||||||
| // UnblockUser unblocks specified user from an organization. | // UnblockUser unblocks specified user from an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/orgs/blocking/#unblock-a-user | // GitHub API docs: https://developer.github.com/v3/orgs/blocking/#unblock-a-user-from-an-organization | ||||||
| func (s *OrganizationsService) UnblockUser(ctx context.Context, org string, user string) (*Response, error) { | func (s *OrganizationsService) UnblockUser(ctx context.Context, org string, user string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/blocks/%v", org, user) | 	u := fmt.Sprintf("orgs/%v/blocks/%v", org, user) | ||||||
| 
 | 
 | ||||||
							
								
								
									
										101
									
								
								vendor/github.com/google/go-github/v32/github/packages.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								vendor/github.com/google/go-github/v32/github/packages.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | |||||||
|  | // Copyright 2020 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 | ||||||
|  |  | ||||||
|  | // Package represents a GitHub package. | ||||||
|  | type Package struct { | ||||||
|  | 	ID             *int64           `json:"id,omitempty"` | ||||||
|  | 	Name           *string          `json:"name,omitempty"` | ||||||
|  | 	PackageType    *string          `json:"package_type,omitempty"` | ||||||
|  | 	HTMLURL        *string          `json:"html_url,omitempty"` | ||||||
|  | 	CreatedAt      *Timestamp       `json:"created_at,omitempty"` | ||||||
|  | 	UpdatedAt      *Timestamp       `json:"updated_at,omitempty"` | ||||||
|  | 	Owner          *User            `json:"owner,omitempty"` | ||||||
|  | 	PackageVersion *PackageVersion  `json:"package_version,omitempty"` | ||||||
|  | 	Registry       *PackageRegistry `json:"registry,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (p Package) String() string { | ||||||
|  | 	return Stringify(p) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // PackageVersion represents a GitHub package version. | ||||||
|  | type PackageVersion struct { | ||||||
|  | 	ID                  *int64          `json:"id,omitempty"` | ||||||
|  | 	Version             *string         `json:"version,omitempty"` | ||||||
|  | 	Summary             *string         `json:"summary,omitempty"` | ||||||
|  | 	Body                *string         `json:"body,omitempty"` | ||||||
|  | 	BodyHTML            *string         `json:"body_html,omitempty"` | ||||||
|  | 	Release             *PackageRelease `json:"release,omitempty"` | ||||||
|  | 	Manifest            *string         `json:"manifest,omitempty"` | ||||||
|  | 	HTMLURL             *string         `json:"html_url,omitempty"` | ||||||
|  | 	TagName             *string         `json:"tag_name,omitempty"` | ||||||
|  | 	TargetCommitish     *string         `json:"target_commitish,omitempty"` | ||||||
|  | 	TargetOID           *string         `json:"target_oid,omitempty"` | ||||||
|  | 	Draft               *bool           `json:"draft,omitempty"` | ||||||
|  | 	Prerelease          *bool           `json:"prerelease,omitempty"` | ||||||
|  | 	CreatedAt           *Timestamp      `json:"created_at,omitempty"` | ||||||
|  | 	UpdatedAt           *Timestamp      `json:"updated_at,omitempty"` | ||||||
|  | 	PackageFiles        []*PackageFile  `json:"package_files,omitempty"` | ||||||
|  | 	Author              *User           `json:"author,omitempty"` | ||||||
|  | 	InstallationCommand *string         `json:"installation_command,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (pv PackageVersion) String() string { | ||||||
|  | 	return Stringify(pv) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // PackageRelease represents a GitHub package version release. | ||||||
|  | type PackageRelease struct { | ||||||
|  | 	URL             *string    `json:"url,omitempty"` | ||||||
|  | 	HTMLURL         *string    `json:"html_url,omitempty"` | ||||||
|  | 	ID              *int64     `json:"id,omitempty"` | ||||||
|  | 	TagName         *string    `json:"tag_name,omitempty"` | ||||||
|  | 	TargetCommitish *string    `json:"target_commitish,omitempty"` | ||||||
|  | 	Name            *string    `json:"name,omitempty"` | ||||||
|  | 	Draft           *bool      `json:"draft,omitempty"` | ||||||
|  | 	Author          *User      `json:"author,omitempty"` | ||||||
|  | 	Prerelease      *bool      `json:"prerelease,omitempty"` | ||||||
|  | 	CreatedAt       *Timestamp `json:"created_at,omitempty"` | ||||||
|  | 	PublishedAt     *Timestamp `json:"published_at,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (r PackageRelease) String() string { | ||||||
|  | 	return Stringify(r) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // PackageFile represents a GitHub package version release file. | ||||||
|  | type PackageFile struct { | ||||||
|  | 	DownloadURL *string    `json:"download_url,omitempty"` | ||||||
|  | 	ID          *int64     `json:"id,omitempty"` | ||||||
|  | 	Name        *string    `json:"name,omitempty"` | ||||||
|  | 	SHA256      *string    `json:"sha256,omitempty"` | ||||||
|  | 	SHA1        *string    `json:"sha1,omitempty"` | ||||||
|  | 	MD5         *string    `json:"md5,omitempty"` | ||||||
|  | 	ContentType *string    `json:"content_type,omitempty"` | ||||||
|  | 	State       *string    `json:"state,omitempty"` | ||||||
|  | 	Author      *User      `json:"author,omitempty"` | ||||||
|  | 	Size        *int64     `json:"size,omitempty"` | ||||||
|  | 	CreatedAt   *Timestamp `json:"created_at,omitempty"` | ||||||
|  | 	UpdatedAt   *Timestamp `json:"updated_at,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (pf PackageFile) String() string { | ||||||
|  | 	return Stringify(pf) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // PackageRegistry represents a GitHub package registry. | ||||||
|  | type PackageRegistry struct { | ||||||
|  | 	AboutURL *string `json:"about_url,omitempty"` | ||||||
|  | 	Name     *string `json:"name,omitempty"` | ||||||
|  | 	Type     *string `json:"type,omitempty"` | ||||||
|  | 	URL      *string `json:"url,omitempty"` | ||||||
|  | 	Vendor   *string `json:"vendor,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (r PackageRegistry) String() string { | ||||||
|  | 	return Stringify(r) | ||||||
|  | } | ||||||
| @@ -89,9 +89,9 @@ type ProjectOptions struct { | |||||||
| // UpdateProject updates a repository project. | // UpdateProject updates a repository project. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/#update-a-project | // GitHub API docs: https://developer.github.com/v3/projects/#update-a-project | ||||||
| func (s *ProjectsService) UpdateProject(ctx context.Context, id int64, opt *ProjectOptions) (*Project, *Response, error) { | func (s *ProjectsService) UpdateProject(ctx context.Context, id int64, opts *ProjectOptions) (*Project, *Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/%v", id) | 	u := fmt.Sprintf("projects/%v", id) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, opt) | 	req, err := s.client.NewRequest("PATCH", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -141,9 +141,9 @@ type ProjectColumn struct { | |||||||
| // ListProjectColumns lists the columns of a GitHub Project for a repo. | // ListProjectColumns lists the columns of a GitHub Project for a repo. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/columns/#list-project-columns | // GitHub API docs: https://developer.github.com/v3/projects/columns/#list-project-columns | ||||||
| func (s *ProjectsService) ListProjectColumns(ctx context.Context, projectID int64, opt *ListOptions) ([]*ProjectColumn, *Response, error) { | func (s *ProjectsService) ListProjectColumns(ctx context.Context, projectID int64, opts *ListOptions) ([]*ProjectColumn, *Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/%v/columns", projectID) | 	u := fmt.Sprintf("projects/%v/columns", projectID) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -198,9 +198,9 @@ type ProjectColumnOptions struct { | |||||||
| // CreateProjectColumn creates a column for the specified (by number) project. | // CreateProjectColumn creates a column for the specified (by number) project. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/columns/#create-a-project-column | // GitHub API docs: https://developer.github.com/v3/projects/columns/#create-a-project-column | ||||||
| func (s *ProjectsService) CreateProjectColumn(ctx context.Context, projectID int64, opt *ProjectColumnOptions) (*ProjectColumn, *Response, error) { | func (s *ProjectsService) CreateProjectColumn(ctx context.Context, projectID int64, opts *ProjectColumnOptions) (*ProjectColumn, *Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/%v/columns", projectID) | 	u := fmt.Sprintf("projects/%v/columns", projectID) | ||||||
| 	req, err := s.client.NewRequest("POST", u, opt) | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -220,9 +220,9 @@ func (s *ProjectsService) CreateProjectColumn(ctx context.Context, projectID int | |||||||
| // UpdateProjectColumn updates a column of a GitHub Project. | // UpdateProjectColumn updates a column of a GitHub Project. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/columns/#update-a-project-column | // GitHub API docs: https://developer.github.com/v3/projects/columns/#update-a-project-column | ||||||
| func (s *ProjectsService) UpdateProjectColumn(ctx context.Context, columnID int64, opt *ProjectColumnOptions) (*ProjectColumn, *Response, error) { | func (s *ProjectsService) UpdateProjectColumn(ctx context.Context, columnID int64, opts *ProjectColumnOptions) (*ProjectColumn, *Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/columns/%v", columnID) | 	u := fmt.Sprintf("projects/columns/%v", columnID) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, opt) | 	req, err := s.client.NewRequest("PATCH", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -266,9 +266,9 @@ type ProjectColumnMoveOptions struct { | |||||||
| // MoveProjectColumn moves a column within a GitHub Project. | // MoveProjectColumn moves a column within a GitHub Project. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/columns/#move-a-project-column | // GitHub API docs: https://developer.github.com/v3/projects/columns/#move-a-project-column | ||||||
| func (s *ProjectsService) MoveProjectColumn(ctx context.Context, columnID int64, opt *ProjectColumnMoveOptions) (*Response, error) { | func (s *ProjectsService) MoveProjectColumn(ctx context.Context, columnID int64, opts *ProjectColumnMoveOptions) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/columns/%v/moves", columnID) | 	u := fmt.Sprintf("projects/columns/%v/moves", columnID) | ||||||
| 	req, err := s.client.NewRequest("POST", u, opt) | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -317,9 +317,9 @@ type ProjectCardListOptions struct { | |||||||
| // ListProjectCards lists the cards in a column of a GitHub Project. | // ListProjectCards lists the cards in a column of a GitHub Project. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/cards/#list-project-cards | // GitHub API docs: https://developer.github.com/v3/projects/cards/#list-project-cards | ||||||
| func (s *ProjectsService) ListProjectCards(ctx context.Context, columnID int64, opt *ProjectCardListOptions) ([]*ProjectCard, *Response, error) { | func (s *ProjectsService) ListProjectCards(ctx context.Context, columnID int64, opts *ProjectCardListOptions) ([]*ProjectCard, *Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/columns/%v/cards", columnID) | 	u := fmt.Sprintf("projects/columns/%v/cards", columnID) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -344,8 +344,8 @@ func (s *ProjectsService) ListProjectCards(ctx context.Context, columnID int64, | |||||||
| // GetProjectCard gets a card in a column of a GitHub Project. | // GetProjectCard gets a card in a column of a GitHub Project. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/cards/#get-a-project-card | // GitHub API docs: https://developer.github.com/v3/projects/cards/#get-a-project-card | ||||||
| func (s *ProjectsService) GetProjectCard(ctx context.Context, columnID int64) (*ProjectCard, *Response, error) { | func (s *ProjectsService) GetProjectCard(ctx context.Context, cardID int64) (*ProjectCard, *Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/columns/cards/%v", columnID) | 	u := fmt.Sprintf("projects/columns/cards/%v", cardID) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| @@ -382,9 +382,9 @@ type ProjectCardOptions struct { | |||||||
| // CreateProjectCard creates a card in the specified column of a GitHub Project. | // CreateProjectCard creates a card in the specified column of a GitHub Project. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/cards/#create-a-project-card | // GitHub API docs: https://developer.github.com/v3/projects/cards/#create-a-project-card | ||||||
| func (s *ProjectsService) CreateProjectCard(ctx context.Context, columnID int64, opt *ProjectCardOptions) (*ProjectCard, *Response, error) { | func (s *ProjectsService) CreateProjectCard(ctx context.Context, columnID int64, opts *ProjectCardOptions) (*ProjectCard, *Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/columns/%v/cards", columnID) | 	u := fmt.Sprintf("projects/columns/%v/cards", columnID) | ||||||
| 	req, err := s.client.NewRequest("POST", u, opt) | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -404,9 +404,9 @@ func (s *ProjectsService) CreateProjectCard(ctx context.Context, columnID int64, | |||||||
| // UpdateProjectCard updates a card of a GitHub Project. | // UpdateProjectCard updates a card of a GitHub Project. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/cards/#update-a-project-card | // GitHub API docs: https://developer.github.com/v3/projects/cards/#update-a-project-card | ||||||
| func (s *ProjectsService) UpdateProjectCard(ctx context.Context, cardID int64, opt *ProjectCardOptions) (*ProjectCard, *Response, error) { | func (s *ProjectsService) UpdateProjectCard(ctx context.Context, cardID int64, opts *ProjectCardOptions) (*ProjectCard, *Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/columns/cards/%v", cardID) | 	u := fmt.Sprintf("projects/columns/cards/%v", cardID) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, opt) | 	req, err := s.client.NewRequest("PATCH", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -454,9 +454,9 @@ type ProjectCardMoveOptions struct { | |||||||
| // MoveProjectCard moves a card within a GitHub Project. | // MoveProjectCard moves a card within a GitHub Project. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/cards/#move-a-project-card | // GitHub API docs: https://developer.github.com/v3/projects/cards/#move-a-project-card | ||||||
| func (s *ProjectsService) MoveProjectCard(ctx context.Context, cardID int64, opt *ProjectCardMoveOptions) (*Response, error) { | func (s *ProjectsService) MoveProjectCard(ctx context.Context, cardID int64, opts *ProjectCardMoveOptions) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/columns/cards/%v/moves", cardID) | 	u := fmt.Sprintf("projects/columns/cards/%v/moves", cardID) | ||||||
| 	req, err := s.client.NewRequest("POST", u, opt) | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -483,10 +483,10 @@ type ProjectCollaboratorOptions struct { | |||||||
| // AddProjectCollaborator adds a collaborator to an organization project and sets | // AddProjectCollaborator adds a collaborator to an organization project and sets | ||||||
| // their permission level. You must be an organization owner or a project admin to add a collaborator. | // their permission level. You must be an organization owner or a project admin to add a collaborator. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/collaborators/#add-user-as-a-collaborator | // GitHub API docs: https://developer.github.com/v3/projects/collaborators/#add-project-collaborator | ||||||
| func (s *ProjectsService) AddProjectCollaborator(ctx context.Context, id int64, username string, opt *ProjectCollaboratorOptions) (*Response, error) { | func (s *ProjectsService) AddProjectCollaborator(ctx context.Context, id int64, username string, opts *ProjectCollaboratorOptions) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/%v/collaborators/%v", id, username) | 	u := fmt.Sprintf("projects/%v/collaborators/%v", id, username) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, opt) | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -500,7 +500,7 @@ func (s *ProjectsService) AddProjectCollaborator(ctx context.Context, id int64, | |||||||
| // RemoveProjectCollaborator removes a collaborator from an organization project. | // RemoveProjectCollaborator removes a collaborator from an organization project. | ||||||
| // You must be an organization owner or a project admin to remove a collaborator. | // You must be an organization owner or a project admin to remove a collaborator. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/collaborators/#remove-user-as-a-collaborator | // GitHub API docs: https://developer.github.com/v3/projects/collaborators/#remove-project-collaborator | ||||||
| func (s *ProjectsService) RemoveProjectCollaborator(ctx context.Context, id int64, username string) (*Response, error) { | func (s *ProjectsService) RemoveProjectCollaborator(ctx context.Context, id int64, username string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/%v/collaborators/%v", id, username) | 	u := fmt.Sprintf("projects/%v/collaborators/%v", id, username) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -536,10 +536,10 @@ type ListCollaboratorOptions struct { | |||||||
| // with access through default organization permissions, and organization owners. You must be an | // with access through default organization permissions, and organization owners. You must be an | ||||||
| // organization owner or a project admin to list collaborators. | // organization owner or a project admin to list collaborators. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/collaborators/#list-collaborators | // GitHub API docs: https://developer.github.com/v3/projects/collaborators/#list-project-collaborators | ||||||
| func (s *ProjectsService) ListProjectCollaborators(ctx context.Context, id int64, opt *ListCollaboratorOptions) ([]*User, *Response, error) { | func (s *ProjectsService) ListProjectCollaborators(ctx context.Context, id int64, opts *ListCollaboratorOptions) ([]*User, *Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/%v/collaborators", id) | 	u := fmt.Sprintf("projects/%v/collaborators", id) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -574,7 +574,7 @@ type ProjectPermissionLevel struct { | |||||||
| // project. Possible values for the permission key: "admin", "write", "read", "none". | // project. Possible values for the permission key: "admin", "write", "read", "none". | ||||||
| // You must be an organization owner or a project admin to review a user's permission level. | // You must be an organization owner or a project admin to review a user's permission level. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/collaborators/#review-a-users-permission-level | // GitHub API docs: https://developer.github.com/v3/projects/collaborators/#get-project-permission-for-a-user | ||||||
| func (s *ProjectsService) ReviewProjectCollaboratorPermission(ctx context.Context, id int64, username string) (*ProjectPermissionLevel, *Response, error) { | func (s *ProjectsService) ReviewProjectCollaboratorPermission(ctx context.Context, id int64, username string) (*ProjectPermissionLevel, *Response, error) { | ||||||
| 	u := fmt.Sprintf("projects/%v/collaborators/%v/permission", id, username) | 	u := fmt.Sprintf("projects/%v/collaborators/%v/permission", id, username) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -24,6 +24,7 @@ type PullRequest struct { | |||||||
| 	ID                  *int64     `json:"id,omitempty"` | 	ID                  *int64     `json:"id,omitempty"` | ||||||
| 	Number              *int       `json:"number,omitempty"` | 	Number              *int       `json:"number,omitempty"` | ||||||
| 	State               *string    `json:"state,omitempty"` | 	State               *string    `json:"state,omitempty"` | ||||||
|  | 	Locked              *bool      `json:"locked,omitempty"` | ||||||
| 	Title               *string    `json:"title,omitempty"` | 	Title               *string    `json:"title,omitempty"` | ||||||
| 	Body                *string    `json:"body,omitempty"` | 	Body                *string    `json:"body,omitempty"` | ||||||
| 	CreatedAt           *time.Time `json:"created_at,omitempty"` | 	CreatedAt           *time.Time `json:"created_at,omitempty"` | ||||||
| @@ -38,6 +39,7 @@ type PullRequest struct { | |||||||
| 	MergeableState      *string    `json:"mergeable_state,omitempty"` | 	MergeableState      *string    `json:"mergeable_state,omitempty"` | ||||||
| 	MergedBy            *User      `json:"merged_by,omitempty"` | 	MergedBy            *User      `json:"merged_by,omitempty"` | ||||||
| 	MergeCommitSHA      *string    `json:"merge_commit_sha,omitempty"` | 	MergeCommitSHA      *string    `json:"merge_commit_sha,omitempty"` | ||||||
|  | 	Rebaseable          *bool      `json:"rebaseable,omitempty"` | ||||||
| 	Comments            *int       `json:"comments,omitempty"` | 	Comments            *int       `json:"comments,omitempty"` | ||||||
| 	Commits             *int       `json:"commits,omitempty"` | 	Commits             *int       `json:"commits,omitempty"` | ||||||
| 	Additions           *int       `json:"additions,omitempty"` | 	Additions           *int       `json:"additions,omitempty"` | ||||||
| @@ -134,9 +136,9 @@ type PullRequestListOptions struct { | |||||||
| // List the pull requests for the specified repository. | // List the pull requests for the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/#list-pull-requests | // GitHub API docs: https://developer.github.com/v3/pulls/#list-pull-requests | ||||||
| func (s *PullRequestsService) List(ctx context.Context, owner string, repo string, opt *PullRequestListOptions) ([]*PullRequest, *Response, error) { | func (s *PullRequestsService) List(ctx context.Context, owner string, repo string, opts *PullRequestListOptions) ([]*PullRequest, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/pulls", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -147,7 +149,7 @@ func (s *PullRequestsService) List(ctx context.Context, owner string, repo strin | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
| 	acceptHeaders := []string{mediaTypeLabelDescriptionSearchPreview, mediaTypeLockReasonPreview, mediaTypeDraftPreview} | 	acceptHeaders := []string{mediaTypeLockReasonPreview} | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 
 | 
 | ||||||
| 	var pulls []*PullRequest | 	var pulls []*PullRequest | ||||||
| @@ -159,9 +161,38 @@ func (s *PullRequestsService) List(ctx context.Context, owner string, repo strin | |||||||
| 	return pulls, resp, nil | 	return pulls, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // ListPullRequestsWithCommit returns pull requests associated with a commit SHA. | ||||||
|  | // | ||||||
|  | // The results will include open and closed pull requests. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/commits/#list-pull-requests-associated-with-a-commit | ||||||
|  | func (s *PullRequestsService) ListPullRequestsWithCommit(ctx context.Context, owner, repo, sha string, opts *PullRequestListOptions) ([]*PullRequest, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/commits/%v/pulls", owner, repo, sha) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	acceptHeaders := []string{mediaTypeListPullsOrBranchesForCommitPreview, mediaTypeLockReasonPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  | 	var pulls []*PullRequest | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &pulls) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return pulls, resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Get a single pull request. | // Get a single pull request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/#get-a-single-pull-request | // GitHub API docs: https://developer.github.com/v3/pulls/#get-a-pull-request | ||||||
| func (s *PullRequestsService) Get(ctx context.Context, owner string, repo string, number int) (*PullRequest, *Response, error) { | func (s *PullRequestsService) Get(ctx context.Context, owner string, repo string, number int) (*PullRequest, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -170,7 +201,7 @@ func (s *PullRequestsService) Get(ctx context.Context, owner string, repo string | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
| 	acceptHeaders := []string{mediaTypeLabelDescriptionSearchPreview, mediaTypeLockReasonPreview, mediaTypeDraftPreview} | 	acceptHeaders := []string{mediaTypeLockReasonPreview} | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 
 | 
 | ||||||
| 	pull := new(PullRequest) | 	pull := new(PullRequest) | ||||||
| @@ -183,20 +214,22 @@ func (s *PullRequestsService) Get(ctx context.Context, owner string, repo string | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetRaw gets a single pull request in raw (diff or patch) format. | // GetRaw gets a single pull request in raw (diff or patch) format. | ||||||
| func (s *PullRequestsService) GetRaw(ctx context.Context, owner string, repo string, number int, opt RawOptions) (string, *Response, error) { | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/pulls/#get-a-pull-request | ||||||
|  | func (s *PullRequestsService) GetRaw(ctx context.Context, owner string, repo string, number int, opts RawOptions) (string, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", nil, err | 		return "", nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	switch opt.Type { | 	switch opts.Type { | ||||||
| 	case Diff: | 	case Diff: | ||||||
| 		req.Header.Set("Accept", mediaTypeV3Diff) | 		req.Header.Set("Accept", mediaTypeV3Diff) | ||||||
| 	case Patch: | 	case Patch: | ||||||
| 		req.Header.Set("Accept", mediaTypeV3Patch) | 		req.Header.Set("Accept", mediaTypeV3Patch) | ||||||
| 	default: | 	default: | ||||||
| 		return "", nil, fmt.Errorf("unsupported raw type %d", opt.Type) | 		return "", nil, fmt.Errorf("unsupported raw type %d", opts.Type) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var buf bytes.Buffer | 	var buf bytes.Buffer | ||||||
| @@ -216,6 +249,7 @@ type NewPullRequest struct { | |||||||
| 	Body                *string `json:"body,omitempty"` | 	Body                *string `json:"body,omitempty"` | ||||||
| 	Issue               *int    `json:"issue,omitempty"` | 	Issue               *int    `json:"issue,omitempty"` | ||||||
| 	MaintainerCanModify *bool   `json:"maintainer_can_modify,omitempty"` | 	MaintainerCanModify *bool   `json:"maintainer_can_modify,omitempty"` | ||||||
|  | 	Draft               *bool   `json:"draft,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Create a new pull request on the specified repository. | // Create a new pull request on the specified repository. | ||||||
| @@ -228,9 +262,6 @@ func (s *PullRequestsService) Create(ctx context.Context, owner string, repo str | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 
 |  | ||||||
| 	p := new(PullRequest) | 	p := new(PullRequest) | ||||||
| 	resp, err := s.client.Do(ctx, req, p) | 	resp, err := s.client.Do(ctx, req, p) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -240,6 +271,49 @@ func (s *PullRequestsService) Create(ctx context.Context, owner string, repo str | |||||||
| 	return p, resp, nil | 	return p, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // PullRequestBranchUpdateOptions specifies the optional parameters to the | ||||||
|  | // PullRequestsService.UpdateBranch method. | ||||||
|  | type PullRequestBranchUpdateOptions struct { | ||||||
|  | 	// ExpectedHeadSHA specifies the most recent commit on the pull request's branch. | ||||||
|  | 	// Default value is the SHA of the pull request's current HEAD ref. | ||||||
|  | 	ExpectedHeadSHA *string `json:"expected_head_sha,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // PullRequestBranchUpdateResponse specifies the response of pull request branch update. | ||||||
|  | type PullRequestBranchUpdateResponse struct { | ||||||
|  | 	Message *string `json:"message,omitempty"` | ||||||
|  | 	URL     *string `json:"url,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UpdateBranch updates the pull request branch with latest upstream changes. | ||||||
|  | // | ||||||
|  | // This method might return an AcceptedError and a status code of | ||||||
|  | // 202. This is because this is the status that GitHub returns to signify that | ||||||
|  | // it has now scheduled the update of the pull request branch in a background task. | ||||||
|  | // A follow up request, after a delay of a second or so, should result | ||||||
|  | // in a successful request. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/pulls/#update-a-pull-request-branch | ||||||
|  | func (s *PullRequestsService) UpdateBranch(ctx context.Context, owner, repo string, number int, opts *PullRequestBranchUpdateOptions) (*PullRequestBranchUpdateResponse, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/update-branch", owner, repo, number) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeUpdatePullRequestBranchPreview) | ||||||
|  | 
 | ||||||
|  | 	p := new(PullRequestBranchUpdateResponse) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return p, resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type pullRequestUpdate struct { | type pullRequestUpdate struct { | ||||||
| 	Title               *string `json:"title,omitempty"` | 	Title               *string `json:"title,omitempty"` | ||||||
| 	Body                *string `json:"body,omitempty"` | 	Body                *string `json:"body,omitempty"` | ||||||
| @@ -268,7 +342,10 @@ func (s *PullRequestsService) Edit(ctx context.Context, owner string, repo strin | |||||||
| 		State:               pull.State, | 		State:               pull.State, | ||||||
| 		MaintainerCanModify: pull.MaintainerCanModify, | 		MaintainerCanModify: pull.MaintainerCanModify, | ||||||
| 	} | 	} | ||||||
| 	if pull.Base != nil { | 	// avoid updating the base branch when closing the Pull Request | ||||||
|  | 	// - otherwise the GitHub API server returns a "Validation Failed" error: | ||||||
|  | 	// "Cannot change base branch of closed pull request". | ||||||
|  | 	if pull.Base != nil && pull.GetState() != "closed" { | ||||||
| 		update.Base = pull.Base.Ref | 		update.Base = pull.Base.Ref | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @@ -278,7 +355,7 @@ func (s *PullRequestsService) Edit(ctx context.Context, owner string, repo strin | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
| 	acceptHeaders := []string{mediaTypeLabelDescriptionSearchPreview, mediaTypeLockReasonPreview} | 	acceptHeaders := []string{mediaTypeLockReasonPreview} | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 
 | 
 | ||||||
| 	p := new(PullRequest) | 	p := new(PullRequest) | ||||||
| @@ -293,9 +370,9 @@ func (s *PullRequestsService) Edit(ctx context.Context, owner string, repo strin | |||||||
| // ListCommits lists the commits in a pull request. | // ListCommits lists the commits in a pull request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/#list-commits-on-a-pull-request | // GitHub API docs: https://developer.github.com/v3/pulls/#list-commits-on-a-pull-request | ||||||
| func (s *PullRequestsService) ListCommits(ctx context.Context, owner string, repo string, number int, opt *ListOptions) ([]*RepositoryCommit, *Response, error) { | func (s *PullRequestsService) ListCommits(ctx context.Context, owner string, repo string, number int, opts *ListOptions) ([]*RepositoryCommit, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/commits", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/commits", owner, repo, number) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -317,9 +394,9 @@ func (s *PullRequestsService) ListCommits(ctx context.Context, owner string, rep | |||||||
| // ListFiles lists the files in a pull request. | // ListFiles lists the files in a pull request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/#list-pull-requests-files | // GitHub API docs: https://developer.github.com/v3/pulls/#list-pull-requests-files | ||||||
| func (s *PullRequestsService) ListFiles(ctx context.Context, owner string, repo string, number int, opt *ListOptions) ([]*CommitFile, *Response, error) { | func (s *PullRequestsService) ListFiles(ctx context.Context, owner string, repo string, number int, opts *ListOptions) ([]*CommitFile, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/files", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/files", owner, repo, number) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -340,7 +417,7 @@ func (s *PullRequestsService) ListFiles(ctx context.Context, owner string, repo | |||||||
| 
 | 
 | ||||||
| // IsMerged checks if a pull request has been merged. | // IsMerged checks if a pull request has been merged. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/#get-if-a-pull-request-has-been-merged | // GitHub API docs: https://developer.github.com/v3/pulls/#check-if-a-pull-request-has-been-merged | ||||||
| func (s *PullRequestsService) IsMerged(ctx context.Context, owner string, repo string, number int) (bool, *Response, error) { | func (s *PullRequestsService) IsMerged(ctx context.Context, owner string, repo string, number int) (bool, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/merge", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/merge", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -362,7 +439,7 @@ type PullRequestMergeResult struct { | |||||||
| 
 | 
 | ||||||
| // PullRequestOptions lets you define how a pull request will be merged. | // PullRequestOptions lets you define how a pull request will be merged. | ||||||
| type PullRequestOptions struct { | type PullRequestOptions struct { | ||||||
| 	CommitTitle string // Extra detail to append to automatic commit message. (Optional.) | 	CommitTitle string // Title for the automatic commit message. (Optional.) | ||||||
| 	SHA         string // SHA that pull request head must match to allow merge. (Optional.) | 	SHA         string // SHA that pull request head must match to allow merge. (Optional.) | ||||||
| 
 | 
 | ||||||
| 	// The merge method to use. Possible values include: "merge", "squash", and "rebase" with the default being merge. (Optional.) | 	// The merge method to use. Possible values include: "merge", "squash", and "rebase" with the default being merge. (Optional.) | ||||||
| @@ -370,16 +447,16 @@ type PullRequestOptions struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type pullRequestMergeRequest struct { | type pullRequestMergeRequest struct { | ||||||
| 	CommitMessage string `json:"commit_message"` | 	CommitMessage string `json:"commit_message,omitempty"` | ||||||
| 	CommitTitle   string `json:"commit_title,omitempty"` | 	CommitTitle   string `json:"commit_title,omitempty"` | ||||||
| 	MergeMethod   string `json:"merge_method,omitempty"` | 	MergeMethod   string `json:"merge_method,omitempty"` | ||||||
| 	SHA           string `json:"sha,omitempty"` | 	SHA           string `json:"sha,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Merge a pull request (Merge Button™). | // Merge a pull request. | ||||||
| // commitMessage is the title for the automatic commit message. | // commitMessage is an extra detail to append to automatic commit message. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-buttontrade | // GitHub API docs: https://developer.github.com/v3/pulls/#merge-a-pull-request | ||||||
| func (s *PullRequestsService) Merge(ctx context.Context, owner string, repo string, number int, commitMessage string, options *PullRequestOptions) (*PullRequestMergeResult, *Response, error) { | func (s *PullRequestsService) Merge(ctx context.Context, owner string, repo string, number int, commitMessage string, options *PullRequestOptions) (*PullRequestMergeResult, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/merge", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/merge", owner, repo, number) | ||||||
| 
 | 
 | ||||||
| @@ -8,12 +8,14 @@ package github | |||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // PullRequestComment represents a comment left on a pull request. | // PullRequestComment represents a comment left on a pull request. | ||||||
| type PullRequestComment struct { | type PullRequestComment struct { | ||||||
| 	ID                  *int64     `json:"id,omitempty"` | 	ID                  *int64     `json:"id,omitempty"` | ||||||
|  | 	NodeID              *string    `json:"node_id,omitempty"` | ||||||
| 	InReplyTo           *int64     `json:"in_reply_to_id,omitempty"` | 	InReplyTo           *int64     `json:"in_reply_to_id,omitempty"` | ||||||
| 	Body                *string    `json:"body,omitempty"` | 	Body                *string    `json:"body,omitempty"` | ||||||
| 	Path                *string    `json:"path,omitempty"` | 	Path                *string    `json:"path,omitempty"` | ||||||
| @@ -21,6 +23,12 @@ type PullRequestComment struct { | |||||||
| 	PullRequestReviewID *int64     `json:"pull_request_review_id,omitempty"` | 	PullRequestReviewID *int64     `json:"pull_request_review_id,omitempty"` | ||||||
| 	Position            *int       `json:"position,omitempty"` | 	Position            *int       `json:"position,omitempty"` | ||||||
| 	OriginalPosition    *int       `json:"original_position,omitempty"` | 	OriginalPosition    *int       `json:"original_position,omitempty"` | ||||||
|  | 	StartLine           *int       `json:"start_line,omitempty"` | ||||||
|  | 	Line                *int       `json:"line,omitempty"` | ||||||
|  | 	OriginalLine        *int       `json:"original_line,omitempty"` | ||||||
|  | 	OriginalStartLine   *int       `json:"original_start_line,omitempty"` | ||||||
|  | 	Side                *string    `json:"side,omitempty"` | ||||||
|  | 	StartSide           *string    `json:"start_side,omitempty"` | ||||||
| 	CommitID            *string    `json:"commit_id,omitempty"` | 	CommitID            *string    `json:"commit_id,omitempty"` | ||||||
| 	OriginalCommitID    *string    `json:"original_commit_id,omitempty"` | 	OriginalCommitID    *string    `json:"original_commit_id,omitempty"` | ||||||
| 	User                *User      `json:"user,omitempty"` | 	User                *User      `json:"user,omitempty"` | ||||||
| @@ -58,15 +66,16 @@ type PullRequestListCommentsOptions struct { | |||||||
| // pull request number of 0 will return all comments on all pull requests for | // pull request number of 0 will return all comments on all pull requests for | ||||||
| // the repository. | // the repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/comments/#list-comments-on-a-pull-request | // GitHub API docs: https://developer.github.com/v3/pulls/comments/#list-review-comments-on-a-pull-request | ||||||
| func (s *PullRequestsService) ListComments(ctx context.Context, owner string, repo string, number int, opt *PullRequestListCommentsOptions) ([]*PullRequestComment, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/pulls/comments/#list-review-comments-in-a-repository | ||||||
|  | func (s *PullRequestsService) ListComments(ctx context.Context, owner string, repo string, number int, opts *PullRequestListCommentsOptions) ([]*PullRequestComment, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if number == 0 { | 	if number == 0 { | ||||||
| 		u = fmt.Sprintf("repos/%v/%v/pulls/comments", owner, repo) | 		u = fmt.Sprintf("repos/%v/%v/pulls/comments", owner, repo) | ||||||
| 	} else { | 	} else { | ||||||
| 		u = fmt.Sprintf("repos/%v/%v/pulls/%d/comments", owner, repo, number) | 		u = fmt.Sprintf("repos/%v/%v/pulls/%d/comments", owner, repo, number) | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -77,7 +86,8 @@ func (s *PullRequestsService) ListComments(ctx context.Context, owner string, re | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
| 	req.Header.Set("Accept", mediaTypeReactionsPreview) | 	acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeMultiLineCommentsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 
 | 
 | ||||||
| 	var comments []*PullRequestComment | 	var comments []*PullRequestComment | ||||||
| 	resp, err := s.client.Do(ctx, req, &comments) | 	resp, err := s.client.Do(ctx, req, &comments) | ||||||
| @@ -90,7 +100,7 @@ func (s *PullRequestsService) ListComments(ctx context.Context, owner string, re | |||||||
| 
 | 
 | ||||||
| // GetComment fetches the specified pull request comment. | // GetComment fetches the specified pull request comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/comments/#get-a-single-comment | // GitHub API docs: https://developer.github.com/v3/pulls/comments/#get-a-review-comment-for-a-pull-request | ||||||
| func (s *PullRequestsService) GetComment(ctx context.Context, owner string, repo string, commentID int64) (*PullRequestComment, *Response, error) { | func (s *PullRequestsService) GetComment(ctx context.Context, owner string, repo string, commentID int64) (*PullRequestComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, commentID) | 	u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, commentID) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -99,7 +109,8 @@ func (s *PullRequestsService) GetComment(ctx context.Context, owner string, repo | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
| 	req.Header.Set("Accept", mediaTypeReactionsPreview) | 	acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeMultiLineCommentsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 
 | 
 | ||||||
| 	comment := new(PullRequestComment) | 	comment := new(PullRequestComment) | ||||||
| 	resp, err := s.client.Do(ctx, req, comment) | 	resp, err := s.client.Do(ctx, req, comment) | ||||||
| @@ -112,13 +123,16 @@ func (s *PullRequestsService) GetComment(ctx context.Context, owner string, repo | |||||||
| 
 | 
 | ||||||
| // CreateComment creates a new comment on the specified pull request. | // CreateComment creates a new comment on the specified pull request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/comments/#create-a-comment | // GitHub API docs: https://developer.github.com/v3/pulls/comments/#create-a-review-comment-for-a-pull-request | ||||||
| func (s *PullRequestsService) CreateComment(ctx context.Context, owner string, repo string, number int, comment *PullRequestComment) (*PullRequestComment, *Response, error) { | func (s *PullRequestsService) CreateComment(ctx context.Context, owner string, repo string, number int, comment *PullRequestComment) (*PullRequestComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/comments", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/comments", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("POST", u, comment) | 	req, err := s.client.NewRequest("POST", u, comment) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
|  | 	// TODO: remove custom Accept headers when their respective API fully launches. | ||||||
|  | 	acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeMultiLineCommentsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 
 | 
 | ||||||
| 	c := new(PullRequestComment) | 	c := new(PullRequestComment) | ||||||
| 	resp, err := s.client.Do(ctx, req, c) | 	resp, err := s.client.Do(ctx, req, c) | ||||||
| @@ -131,7 +145,7 @@ func (s *PullRequestsService) CreateComment(ctx context.Context, owner string, r | |||||||
| 
 | 
 | ||||||
| // CreateCommentInReplyTo creates a new comment as a reply to an existing pull request comment. | // CreateCommentInReplyTo creates a new comment as a reply to an existing pull request comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/comments/#alternative-input | // GitHub API docs: https://developer.github.com/v3/pulls/comments/#create-a-review-comment-for-a-pull-request | ||||||
| func (s *PullRequestsService) CreateCommentInReplyTo(ctx context.Context, owner string, repo string, number int, body string, commentID int64) (*PullRequestComment, *Response, error) { | func (s *PullRequestsService) CreateCommentInReplyTo(ctx context.Context, owner string, repo string, number int, body string, commentID int64) (*PullRequestComment, *Response, error) { | ||||||
| 	comment := &struct { | 	comment := &struct { | ||||||
| 		Body      string `json:"body,omitempty"` | 		Body      string `json:"body,omitempty"` | ||||||
| @@ -158,7 +172,7 @@ func (s *PullRequestsService) CreateCommentInReplyTo(ctx context.Context, owner | |||||||
| // EditComment updates a pull request comment. | // EditComment updates a pull request comment. | ||||||
| // A non-nil comment.Body must be provided. Other comment fields should be left nil. | // A non-nil comment.Body must be provided. Other comment fields should be left nil. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/comments/#edit-a-comment | // GitHub API docs: https://developer.github.com/v3/pulls/comments/#update-a-review-comment-for-a-pull-request | ||||||
| func (s *PullRequestsService) EditComment(ctx context.Context, owner string, repo string, commentID int64, comment *PullRequestComment) (*PullRequestComment, *Response, error) { | func (s *PullRequestsService) EditComment(ctx context.Context, owner string, repo string, commentID int64, comment *PullRequestComment) (*PullRequestComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, commentID) | 	u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, commentID) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, comment) | 	req, err := s.client.NewRequest("PATCH", u, comment) | ||||||
| @@ -177,7 +191,7 @@ func (s *PullRequestsService) EditComment(ctx context.Context, owner string, rep | |||||||
| 
 | 
 | ||||||
| // DeleteComment deletes a pull request comment. | // DeleteComment deletes a pull request comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/comments/#delete-a-comment | // GitHub API docs: https://developer.github.com/v3/pulls/comments/#delete-a-review-comment-for-a-pull-request | ||||||
| func (s *PullRequestsService) DeleteComment(ctx context.Context, owner string, repo string, commentID int64) (*Response, error) { | func (s *PullRequestsService) DeleteComment(ctx context.Context, owner string, repo string, commentID int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, commentID) | 	u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, commentID) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -12,6 +12,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| // ReviewersRequest specifies users and teams for a pull request review request. | // ReviewersRequest specifies users and teams for a pull request review request. | ||||||
| type ReviewersRequest struct { | type ReviewersRequest struct { | ||||||
|  | 	NodeID        *string  `json:"node_id,omitempty"` | ||||||
| 	Reviewers     []string `json:"reviewers,omitempty"` | 	Reviewers     []string `json:"reviewers,omitempty"` | ||||||
| 	TeamReviewers []string `json:"team_reviewers,omitempty"` | 	TeamReviewers []string `json:"team_reviewers,omitempty"` | ||||||
| } | } | ||||||
| @@ -24,7 +25,7 @@ type Reviewers struct { | |||||||
| 
 | 
 | ||||||
| // RequestReviewers creates a review request for the provided reviewers for the specified pull request. | // RequestReviewers creates a review request for the provided reviewers for the specified pull request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/review_requests/#create-a-review-request | // GitHub API docs: https://developer.github.com/v3/pulls/review_requests/#request-reviewers-for-a-pull-request | ||||||
| func (s *PullRequestsService) RequestReviewers(ctx context.Context, owner, repo string, number int, reviewers ReviewersRequest) (*PullRequest, *Response, error) { | func (s *PullRequestsService) RequestReviewers(ctx context.Context, owner, repo string, number int, reviewers ReviewersRequest) (*PullRequest, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/pulls/%d/requested_reviewers", owner, repo, number) | 	u := fmt.Sprintf("repos/%s/%s/pulls/%d/requested_reviewers", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("POST", u, &reviewers) | 	req, err := s.client.NewRequest("POST", u, &reviewers) | ||||||
| @@ -43,10 +44,10 @@ func (s *PullRequestsService) RequestReviewers(ctx context.Context, owner, repo | |||||||
| 
 | 
 | ||||||
| // ListReviewers lists reviewers whose reviews have been requested on the specified pull request. | // ListReviewers lists reviewers whose reviews have been requested on the specified pull request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/review_requests/#list-review-requests | // GitHub API docs: https://developer.github.com/v3/pulls/review_requests/#list-requested-reviewers-for-a-pull-request | ||||||
| func (s *PullRequestsService) ListReviewers(ctx context.Context, owner, repo string, number int, opt *ListOptions) (*Reviewers, *Response, error) { | func (s *PullRequestsService) ListReviewers(ctx context.Context, owner, repo string, number int, opts *ListOptions) (*Reviewers, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/requested_reviewers", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/requested_reviewers", owner, repo, number) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -67,7 +68,7 @@ func (s *PullRequestsService) ListReviewers(ctx context.Context, owner, repo str | |||||||
| 
 | 
 | ||||||
| // RemoveReviewers removes the review request for the provided reviewers for the specified pull request. | // RemoveReviewers removes the review request for the provided reviewers for the specified pull request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/review_requests/#delete-a-review-request | // GitHub API docs: https://developer.github.com/v3/pulls/review_requests/#remove-requested-reviewers-from-a-pull-request | ||||||
| func (s *PullRequestsService) RemoveReviewers(ctx context.Context, owner, repo string, number int, reviewers ReviewersRequest) (*Response, error) { | func (s *PullRequestsService) RemoveReviewers(ctx context.Context, owner, repo string, number int, reviewers ReviewersRequest) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/pulls/%d/requested_reviewers", owner, repo, number) | 	u := fmt.Sprintf("repos/%s/%s/pulls/%d/requested_reviewers", owner, repo, number) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, &reviewers) | 	req, err := s.client.NewRequest("DELETE", u, &reviewers) | ||||||
| @@ -7,13 +7,17 @@ package github | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"time" | 	"time" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var ErrMixedCommentStyles = errors.New("cannot use both position and side/line form comments") | ||||||
|  | 
 | ||||||
| // PullRequestReview represents a review of a pull request. | // PullRequestReview represents a review of a pull request. | ||||||
| type PullRequestReview struct { | type PullRequestReview struct { | ||||||
| 	ID             *int64     `json:"id,omitempty"` | 	ID             *int64     `json:"id,omitempty"` | ||||||
|  | 	NodeID         *string    `json:"node_id,omitempty"` | ||||||
| 	User           *User      `json:"user,omitempty"` | 	User           *User      `json:"user,omitempty"` | ||||||
| 	Body           *string    `json:"body,omitempty"` | 	Body           *string    `json:"body,omitempty"` | ||||||
| 	SubmittedAt    *time.Time `json:"submitted_at,omitempty"` | 	SubmittedAt    *time.Time `json:"submitted_at,omitempty"` | ||||||
| @@ -21,6 +25,9 @@ type PullRequestReview struct { | |||||||
| 	HTMLURL        *string    `json:"html_url,omitempty"` | 	HTMLURL        *string    `json:"html_url,omitempty"` | ||||||
| 	PullRequestURL *string    `json:"pull_request_url,omitempty"` | 	PullRequestURL *string    `json:"pull_request_url,omitempty"` | ||||||
| 	State          *string    `json:"state,omitempty"` | 	State          *string    `json:"state,omitempty"` | ||||||
|  | 	// AuthorAssociation is the comment author's relationship to the issue's repository. | ||||||
|  | 	// Possible values are "COLLABORATOR", "CONTRIBUTOR", "FIRST_TIMER", "FIRST_TIME_CONTRIBUTOR", "MEMBER", "OWNER", or "NONE". | ||||||
|  | 	AuthorAssociation *string `json:"author_association,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (p PullRequestReview) String() string { | func (p PullRequestReview) String() string { | ||||||
| @@ -32,6 +39,12 @@ type DraftReviewComment struct { | |||||||
| 	Path     *string `json:"path,omitempty"` | 	Path     *string `json:"path,omitempty"` | ||||||
| 	Position *int    `json:"position,omitempty"` | 	Position *int    `json:"position,omitempty"` | ||||||
| 	Body     *string `json:"body,omitempty"` | 	Body     *string `json:"body,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// The new comfort-fade-preview fields | ||||||
|  | 	StartSide *string `json:"start_side,omitempty"` | ||||||
|  | 	Side      *string `json:"side,omitempty"` | ||||||
|  | 	StartLine *int    `json:"start_line,omitempty"` | ||||||
|  | 	Line      *int    `json:"line,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c DraftReviewComment) String() string { | func (c DraftReviewComment) String() string { | ||||||
| @@ -40,6 +53,7 @@ func (c DraftReviewComment) String() string { | |||||||
| 
 | 
 | ||||||
| // PullRequestReviewRequest represents a request to create a review. | // PullRequestReviewRequest represents a request to create a review. | ||||||
| type PullRequestReviewRequest struct { | type PullRequestReviewRequest struct { | ||||||
|  | 	NodeID   *string               `json:"node_id,omitempty"` | ||||||
| 	CommitID *string               `json:"commit_id,omitempty"` | 	CommitID *string               `json:"commit_id,omitempty"` | ||||||
| 	Body     *string               `json:"body,omitempty"` | 	Body     *string               `json:"body,omitempty"` | ||||||
| 	Event    *string               `json:"event,omitempty"` | 	Event    *string               `json:"event,omitempty"` | ||||||
| @@ -50,6 +64,32 @@ func (r PullRequestReviewRequest) String() string { | |||||||
| 	return Stringify(r) | 	return Stringify(r) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (r PullRequestReviewRequest) isComfortFadePreview() (bool, error) { | ||||||
|  | 	var isCF *bool | ||||||
|  | 	for _, comment := range r.Comments { | ||||||
|  | 		if comment == nil { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		hasPos := comment.Position != nil | ||||||
|  | 		hasComfortFade := (comment.StartSide != nil) || (comment.Side != nil) || | ||||||
|  | 			(comment.StartLine != nil) || (comment.Line != nil) | ||||||
|  | 
 | ||||||
|  | 		switch { | ||||||
|  | 		case hasPos && hasComfortFade: | ||||||
|  | 			return false, ErrMixedCommentStyles | ||||||
|  | 		case hasPos && isCF != nil && *isCF: | ||||||
|  | 			return false, ErrMixedCommentStyles | ||||||
|  | 		case hasComfortFade && isCF != nil && !*isCF: | ||||||
|  | 			return false, ErrMixedCommentStyles | ||||||
|  | 		} | ||||||
|  | 		isCF = &hasComfortFade | ||||||
|  | 	} | ||||||
|  | 	if isCF != nil { | ||||||
|  | 		return *isCF, nil | ||||||
|  | 	} | ||||||
|  | 	return false, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // PullRequestReviewDismissalRequest represents a request to dismiss a review. | // PullRequestReviewDismissalRequest represents a request to dismiss a review. | ||||||
| type PullRequestReviewDismissalRequest struct { | type PullRequestReviewDismissalRequest struct { | ||||||
| 	Message *string `json:"message,omitempty"` | 	Message *string `json:"message,omitempty"` | ||||||
| @@ -65,10 +105,10 @@ func (r PullRequestReviewDismissalRequest) String() string { | |||||||
| // returned error format and remove this comment once it's fixed. | // returned error format and remove this comment once it's fixed. | ||||||
| // Read more about it here - https://github.com/google/go-github/issues/540 | // Read more about it here - https://github.com/google/go-github/issues/540 | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#list-reviews-on-a-pull-request | // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#list-reviews-for-a-pull-request | ||||||
| func (s *PullRequestsService) ListReviews(ctx context.Context, owner, repo string, number int, opt *ListOptions) ([]*PullRequestReview, *Response, error) { | func (s *PullRequestsService) ListReviews(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*PullRequestReview, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews", owner, repo, number) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -93,7 +133,7 @@ func (s *PullRequestsService) ListReviews(ctx context.Context, owner, repo strin | |||||||
| // returned error format and remove this comment once it's fixed. | // returned error format and remove this comment once it's fixed. | ||||||
| // Read more about it here - https://github.com/google/go-github/issues/540 | // Read more about it here - https://github.com/google/go-github/issues/540 | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#get-a-single-review | // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#get-a-review-for-a-pull-request | ||||||
| func (s *PullRequestsService) GetReview(ctx context.Context, owner, repo string, number int, reviewID int64) (*PullRequestReview, *Response, error) { | func (s *PullRequestsService) GetReview(ctx context.Context, owner, repo string, number int, reviewID int64) (*PullRequestReview, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d", owner, repo, number, reviewID) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d", owner, repo, number, reviewID) | ||||||
| 
 | 
 | ||||||
| @@ -117,7 +157,7 @@ func (s *PullRequestsService) GetReview(ctx context.Context, owner, repo string, | |||||||
| // returned error format and remove this comment once it's fixed. | // returned error format and remove this comment once it's fixed. | ||||||
| // Read more about it here - https://github.com/google/go-github/issues/540 | // Read more about it here - https://github.com/google/go-github/issues/540 | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#delete-a-pending-review | // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#delete-a-pending-review-for-a-pull-request | ||||||
| func (s *PullRequestsService) DeletePendingReview(ctx context.Context, owner, repo string, number int, reviewID int64) (*PullRequestReview, *Response, error) { | func (s *PullRequestsService) DeletePendingReview(ctx context.Context, owner, repo string, number int, reviewID int64) (*PullRequestReview, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d", owner, repo, number, reviewID) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d", owner, repo, number, reviewID) | ||||||
| 
 | 
 | ||||||
| @@ -141,10 +181,10 @@ func (s *PullRequestsService) DeletePendingReview(ctx context.Context, owner, re | |||||||
| // returned error format and remove this comment once it's fixed. | // returned error format and remove this comment once it's fixed. | ||||||
| // Read more about it here - https://github.com/google/go-github/issues/540 | // Read more about it here - https://github.com/google/go-github/issues/540 | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#get-comments-for-a-single-review | // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#list-comments-for-a-pull-request-review | ||||||
| func (s *PullRequestsService) ListReviewComments(ctx context.Context, owner, repo string, number int, reviewID int64, opt *ListOptions) ([]*PullRequestComment, *Response, error) { | func (s *PullRequestsService) ListReviewComments(ctx context.Context, owner, repo string, number int, reviewID int64, opts *ListOptions) ([]*PullRequestComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/comments", owner, repo, number, reviewID) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/comments", owner, repo, number, reviewID) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -169,7 +209,39 @@ func (s *PullRequestsService) ListReviewComments(ctx context.Context, owner, rep | |||||||
| // returned error format and remove this comment once it's fixed. | // returned error format and remove this comment once it's fixed. | ||||||
| // Read more about it here - https://github.com/google/go-github/issues/540 | // Read more about it here - https://github.com/google/go-github/issues/540 | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#create-a-pull-request-review | // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#create-a-review-for-a-pull-request | ||||||
|  | // | ||||||
|  | // In order to use multi-line comments, you must use the "comfort fade" preview. | ||||||
|  | // This replaces the use of the "Position" field in comments with 4 new fields: | ||||||
|  | //   [Start]Side, and [Start]Line. | ||||||
|  | // These new fields must be used for ALL comments (including single-line), | ||||||
|  | // with the following restrictions (empirically observed, so subject to change). | ||||||
|  | // | ||||||
|  | // For single-line "comfort fade" comments, you must use: | ||||||
|  | // | ||||||
|  | //    Path:  &path,  // as before | ||||||
|  | //    Body:  &body,  // as before | ||||||
|  | //    Side:  &"RIGHT" (or "LEFT") | ||||||
|  | //    Line:  &123,  // NOT THE SAME AS POSITION, this is an actual line number. | ||||||
|  | // | ||||||
|  | // If StartSide or StartLine is used with single-line comments, a 422 is returned. | ||||||
|  | // | ||||||
|  | // For multi-line "comfort fade" comments, you must use: | ||||||
|  | // | ||||||
|  | //    Path:      &path,  // as before | ||||||
|  | //    Body:      &body,  // as before | ||||||
|  | //    StartSide: &"RIGHT" (or "LEFT") | ||||||
|  | //    Side:      &"RIGHT" (or "LEFT") | ||||||
|  | //    StartLine: &120, | ||||||
|  | //    Line:      &125, | ||||||
|  | // | ||||||
|  | // Suggested edits are made by commenting on the lines to replace, and including the | ||||||
|  | // suggested edit in a block like this (it may be surrounded in non-suggestion markdown): | ||||||
|  | // | ||||||
|  | //    ```suggestion | ||||||
|  | //    Use this instead. | ||||||
|  | //    It is waaaaaay better. | ||||||
|  | //    ``` | ||||||
| func (s *PullRequestsService) CreateReview(ctx context.Context, owner, repo string, number int, review *PullRequestReviewRequest) (*PullRequestReview, *Response, error) { | func (s *PullRequestsService) CreateReview(ctx context.Context, owner, repo string, number int, review *PullRequestReviewRequest) (*PullRequestReview, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews", owner, repo, number) | ||||||
| 
 | 
 | ||||||
| @@ -178,6 +250,15 @@ func (s *PullRequestsService) CreateReview(ctx context.Context, owner, repo stri | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Detect which style of review comment is being used. | ||||||
|  | 	if isCF, err := review.isComfortFadePreview(); err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} else if isCF { | ||||||
|  | 		// If the review comments are using the comfort fade preview fields, | ||||||
|  | 		// then pass the comfort fade header. | ||||||
|  | 		req.Header.Set("Accept", mediaTypeMultiLineCommentsPreview) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	r := new(PullRequestReview) | 	r := new(PullRequestReview) | ||||||
| 	resp, err := s.client.Do(ctx, req, r) | 	resp, err := s.client.Do(ctx, req, r) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -187,13 +268,36 @@ func (s *PullRequestsService) CreateReview(ctx context.Context, owner, repo stri | |||||||
| 	return r, resp, nil | 	return r, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // UpdateReview updates the review summary on the specified pull request. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#update-a-review-for-a-pull-request | ||||||
|  | func (s *PullRequestsService) UpdateReview(ctx context.Context, owner, repo string, number int, reviewID int64, body string) (*PullRequestReview, *Response, error) { | ||||||
|  | 	opts := &struct { | ||||||
|  | 		Body string `json:"body"` | ||||||
|  | 	}{Body: body} | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d", owner, repo, number, reviewID) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	review := &PullRequestReview{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, review) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return review, resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // SubmitReview submits a specified review on the specified pull request. | // SubmitReview submits a specified review on the specified pull request. | ||||||
| // | // | ||||||
| // TODO: Follow up with GitHub support about an issue with this method's | // TODO: Follow up with GitHub support about an issue with this method's | ||||||
| // returned error format and remove this comment once it's fixed. | // returned error format and remove this comment once it's fixed. | ||||||
| // Read more about it here - https://github.com/google/go-github/issues/540 | // Read more about it here - https://github.com/google/go-github/issues/540 | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#submit-a-pull-request-review | // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#submit-a-review-for-a-pull-request | ||||||
| func (s *PullRequestsService) SubmitReview(ctx context.Context, owner, repo string, number int, reviewID int64, review *PullRequestReviewRequest) (*PullRequestReview, *Response, error) { | func (s *PullRequestsService) SubmitReview(ctx context.Context, owner, repo string, number int, reviewID int64, review *PullRequestReviewRequest) (*PullRequestReview, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/events", owner, repo, number, reviewID) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/events", owner, repo, number, reviewID) | ||||||
| 
 | 
 | ||||||
| @@ -217,7 +321,7 @@ func (s *PullRequestsService) SubmitReview(ctx context.Context, owner, repo stri | |||||||
| // returned error format and remove this comment once it's fixed. | // returned error format and remove this comment once it's fixed. | ||||||
| // Read more about it here - https://github.com/google/go-github/issues/540 | // Read more about it here - https://github.com/google/go-github/issues/540 | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#dismiss-a-pull-request-review | // GitHub API docs: https://developer.github.com/v3/pulls/reviews/#dismiss-a-review-for-a-pull-request | ||||||
| func (s *PullRequestsService) DismissReview(ctx context.Context, owner, repo string, number int, reviewID int64, review *PullRequestReviewDismissalRequest) (*PullRequestReview, *Response, error) { | func (s *PullRequestsService) DismissReview(ctx context.Context, owner, repo string, number int, reviewID int64, review *PullRequestReviewDismissalRequest) (*PullRequestReview, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/dismissals", owner, repo, number, reviewID) | 	u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/dismissals", owner, repo, number, reviewID) | ||||||
| 
 | 
 | ||||||
| @@ -8,6 +8,7 @@ package github | |||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"net/http" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // ReactionsService provides access to the reactions-related functions in the | // ReactionsService provides access to the reactions-related functions in the | ||||||
| @@ -44,12 +45,23 @@ func (r Reaction) String() string { | |||||||
| 	return Stringify(r) | 	return Stringify(r) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // ListCommentReactionOptions specifies the optional parameters to the | ||||||
|  | // ReactionsService.ListCommentReactions method. | ||||||
|  | type ListCommentReactionOptions struct { | ||||||
|  | 	// Content restricts the returned comment reactions to only those with the given type. | ||||||
|  | 	// Omit this parameter to list all reactions to a commit comment. | ||||||
|  | 	// Possible values are: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". | ||||||
|  | 	Content string `url:"content,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	ListOptions | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ListCommentReactions lists the reactions for a commit comment. | // ListCommentReactions lists the reactions for a commit comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-a-commit-comment | // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-a-commit-comment | ||||||
| func (s *ReactionsService) ListCommentReactions(ctx context.Context, owner, repo string, id int64, opt *ListOptions) ([]*Reaction, *Response, error) { | func (s *ReactionsService) ListCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListCommentReactionOptions) ([]*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -77,7 +89,7 @@ func (s *ReactionsService) ListCommentReactions(ctx context.Context, owner, repo | |||||||
| // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-a-commit-comment | // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-a-commit-comment | ||||||
| func (s ReactionsService) CreateCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { | func (s *ReactionsService) CreateCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id) | ||||||
| 
 | 
 | ||||||
| 	body := &Reaction{Content: String(content)} | 	body := &Reaction{Content: String(content)} | ||||||
| @@ -98,12 +110,30 @@ func (s ReactionsService) CreateCommentReaction(ctx context.Context, owner, repo | |||||||
| 	return m, resp, nil | 	return m, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // DeleteCommentReaction deletes the reaction for a commit comment. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-a-commit-comment-reaction | ||||||
|  | func (s *ReactionsService) DeleteCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions/%v", owner, repo, commentID, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, u) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeleteCommentReactionByID deletes the reaction for a commit comment by repository ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-a-commit-comment-reaction | ||||||
|  | func (s *ReactionsService) DeleteCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repositories/%v/comments/%v/reactions/%v", repoID, commentID, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, u) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ListIssueReactions lists the reactions for an issue. | // ListIssueReactions lists the reactions for an issue. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-an-issue | // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-an-issue | ||||||
| func (s *ReactionsService) ListIssueReactions(ctx context.Context, owner, repo string, number int, opt *ListOptions) ([]*Reaction, *Response, error) { | func (s *ReactionsService) ListIssueReactions(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -131,7 +161,7 @@ func (s *ReactionsService) ListIssueReactions(ctx context.Context, owner, repo s | |||||||
| // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-an-issue | // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-an-issue | ||||||
| func (s ReactionsService) CreateIssueReaction(ctx context.Context, owner, repo string, number int, content string) (*Reaction, *Response, error) { | func (s *ReactionsService) CreateIssueReaction(ctx context.Context, owner, repo string, number int, content string) (*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number) | 	u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number) | ||||||
| 
 | 
 | ||||||
| 	body := &Reaction{Content: String(content)} | 	body := &Reaction{Content: String(content)} | ||||||
| @@ -152,12 +182,30 @@ func (s ReactionsService) CreateIssueReaction(ctx context.Context, owner, repo s | |||||||
| 	return m, resp, nil | 	return m, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // DeleteIssueReaction deletes the reaction to an issue. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-an-issue-reaction | ||||||
|  | func (s *ReactionsService) DeleteIssueReaction(ctx context.Context, owner, repo string, issueNumber int, reactionID int64) (*Response, error) { | ||||||
|  | 	url := fmt.Sprintf("repos/%v/%v/issues/%v/reactions/%v", owner, repo, issueNumber, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, url) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeleteIssueReactionByID deletes the reaction to an issue by repository ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-an-issue-reaction | ||||||
|  | func (s *ReactionsService) DeleteIssueReactionByID(ctx context.Context, repoID, issueNumber int, reactionID int64) (*Response, error) { | ||||||
|  | 	url := fmt.Sprintf("repositories/%v/issues/%v/reactions/%v", repoID, issueNumber, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, url) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ListIssueCommentReactions lists the reactions for an issue comment. | // ListIssueCommentReactions lists the reactions for an issue comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-an-issue-comment | // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-an-issue-comment | ||||||
| func (s *ReactionsService) ListIssueCommentReactions(ctx context.Context, owner, repo string, id int64, opt *ListOptions) ([]*Reaction, *Response, error) { | func (s *ReactionsService) ListIssueCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListOptions) ([]*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -185,7 +233,7 @@ func (s *ReactionsService) ListIssueCommentReactions(ctx context.Context, owner, | |||||||
| // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-an-issue-comment | // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-an-issue-comment | ||||||
| func (s ReactionsService) CreateIssueCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { | func (s *ReactionsService) CreateIssueCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id) | ||||||
| 
 | 
 | ||||||
| 	body := &Reaction{Content: String(content)} | 	body := &Reaction{Content: String(content)} | ||||||
| @@ -206,12 +254,30 @@ func (s ReactionsService) CreateIssueCommentReaction(ctx context.Context, owner, | |||||||
| 	return m, resp, nil | 	return m, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // DeleteIssueCommentReaction deletes the reaction to an issue comment. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-an-issue-comment-reaction | ||||||
|  | func (s *ReactionsService) DeleteIssueCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { | ||||||
|  | 	url := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions/%v", owner, repo, commentID, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, url) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeleteIssueCommentReactionByID deletes the reaction to an issue comment by repository ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-an-issue-comment-reaction | ||||||
|  | func (s *ReactionsService) DeleteIssueCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { | ||||||
|  | 	url := fmt.Sprintf("repositories/%v/issues/comments/%v/reactions/%v", repoID, commentID, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, url) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ListPullRequestCommentReactions lists the reactions for a pull request review comment. | // ListPullRequestCommentReactions lists the reactions for a pull request review comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-an-issue-comment | // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-a-pull-request-review-comment | ||||||
| func (s *ReactionsService) ListPullRequestCommentReactions(ctx context.Context, owner, repo string, id int64, opt *ListOptions) ([]*Reaction, *Response, error) { | func (s *ReactionsService) ListPullRequestCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListOptions) ([]*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -238,8 +304,8 @@ func (s *ReactionsService) ListPullRequestCommentReactions(ctx context.Context, | |||||||
| // previously created reaction will be returned with Status: 200 OK. | // previously created reaction will be returned with Status: 200 OK. | ||||||
| // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-an-issue-comment | // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-a-pull-request-review-comment | ||||||
| func (s ReactionsService) CreatePullRequestCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { | func (s *ReactionsService) CreatePullRequestCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id) | ||||||
| 
 | 
 | ||||||
| 	body := &Reaction{Content: String(content)} | 	body := &Reaction{Content: String(content)} | ||||||
| @@ -260,12 +326,30 @@ func (s ReactionsService) CreatePullRequestCommentReaction(ctx context.Context, | |||||||
| 	return m, resp, nil | 	return m, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // DeletePullRequestCommentReaction deletes the reaction to a pull request review comment. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-a-pull-request-comment-reaction | ||||||
|  | func (s *ReactionsService) DeletePullRequestCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { | ||||||
|  | 	url := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions/%v", owner, repo, commentID, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, url) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeletePullRequestCommentReactionByID deletes the reaction to a pull request review comment by repository ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-a-pull-request-comment-reaction | ||||||
|  | func (s *ReactionsService) DeletePullRequestCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { | ||||||
|  | 	url := fmt.Sprintf("repositories/%v/pulls/comments/%v/reactions/%v", repoID, commentID, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, url) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ListTeamDiscussionReactions lists the reactions for a team discussion. | // ListTeamDiscussionReactions lists the reactions for a team discussion. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-a-team-discussion | // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-a-team-discussion-legacy | ||||||
| func (s *ReactionsService) ListTeamDiscussionReactions(ctx context.Context, teamID int64, discussionNumber int, opt *ListOptions) ([]*Reaction, *Response, error) { | func (s *ReactionsService) ListTeamDiscussionReactions(ctx context.Context, teamID int64, discussionNumber int, opts *ListOptions) ([]*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v/reactions", teamID, discussionNumber) | 	u := fmt.Sprintf("teams/%v/discussions/%v/reactions", teamID, discussionNumber) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -289,7 +373,7 @@ func (s *ReactionsService) ListTeamDiscussionReactions(ctx context.Context, team | |||||||
| // CreateTeamDiscussionReaction creates a reaction for a team discussion. | // CreateTeamDiscussionReaction creates a reaction for a team discussion. | ||||||
| // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-a-team-discussion | // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-a-team-discussion-legacy | ||||||
| func (s *ReactionsService) CreateTeamDiscussionReaction(ctx context.Context, teamID int64, discussionNumber int, content string) (*Reaction, *Response, error) { | func (s *ReactionsService) CreateTeamDiscussionReaction(ctx context.Context, teamID int64, discussionNumber int, content string) (*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v/reactions", teamID, discussionNumber) | 	u := fmt.Sprintf("teams/%v/discussions/%v/reactions", teamID, discussionNumber) | ||||||
| 
 | 
 | ||||||
| @@ -310,12 +394,30 @@ func (s *ReactionsService) CreateTeamDiscussionReaction(ctx context.Context, tea | |||||||
| 	return m, resp, nil | 	return m, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // DeleteTeamDiscussionReaction deletes the reaction to a team discussion. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-team-discussion-reaction | ||||||
|  | func (s *ReactionsService) DeleteTeamDiscussionReaction(ctx context.Context, org, teamSlug string, discussionNumber int, reactionID int64) (*Response, error) { | ||||||
|  | 	url := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/reactions/%v", org, teamSlug, discussionNumber, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, url) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeleteTeamDiscussionReactionByOrgIDAndTeamID deletes the reaction to a team discussion by organization ID and team ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-team-discussion-reaction | ||||||
|  | func (s *ReactionsService) DeleteTeamDiscussionReactionByOrgIDAndTeamID(ctx context.Context, orgID, teamID, discussionNumber int, reactionID int64) (*Response, error) { | ||||||
|  | 	url := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/reactions/%v", orgID, teamID, discussionNumber, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, url) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ListTeamDiscussionCommentReactions lists the reactions for a team discussion comment. | // ListTeamDiscussionCommentReactions lists the reactions for a team discussion comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-a-team-discussion-comment | // GitHub API docs: https://developer.github.com/v3/reactions/#list-reactions-for-a-team-discussion-comment-legacy | ||||||
| func (s *ReactionsService) ListTeamDiscussionCommentReactions(ctx context.Context, teamID int64, discussionNumber, commentNumber int, opt *ListOptions) ([]*Reaction, *Response, error) { | func (s *ReactionsService) ListTeamDiscussionCommentReactions(ctx context.Context, teamID int64, discussionNumber, commentNumber int, opts *ListOptions) ([]*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v/reactions", teamID, discussionNumber, commentNumber) | 	u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v/reactions", teamID, discussionNumber, commentNumber) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -338,7 +440,7 @@ func (s *ReactionsService) ListTeamDiscussionCommentReactions(ctx context.Contex | |||||||
| // CreateTeamDiscussionCommentReaction creates a reaction for a team discussion comment. | // CreateTeamDiscussionCommentReaction creates a reaction for a team discussion comment. | ||||||
| // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-a-team-discussion-comment | // GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-a-team-discussion-comment-legacy | ||||||
| func (s *ReactionsService) CreateTeamDiscussionCommentReaction(ctx context.Context, teamID int64, discussionNumber, commentNumber int, content string) (*Reaction, *Response, error) { | func (s *ReactionsService) CreateTeamDiscussionCommentReaction(ctx context.Context, teamID int64, discussionNumber, commentNumber int, content string) (*Reaction, *Response, error) { | ||||||
| 	u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v/reactions", teamID, discussionNumber, commentNumber) | 	u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v/reactions", teamID, discussionNumber, commentNumber) | ||||||
| 
 | 
 | ||||||
| @@ -359,18 +461,31 @@ func (s *ReactionsService) CreateTeamDiscussionCommentReaction(ctx context.Conte | |||||||
| 	return m, resp, nil | 	return m, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // DeleteReaction deletes a reaction. | // DeleteTeamDiscussionCommentReaction deletes the reaction to a team discussion comment. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/reaction/reactions/#delete-a-reaction-archive | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-team-discussion-comment-reaction | ||||||
| func (s *ReactionsService) DeleteReaction(ctx context.Context, id int64) (*Response, error) { | func (s *ReactionsService) DeleteTeamDiscussionCommentReaction(ctx context.Context, org, teamSlug string, discussionNumber, commentNumber int, reactionID int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("reactions/%v", id) | 	url := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v/reactions/%v", org, teamSlug, discussionNumber, commentNumber, reactionID) | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	return s.deleteReaction(ctx, url) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID deletes the reaction to a team discussion comment by organization ID and team ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/reactions/#delete-team-discussion-comment-reaction | ||||||
|  | func (s *ReactionsService) DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID(ctx context.Context, orgID, teamID, discussionNumber, commentNumber int, reactionID int64) (*Response, error) { | ||||||
|  | 	url := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v/reactions/%v", orgID, teamID, discussionNumber, commentNumber, reactionID) | ||||||
|  | 
 | ||||||
|  | 	return s.deleteReaction(ctx, url) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *ReactionsService) deleteReaction(ctx context.Context, url string) (*Response, error) { | ||||||
|  | 	req, err := s.client.NewRequest(http.MethodDelete, url, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. | 	// TODO: remove custom Accept headers when APIs fully launch. | ||||||
| 	req.Header.Set("Accept", mediaTypeReactionsPreview) | 	req.Header.Set("Accept", mediaTypeReactionsPreview) | ||||||
| 
 | 
 | ||||||
| 	return s.client.Do(ctx, req, nil) | 	return s.client.Do(ctx, req, nil) | ||||||
| @@ -7,6 +7,7 @@ package github | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strings" | 	"strings" | ||||||
| ) | ) | ||||||
| @@ -19,44 +20,47 @@ type RepositoriesService service | |||||||
| 
 | 
 | ||||||
| // Repository represents a GitHub repository. | // Repository represents a GitHub repository. | ||||||
| type Repository struct { | type Repository struct { | ||||||
| 	ID               *int64           `json:"id,omitempty"` | 	ID                  *int64           `json:"id,omitempty"` | ||||||
| 	NodeID           *string          `json:"node_id,omitempty"` | 	NodeID              *string          `json:"node_id,omitempty"` | ||||||
| 	Owner            *User            `json:"owner,omitempty"` | 	Owner               *User            `json:"owner,omitempty"` | ||||||
| 	Name             *string          `json:"name,omitempty"` | 	Name                *string          `json:"name,omitempty"` | ||||||
| 	FullName         *string          `json:"full_name,omitempty"` | 	FullName            *string          `json:"full_name,omitempty"` | ||||||
| 	Description      *string          `json:"description,omitempty"` | 	Description         *string          `json:"description,omitempty"` | ||||||
| 	Homepage         *string          `json:"homepage,omitempty"` | 	Homepage            *string          `json:"homepage,omitempty"` | ||||||
| 	CodeOfConduct    *CodeOfConduct   `json:"code_of_conduct,omitempty"` | 	CodeOfConduct       *CodeOfConduct   `json:"code_of_conduct,omitempty"` | ||||||
| 	DefaultBranch    *string          `json:"default_branch,omitempty"` | 	DefaultBranch       *string          `json:"default_branch,omitempty"` | ||||||
| 	MasterBranch     *string          `json:"master_branch,omitempty"` | 	MasterBranch        *string          `json:"master_branch,omitempty"` | ||||||
| 	CreatedAt        *Timestamp       `json:"created_at,omitempty"` | 	CreatedAt           *Timestamp       `json:"created_at,omitempty"` | ||||||
| 	PushedAt         *Timestamp       `json:"pushed_at,omitempty"` | 	PushedAt            *Timestamp       `json:"pushed_at,omitempty"` | ||||||
| 	UpdatedAt        *Timestamp       `json:"updated_at,omitempty"` | 	UpdatedAt           *Timestamp       `json:"updated_at,omitempty"` | ||||||
| 	HTMLURL          *string          `json:"html_url,omitempty"` | 	HTMLURL             *string          `json:"html_url,omitempty"` | ||||||
| 	CloneURL         *string          `json:"clone_url,omitempty"` | 	CloneURL            *string          `json:"clone_url,omitempty"` | ||||||
| 	GitURL           *string          `json:"git_url,omitempty"` | 	GitURL              *string          `json:"git_url,omitempty"` | ||||||
| 	MirrorURL        *string          `json:"mirror_url,omitempty"` | 	MirrorURL           *string          `json:"mirror_url,omitempty"` | ||||||
| 	SSHURL           *string          `json:"ssh_url,omitempty"` | 	SSHURL              *string          `json:"ssh_url,omitempty"` | ||||||
| 	SVNURL           *string          `json:"svn_url,omitempty"` | 	SVNURL              *string          `json:"svn_url,omitempty"` | ||||||
| 	Language         *string          `json:"language,omitempty"` | 	Language            *string          `json:"language,omitempty"` | ||||||
| 	Fork             *bool            `json:"fork,omitempty"` | 	Fork                *bool            `json:"fork,omitempty"` | ||||||
| 	ForksCount       *int             `json:"forks_count,omitempty"` | 	ForksCount          *int             `json:"forks_count,omitempty"` | ||||||
| 	NetworkCount     *int             `json:"network_count,omitempty"` | 	NetworkCount        *int             `json:"network_count,omitempty"` | ||||||
| 	OpenIssuesCount  *int             `json:"open_issues_count,omitempty"` | 	OpenIssuesCount     *int             `json:"open_issues_count,omitempty"` | ||||||
| 	StargazersCount  *int             `json:"stargazers_count,omitempty"` | 	StargazersCount     *int             `json:"stargazers_count,omitempty"` | ||||||
| 	SubscribersCount *int             `json:"subscribers_count,omitempty"` | 	SubscribersCount    *int             `json:"subscribers_count,omitempty"` | ||||||
| 	WatchersCount    *int             `json:"watchers_count,omitempty"` | 	WatchersCount       *int             `json:"watchers_count,omitempty"` | ||||||
| 	Size             *int             `json:"size,omitempty"` | 	Size                *int             `json:"size,omitempty"` | ||||||
| 	AutoInit         *bool            `json:"auto_init,omitempty"` | 	AutoInit            *bool            `json:"auto_init,omitempty"` | ||||||
| 	Parent           *Repository      `json:"parent,omitempty"` | 	Parent              *Repository      `json:"parent,omitempty"` | ||||||
| 	Source           *Repository      `json:"source,omitempty"` | 	Source              *Repository      `json:"source,omitempty"` | ||||||
| 	Organization     *Organization    `json:"organization,omitempty"` | 	TemplateRepository  *Repository      `json:"template_repository,omitempty"` | ||||||
| 	Permissions      *map[string]bool `json:"permissions,omitempty"` | 	Organization        *Organization    `json:"organization,omitempty"` | ||||||
| 	AllowRebaseMerge *bool            `json:"allow_rebase_merge,omitempty"` | 	Permissions         *map[string]bool `json:"permissions,omitempty"` | ||||||
| 	AllowSquashMerge *bool            `json:"allow_squash_merge,omitempty"` | 	AllowRebaseMerge    *bool            `json:"allow_rebase_merge,omitempty"` | ||||||
| 	AllowMergeCommit *bool            `json:"allow_merge_commit,omitempty"` | 	AllowSquashMerge    *bool            `json:"allow_squash_merge,omitempty"` | ||||||
| 	Topics           []string         `json:"topics,omitempty"` | 	AllowMergeCommit    *bool            `json:"allow_merge_commit,omitempty"` | ||||||
| 	Archived         *bool            `json:"archived,omitempty"` | 	DeleteBranchOnMerge *bool            `json:"delete_branch_on_merge,omitempty"` | ||||||
|  | 	Topics              []string         `json:"topics,omitempty"` | ||||||
|  | 	Archived            *bool            `json:"archived,omitempty"` | ||||||
|  | 	Disabled            *bool            `json:"disabled,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// Only provided when using RepositoriesService.Get while in preview | 	// Only provided when using RepositoriesService.Get while in preview | ||||||
| 	License *License `json:"license,omitempty"` | 	License *License `json:"license,omitempty"` | ||||||
| @@ -68,6 +72,7 @@ type Repository struct { | |||||||
| 	HasPages          *bool   `json:"has_pages,omitempty"` | 	HasPages          *bool   `json:"has_pages,omitempty"` | ||||||
| 	HasProjects       *bool   `json:"has_projects,omitempty"` | 	HasProjects       *bool   `json:"has_projects,omitempty"` | ||||||
| 	HasDownloads      *bool   `json:"has_downloads,omitempty"` | 	HasDownloads      *bool   `json:"has_downloads,omitempty"` | ||||||
|  | 	IsTemplate        *bool   `json:"is_template,omitempty"` | ||||||
| 	LicenseTemplate   *string `json:"license_template,omitempty"` | 	LicenseTemplate   *string `json:"license_template,omitempty"` | ||||||
| 	GitignoreTemplate *string `json:"gitignore_template,omitempty"` | 	GitignoreTemplate *string `json:"gitignore_template,omitempty"` | ||||||
| 
 | 
 | ||||||
| @@ -115,13 +120,30 @@ type Repository struct { | |||||||
| 
 | 
 | ||||||
| 	// TextMatches is only populated from search results that request text matches | 	// TextMatches is only populated from search results that request text matches | ||||||
| 	// See: search.go and https://developer.github.com/v3/search/#text-match-metadata | 	// See: search.go and https://developer.github.com/v3/search/#text-match-metadata | ||||||
| 	TextMatches []TextMatch `json:"text_matches,omitempty"` | 	TextMatches []*TextMatch `json:"text_matches,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// Visibility is only used for Create and Edit endpoints. The visibility field | ||||||
|  | 	// overrides the field parameter when both are used. | ||||||
|  | 	// Can be one of public, private or internal. | ||||||
|  | 	Visibility *string `json:"visibility,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r Repository) String() string { | func (r Repository) String() string { | ||||||
| 	return Stringify(r) | 	return Stringify(r) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // BranchListOptions specifies the optional parameters to the | ||||||
|  | // RepositoriesService.ListBranches method. | ||||||
|  | type BranchListOptions struct { | ||||||
|  | 	// Setting to true returns only protected branches. | ||||||
|  | 	// When set to false, only unprotected branches are returned. | ||||||
|  | 	// Omitting this parameter returns all branches. | ||||||
|  | 	// Default: nil | ||||||
|  | 	Protected *bool `url:"protected,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	ListOptions | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // RepositoryListOptions specifies the optional parameters to the | // RepositoryListOptions specifies the optional parameters to the | ||||||
| // RepositoriesService.List method. | // RepositoriesService.List method. | ||||||
| type RepositoryListOptions struct { | type RepositoryListOptions struct { | ||||||
| @@ -160,15 +182,16 @@ type RepositoryListOptions struct { | |||||||
| // List the repositories for a user. Passing the empty string will list | // List the repositories for a user. Passing the empty string will list | ||||||
| // repositories for the authenticated user. | // repositories for the authenticated user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#list-user-repositories | // GitHub API docs: https://developer.github.com/v3/repos/#list-repositories-for-a-user | ||||||
| func (s *RepositoriesService) List(ctx context.Context, user string, opt *RepositoryListOptions) ([]*Repository, *Response, error) { | // GitHub API docs: https://developer.github.com/v3/repos/#list-repositories-for-the-authenticated-user | ||||||
|  | func (s *RepositoriesService) List(ctx context.Context, user string, opts *RepositoryListOptions) ([]*Repository, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if user != "" { | 	if user != "" { | ||||||
| 		u = fmt.Sprintf("users/%v/repos", user) | 		u = fmt.Sprintf("users/%v/repos", user) | ||||||
| 	} else { | 	} else { | ||||||
| 		u = "user/repos" | 		u = "user/repos" | ||||||
| 	} | 	} | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -198,15 +221,23 @@ type RepositoryListByOrgOptions struct { | |||||||
| 	// forks, sources, member. Default is "all". | 	// forks, sources, member. Default is "all". | ||||||
| 	Type string `url:"type,omitempty"` | 	Type string `url:"type,omitempty"` | ||||||
| 
 | 
 | ||||||
|  | 	// How to sort the repository list. Can be one of created, updated, pushed, | ||||||
|  | 	// full_name. Default is "created". | ||||||
|  | 	Sort string `url:"sort,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	// Direction in which to sort repositories. Can be one of asc or desc. | ||||||
|  | 	// Default when using full_name: asc; otherwise desc. | ||||||
|  | 	Direction string `url:"direction,omitempty"` | ||||||
|  | 
 | ||||||
| 	ListOptions | 	ListOptions | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ListByOrg lists the repositories for an organization. | // ListByOrg lists the repositories for an organization. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#list-organization-repositories | // GitHub API docs: https://developer.github.com/v3/repos/#list-organization-repositories | ||||||
| func (s *RepositoriesService) ListByOrg(ctx context.Context, org string, opt *RepositoryListByOrgOptions) ([]*Repository, *Response, error) { | func (s *RepositoriesService) ListByOrg(ctx context.Context, org string, opts *RepositoryListByOrgOptions) ([]*Repository, *Response, error) { | ||||||
| 	u := fmt.Sprintf("orgs/%v/repos", org) | 	u := fmt.Sprintf("orgs/%v/repos", org) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -238,9 +269,9 @@ type RepositoryListAllOptions struct { | |||||||
| 
 | 
 | ||||||
| // ListAll lists all GitHub repositories in the order that they were created. | // ListAll lists all GitHub repositories in the order that they were created. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#list-all-public-repositories | // GitHub API docs: https://developer.github.com/v3/repos/#list-public-repositories | ||||||
| func (s *RepositoriesService) ListAll(ctx context.Context, opt *RepositoryListAllOptions) ([]*Repository, *Response, error) { | func (s *RepositoriesService) ListAll(ctx context.Context, opts *RepositoryListAllOptions) ([]*Repository, *Response, error) { | ||||||
| 	u, err := addOptions("repositories", opt) | 	u, err := addOptions("repositories", opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -270,20 +301,23 @@ type createRepoRequest struct { | |||||||
| 	Description *string `json:"description,omitempty"` | 	Description *string `json:"description,omitempty"` | ||||||
| 	Homepage    *string `json:"homepage,omitempty"` | 	Homepage    *string `json:"homepage,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	Private     *bool `json:"private,omitempty"` | 	Private     *bool   `json:"private,omitempty"` | ||||||
| 	HasIssues   *bool `json:"has_issues,omitempty"` | 	Visibility  *string `json:"visibility,omitempty"` | ||||||
| 	HasProjects *bool `json:"has_projects,omitempty"` | 	HasIssues   *bool   `json:"has_issues,omitempty"` | ||||||
| 	HasWiki     *bool `json:"has_wiki,omitempty"` | 	HasProjects *bool   `json:"has_projects,omitempty"` | ||||||
|  | 	HasWiki     *bool   `json:"has_wiki,omitempty"` | ||||||
|  | 	IsTemplate  *bool   `json:"is_template,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// Creating an organization repository. Required for non-owners. | 	// Creating an organization repository. Required for non-owners. | ||||||
| 	TeamID *int64 `json:"team_id,omitempty"` | 	TeamID *int64 `json:"team_id,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	AutoInit          *bool   `json:"auto_init,omitempty"` | 	AutoInit            *bool   `json:"auto_init,omitempty"` | ||||||
| 	GitignoreTemplate *string `json:"gitignore_template,omitempty"` | 	GitignoreTemplate   *string `json:"gitignore_template,omitempty"` | ||||||
| 	LicenseTemplate   *string `json:"license_template,omitempty"` | 	LicenseTemplate     *string `json:"license_template,omitempty"` | ||||||
| 	AllowSquashMerge  *bool   `json:"allow_squash_merge,omitempty"` | 	AllowSquashMerge    *bool   `json:"allow_squash_merge,omitempty"` | ||||||
| 	AllowMergeCommit  *bool   `json:"allow_merge_commit,omitempty"` | 	AllowMergeCommit    *bool   `json:"allow_merge_commit,omitempty"` | ||||||
| 	AllowRebaseMerge  *bool   `json:"allow_rebase_merge,omitempty"` | 	AllowRebaseMerge    *bool   `json:"allow_rebase_merge,omitempty"` | ||||||
|  | 	DeleteBranchOnMerge *bool   `json:"delete_branch_on_merge,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Create a new repository. If an organization is specified, the new | // Create a new repository. If an organization is specified, the new | ||||||
| @@ -293,7 +327,8 @@ type createRepoRequest struct { | |||||||
| // Note that only a subset of the repo fields are used and repo must | // Note that only a subset of the repo fields are used and repo must | ||||||
| // not be nil. | // not be nil. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#create | // GitHub API docs: https://developer.github.com/v3/repos/#create-a-repository-for-the-authenticated-user | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/#create-an-organization-repository | ||||||
| func (s *RepositoriesService) Create(ctx context.Context, org string, repo *Repository) (*Repository, *Response, error) { | func (s *RepositoriesService) Create(ctx context.Context, org string, repo *Repository) (*Repository, *Response, error) { | ||||||
| 	var u string | 	var u string | ||||||
| 	if org != "" { | 	if org != "" { | ||||||
| @@ -303,20 +338,23 @@ func (s *RepositoriesService) Create(ctx context.Context, org string, repo *Repo | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	repoReq := &createRepoRequest{ | 	repoReq := &createRepoRequest{ | ||||||
| 		Name:              repo.Name, | 		Name:                repo.Name, | ||||||
| 		Description:       repo.Description, | 		Description:         repo.Description, | ||||||
| 		Homepage:          repo.Homepage, | 		Homepage:            repo.Homepage, | ||||||
| 		Private:           repo.Private, | 		Private:             repo.Private, | ||||||
| 		HasIssues:         repo.HasIssues, | 		Visibility:          repo.Visibility, | ||||||
| 		HasProjects:       repo.HasProjects, | 		HasIssues:           repo.HasIssues, | ||||||
| 		HasWiki:           repo.HasWiki, | 		HasProjects:         repo.HasProjects, | ||||||
| 		TeamID:            repo.TeamID, | 		HasWiki:             repo.HasWiki, | ||||||
| 		AutoInit:          repo.AutoInit, | 		IsTemplate:          repo.IsTemplate, | ||||||
| 		GitignoreTemplate: repo.GitignoreTemplate, | 		TeamID:              repo.TeamID, | ||||||
| 		LicenseTemplate:   repo.LicenseTemplate, | 		AutoInit:            repo.AutoInit, | ||||||
| 		AllowSquashMerge:  repo.AllowSquashMerge, | 		GitignoreTemplate:   repo.GitignoreTemplate, | ||||||
| 		AllowMergeCommit:  repo.AllowMergeCommit, | 		LicenseTemplate:     repo.LicenseTemplate, | ||||||
| 		AllowRebaseMerge:  repo.AllowRebaseMerge, | 		AllowSquashMerge:    repo.AllowSquashMerge, | ||||||
|  | 		AllowMergeCommit:    repo.AllowMergeCommit, | ||||||
|  | 		AllowRebaseMerge:    repo.AllowRebaseMerge, | ||||||
|  | 		DeleteBranchOnMerge: repo.DeleteBranchOnMerge, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("POST", u, repoReq) | 	req, err := s.client.NewRequest("POST", u, repoReq) | ||||||
| @@ -324,6 +362,39 @@ func (s *RepositoriesService) Create(ctx context.Context, org string, repo *Repo | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	acceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  | 	r := new(Repository) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return r, resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // TemplateRepoRequest represents a request to create a repository from a template. | ||||||
|  | type TemplateRepoRequest struct { | ||||||
|  | 	// Name is required when creating a repo. | ||||||
|  | 	Name        *string `json:"name,omitempty"` | ||||||
|  | 	Owner       *string `json:"owner,omitempty"` | ||||||
|  | 	Description *string `json:"description,omitempty"` | ||||||
|  | 
 | ||||||
|  | 	Private *bool `json:"private,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // CreateFromTemplate generates a repository from a template. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/#create-a-repository-using-a-template | ||||||
|  | func (s *RepositoriesService) CreateFromTemplate(ctx context.Context, templateOwner, templateRepo string, templateRepoReq *TemplateRepoRequest) (*Repository, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/generate", templateOwner, templateRepo) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, templateRepoReq) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	req.Header.Set("Accept", mediaTypeRepositoryTemplatePreview) | ||||||
| 	r := new(Repository) | 	r := new(Repository) | ||||||
| 	resp, err := s.client.Do(ctx, req, r) | 	resp, err := s.client.Do(ctx, req, r) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -335,7 +406,7 @@ func (s *RepositoriesService) Create(ctx context.Context, org string, repo *Repo | |||||||
| 
 | 
 | ||||||
| // Get fetches a repository. | // Get fetches a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#get | // GitHub API docs: https://developer.github.com/v3/repos/#get-a-repository | ||||||
| func (s *RepositoriesService) Get(ctx context.Context, owner, repo string) (*Repository, *Response, error) { | func (s *RepositoriesService) Get(ctx context.Context, owner, repo string) (*Repository, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -345,7 +416,12 @@ func (s *RepositoriesService) Get(ctx context.Context, owner, repo string) (*Rep | |||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when the license support fully launches | 	// TODO: remove custom Accept header when the license support fully launches | ||||||
| 	// https://developer.github.com/v3/licenses/#get-a-repositorys-license | 	// https://developer.github.com/v3/licenses/#get-a-repositorys-license | ||||||
| 	acceptHeaders := []string{mediaTypeCodesOfConductPreview, mediaTypeTopicsPreview} | 	acceptHeaders := []string{ | ||||||
|  | 		mediaTypeCodesOfConductPreview, | ||||||
|  | 		mediaTypeTopicsPreview, | ||||||
|  | 		mediaTypeRepositoryTemplatePreview, | ||||||
|  | 		mediaTypeRepositoryVisibilityPreview, | ||||||
|  | 	} | ||||||
| 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 
 | 
 | ||||||
| 	repository := new(Repository) | 	repository := new(Repository) | ||||||
| @@ -359,7 +435,7 @@ func (s *RepositoriesService) Get(ctx context.Context, owner, repo string) (*Rep | |||||||
| 
 | 
 | ||||||
| // GetCodeOfConduct gets the contents of a repository's code of conduct. | // GetCodeOfConduct gets the contents of a repository's code of conduct. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/codes_of_conduct/#get-the-contents-of-a-repositorys-code-of-conduct | // GitHub API docs: https://developer.github.com/v3/codes_of_conduct/#get-the-code-of-conduct-for-a-repository | ||||||
| func (s *RepositoriesService) GetCodeOfConduct(ctx context.Context, owner, repo string) (*CodeOfConduct, *Response, error) { | func (s *RepositoriesService) GetCodeOfConduct(ctx context.Context, owner, repo string) (*CodeOfConduct, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/community/code_of_conduct", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/community/code_of_conduct", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -400,7 +476,7 @@ func (s *RepositoriesService) GetByID(ctx context.Context, id int64) (*Repositor | |||||||
| 
 | 
 | ||||||
| // Edit updates a repository. | // Edit updates a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#edit | // GitHub API docs: https://developer.github.com/v3/repos/#update-a-repository | ||||||
| func (s *RepositoriesService) Edit(ctx context.Context, owner, repo string, repository *Repository) (*Repository, *Response, error) { | func (s *RepositoriesService) Edit(ctx context.Context, owner, repo string, repository *Repository) (*Repository, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, repository) | 	req, err := s.client.NewRequest("PATCH", u, repository) | ||||||
| @@ -408,6 +484,8 @@ func (s *RepositoriesService) Edit(ctx context.Context, owner, repo string, repo | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	acceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
| 	r := new(Repository) | 	r := new(Repository) | ||||||
| 	resp, err := s.client.Do(ctx, req, r) | 	resp, err := s.client.Do(ctx, req, r) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -434,6 +512,7 @@ func (s *RepositoriesService) Delete(ctx context.Context, owner, repo string) (* | |||||||
| type Contributor struct { | type Contributor struct { | ||||||
| 	Login             *string `json:"login,omitempty"` | 	Login             *string `json:"login,omitempty"` | ||||||
| 	ID                *int64  `json:"id,omitempty"` | 	ID                *int64  `json:"id,omitempty"` | ||||||
|  | 	NodeID            *string `json:"node_id,omitempty"` | ||||||
| 	AvatarURL         *string `json:"avatar_url,omitempty"` | 	AvatarURL         *string `json:"avatar_url,omitempty"` | ||||||
| 	GravatarID        *string `json:"gravatar_id,omitempty"` | 	GravatarID        *string `json:"gravatar_id,omitempty"` | ||||||
| 	URL               *string `json:"url,omitempty"` | 	URL               *string `json:"url,omitempty"` | ||||||
| @@ -461,12 +540,100 @@ type ListContributorsOptions struct { | |||||||
| 	ListOptions | 	ListOptions | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // GetVulnerabilityAlerts checks if vulnerability alerts are enabled for a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/#check-if-vulnerability-alerts-are-enabled-for-a-repository | ||||||
|  | func (s *RepositoriesService) GetVulnerabilityAlerts(ctx context.Context, owner, repository string) (bool, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches | ||||||
|  | 	req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview) | ||||||
|  | 
 | ||||||
|  | 	resp, err := s.client.Do(ctx, req, nil) | ||||||
|  | 	vulnerabilityAlertsEnabled, err := parseBoolResponse(err) | ||||||
|  | 
 | ||||||
|  | 	return vulnerabilityAlertsEnabled, resp, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // EnableVulnerabilityAlerts enables vulnerability alerts and the dependency graph for a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/#enable-vulnerability-alerts | ||||||
|  | func (s *RepositoriesService) EnableVulnerabilityAlerts(ctx context.Context, owner, repository string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches | ||||||
|  | 	req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview) | ||||||
|  | 
 | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DisableVulnerabilityAlerts disables vulnerability alerts and the dependency graph for a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/#disable-vulnerability-alerts | ||||||
|  | func (s *RepositoriesService) DisableVulnerabilityAlerts(ctx context.Context, owner, repository string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches | ||||||
|  | 	req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview) | ||||||
|  | 
 | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // EnableAutomatedSecurityFixes enables the automated security fixes for a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/#enable-automated-security-fixes | ||||||
|  | func (s *RepositoriesService) EnableAutomatedSecurityFixes(ctx context.Context, owner, repository string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/automated-security-fixes", owner, repository) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches | ||||||
|  | 	req.Header.Set("Accept", mediaTypeRequiredAutomatedSecurityFixesPreview) | ||||||
|  | 
 | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DisableAutomatedSecurityFixes disables vulnerability alerts and the dependency graph for a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/#disable-automated-security-fixes | ||||||
|  | func (s *RepositoriesService) DisableAutomatedSecurityFixes(ctx context.Context, owner, repository string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/automated-security-fixes", owner, repository) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches | ||||||
|  | 	req.Header.Set("Accept", mediaTypeRequiredAutomatedSecurityFixesPreview) | ||||||
|  | 
 | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ListContributors lists contributors for a repository. | // ListContributors lists contributors for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#list-contributors | // GitHub API docs: https://developer.github.com/v3/repos/#list-repository-contributors | ||||||
| func (s *RepositoriesService) ListContributors(ctx context.Context, owner string, repository string, opt *ListContributorsOptions) ([]*Contributor, *Response, error) { | func (s *RepositoriesService) ListContributors(ctx context.Context, owner string, repository string, opts *ListContributorsOptions) ([]*Contributor, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/contributors", owner, repository) | 	u := fmt.Sprintf("repos/%v/%v/contributors", owner, repository) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -494,7 +661,7 @@ func (s *RepositoriesService) ListContributors(ctx context.Context, owner string | |||||||
| //       "Python": 7769 | //       "Python": 7769 | ||||||
| //     } | //     } | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#list-languages | // GitHub API docs: https://developer.github.com/v3/repos/#list-repository-languages | ||||||
| func (s *RepositoriesService) ListLanguages(ctx context.Context, owner string, repo string) (map[string]int, *Response, error) { | func (s *RepositoriesService) ListLanguages(ctx context.Context, owner string, repo string) (map[string]int, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/languages", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/languages", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -513,10 +680,10 @@ func (s *RepositoriesService) ListLanguages(ctx context.Context, owner string, r | |||||||
| 
 | 
 | ||||||
| // ListTeams lists the teams for the specified repository. | // ListTeams lists the teams for the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#list-teams | // GitHub API docs: https://developer.github.com/v3/repos/#list-repository-teams | ||||||
| func (s *RepositoriesService) ListTeams(ctx context.Context, owner string, repo string, opt *ListOptions) ([]*Team, *Response, error) { | func (s *RepositoriesService) ListTeams(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*Team, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/teams", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/teams", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -526,8 +693,6 @@ func (s *RepositoriesService) ListTeams(ctx context.Context, owner string, repo | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
| 
 |  | ||||||
| 	var teams []*Team | 	var teams []*Team | ||||||
| 	resp, err := s.client.Do(ctx, req, &teams) | 	resp, err := s.client.Do(ctx, req, &teams) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -547,10 +712,10 @@ type RepositoryTag struct { | |||||||
| 
 | 
 | ||||||
| // ListTags lists tags for the specified repository. | // ListTags lists tags for the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#list-tags | // GitHub API docs: https://developer.github.com/v3/repos/#list-repository-tags | ||||||
| func (s *RepositoriesService) ListTags(ctx context.Context, owner string, repo string, opt *ListOptions) ([]*RepositoryTag, *Response, error) { | func (s *RepositoriesService) ListTags(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*RepositoryTag, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/tags", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/tags", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -582,6 +747,9 @@ type Protection struct { | |||||||
| 	RequiredPullRequestReviews *PullRequestReviewsEnforcement `json:"required_pull_request_reviews"` | 	RequiredPullRequestReviews *PullRequestReviewsEnforcement `json:"required_pull_request_reviews"` | ||||||
| 	EnforceAdmins              *AdminEnforcement              `json:"enforce_admins"` | 	EnforceAdmins              *AdminEnforcement              `json:"enforce_admins"` | ||||||
| 	Restrictions               *BranchRestrictions            `json:"restrictions"` | 	Restrictions               *BranchRestrictions            `json:"restrictions"` | ||||||
|  | 	RequireLinearHistory       *RequireLinearHistory          `json:"required_linear_history"` | ||||||
|  | 	AllowForcePushes           *AllowForcePushes              `json:"allow_force_pushes"` | ||||||
|  | 	AllowDeletions             *AllowDeletions                `json:"allow_deletions"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // ProtectionRequest represents a request to create/edit a branch's protection. | // ProtectionRequest represents a request to create/edit a branch's protection. | ||||||
| @@ -590,6 +758,12 @@ type ProtectionRequest struct { | |||||||
| 	RequiredPullRequestReviews *PullRequestReviewsEnforcementRequest `json:"required_pull_request_reviews"` | 	RequiredPullRequestReviews *PullRequestReviewsEnforcementRequest `json:"required_pull_request_reviews"` | ||||||
| 	EnforceAdmins              bool                                  `json:"enforce_admins"` | 	EnforceAdmins              bool                                  `json:"enforce_admins"` | ||||||
| 	Restrictions               *BranchRestrictionsRequest            `json:"restrictions"` | 	Restrictions               *BranchRestrictionsRequest            `json:"restrictions"` | ||||||
|  | 	// Enforces a linear commit Git history, which prevents anyone from pushing merge commits to a branch. | ||||||
|  | 	RequireLinearHistory *bool `json:"required_linear_history,omitempty"` | ||||||
|  | 	// Permits force pushes to the protected branch by anyone with write access to the repository. | ||||||
|  | 	AllowForcePushes *bool `json:"allow_force_pushes,omitempty"` | ||||||
|  | 	// Allows deletion of the protected branch by anyone with write access to the repository. | ||||||
|  | 	AllowDeletions *bool `json:"allow_deletions,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // RequiredStatusChecks represents the protection status of a individual branch. | // RequiredStatusChecks represents the protection status of a individual branch. | ||||||
| @@ -610,7 +784,7 @@ type RequiredStatusChecksRequest struct { | |||||||
| // PullRequestReviewsEnforcement represents the pull request reviews enforcement of a protected branch. | // PullRequestReviewsEnforcement represents the pull request reviews enforcement of a protected branch. | ||||||
| type PullRequestReviewsEnforcement struct { | type PullRequestReviewsEnforcement struct { | ||||||
| 	// Specifies which users and teams can dismiss pull request reviews. | 	// Specifies which users and teams can dismiss pull request reviews. | ||||||
| 	DismissalRestrictions DismissalRestrictions `json:"dismissal_restrictions"` | 	DismissalRestrictions *DismissalRestrictions `json:"dismissal_restrictions,omitempty"` | ||||||
| 	// Specifies if approved reviews are dismissed automatically, when a new commit is pushed. | 	// Specifies if approved reviews are dismissed automatically, when a new commit is pushed. | ||||||
| 	DismissStaleReviews bool `json:"dismiss_stale_reviews"` | 	DismissStaleReviews bool `json:"dismiss_stale_reviews"` | ||||||
| 	// RequireCodeOwnerReviews specifies if an approved review is required in pull requests including files with a designated code owner. | 	// RequireCodeOwnerReviews specifies if an approved review is required in pull requests including files with a designated code owner. | ||||||
| @@ -652,6 +826,21 @@ type PullRequestReviewsEnforcementUpdate struct { | |||||||
| 	RequiredApprovingReviewCount int `json:"required_approving_review_count"` | 	RequiredApprovingReviewCount int `json:"required_approving_review_count"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // RequireLinearHistory represents the configuration to enfore branches with no merge commit. | ||||||
|  | type RequireLinearHistory struct { | ||||||
|  | 	Enabled bool `json:"enabled"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AllowDeletions represents the configuration to accept deletion of protected branches. | ||||||
|  | type AllowDeletions struct { | ||||||
|  | 	Enabled bool `json:"enabled"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AllowForcePushes represents the configuration to accept forced pushes on protected branches. | ||||||
|  | type AllowForcePushes struct { | ||||||
|  | 	Enabled bool `json:"enabled"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // AdminEnforcement represents the configuration to enforce required status checks for repository administrators. | // AdminEnforcement represents the configuration to enforce required status checks for repository administrators. | ||||||
| type AdminEnforcement struct { | type AdminEnforcement struct { | ||||||
| 	URL     *string `json:"url,omitempty"` | 	URL     *string `json:"url,omitempty"` | ||||||
| @@ -665,6 +854,8 @@ type BranchRestrictions struct { | |||||||
| 	Users []*User `json:"users"` | 	Users []*User `json:"users"` | ||||||
| 	// The list of team slugs with push access. | 	// The list of team slugs with push access. | ||||||
| 	Teams []*Team `json:"teams"` | 	Teams []*Team `json:"teams"` | ||||||
|  | 	// The list of app slugs with push access. | ||||||
|  | 	Apps []*App `json:"apps"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // BranchRestrictionsRequest represents the request to create/edit the | // BranchRestrictionsRequest represents the request to create/edit the | ||||||
| @@ -676,6 +867,8 @@ type BranchRestrictionsRequest struct { | |||||||
| 	Users []string `json:"users"` | 	Users []string `json:"users"` | ||||||
| 	// The list of team slugs with push access. (Required; use []string{} instead of nil for empty list.) | 	// The list of team slugs with push access. (Required; use []string{} instead of nil for empty list.) | ||||||
| 	Teams []string `json:"teams"` | 	Teams []string `json:"teams"` | ||||||
|  | 	// The list of app slugs with push access. | ||||||
|  | 	Apps []string `json:"apps,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // DismissalRestrictions specifies which users and teams can dismiss pull request reviews. | // DismissalRestrictions specifies which users and teams can dismiss pull request reviews. | ||||||
| @@ -707,10 +900,10 @@ type SignaturesProtectedBranch struct { | |||||||
| 
 | 
 | ||||||
| // ListBranches lists branches for the specified repository. | // ListBranches lists branches for the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#list-branches | // GitHub API docs: https://developer.github.com/v3/repos/branches/#list-branches | ||||||
| func (s *RepositoriesService) ListBranches(ctx context.Context, owner string, repo string, opt *ListOptions) ([]*Branch, *Response, error) { | func (s *RepositoriesService) ListBranches(ctx context.Context, owner string, repo string, opts *BranchListOptions) ([]*Branch, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/branches", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -734,7 +927,7 @@ func (s *RepositoriesService) ListBranches(ctx context.Context, owner string, re | |||||||
| 
 | 
 | ||||||
| // GetBranch gets the specified branch for a repository. | // GetBranch gets the specified branch for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#get-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#get-a-branch | ||||||
| func (s *RepositoriesService) GetBranch(ctx context.Context, owner, repo, branch string) (*Branch, *Response, error) { | func (s *RepositoriesService) GetBranch(ctx context.Context, owner, repo, branch string) (*Branch, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -778,7 +971,7 @@ func (s *RepositoriesService) GetBranchProtection(ctx context.Context, owner, re | |||||||
| 
 | 
 | ||||||
| // GetRequiredStatusChecks gets the required status checks for a given protected branch. | // GetRequiredStatusChecks gets the required status checks for a given protected branch. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#get-required-status-checks-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#get-status-checks-protection | ||||||
| func (s *RepositoriesService) GetRequiredStatusChecks(ctx context.Context, owner, repo, branch string) (*RequiredStatusChecks, *Response, error) { | func (s *RepositoriesService) GetRequiredStatusChecks(ctx context.Context, owner, repo, branch string) (*RequiredStatusChecks, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -800,7 +993,7 @@ func (s *RepositoriesService) GetRequiredStatusChecks(ctx context.Context, owner | |||||||
| 
 | 
 | ||||||
| // ListRequiredStatusChecksContexts lists the required status checks contexts for a given protected branch. | // ListRequiredStatusChecksContexts lists the required status checks contexts for a given protected branch. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#list-required-status-checks-contexts-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#get-all-status-check-contexts | ||||||
| func (s *RepositoriesService) ListRequiredStatusChecksContexts(ctx context.Context, owner, repo, branch string) (contexts []string, resp *Response, err error) { | func (s *RepositoriesService) ListRequiredStatusChecksContexts(ctx context.Context, owner, repo, branch string) (contexts []string, resp *Response, err error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks/contexts", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks/contexts", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -843,7 +1036,7 @@ func (s *RepositoriesService) UpdateBranchProtection(ctx context.Context, owner, | |||||||
| 
 | 
 | ||||||
| // RemoveBranchProtection removes the protection of a given branch. | // RemoveBranchProtection removes the protection of a given branch. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#remove-branch-protection | // GitHub API docs: https://developer.github.com/v3/repos/branches/#delete-branch-protection | ||||||
| func (s *RepositoriesService) RemoveBranchProtection(ctx context.Context, owner, repo, branch string) (*Response, error) { | func (s *RepositoriesService) RemoveBranchProtection(ctx context.Context, owner, repo, branch string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -859,7 +1052,7 @@ func (s *RepositoriesService) RemoveBranchProtection(ctx context.Context, owner, | |||||||
| 
 | 
 | ||||||
| // GetSignaturesProtectedBranch gets required signatures of protected branch. | // GetSignaturesProtectedBranch gets required signatures of protected branch. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#get-required-signatures-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#get-commit-signature-protection | ||||||
| func (s *RepositoriesService) GetSignaturesProtectedBranch(ctx context.Context, owner, repo, branch string) (*SignaturesProtectedBranch, *Response, error) { | func (s *RepositoriesService) GetSignaturesProtectedBranch(ctx context.Context, owner, repo, branch string) (*SignaturesProtectedBranch, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -882,7 +1075,7 @@ func (s *RepositoriesService) GetSignaturesProtectedBranch(ctx context.Context, | |||||||
| // RequireSignaturesOnProtectedBranch makes signed commits required on a protected branch. | // RequireSignaturesOnProtectedBranch makes signed commits required on a protected branch. | ||||||
| // It requires admin access and branch protection to be enabled. | // It requires admin access and branch protection to be enabled. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#add-required-signatures-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#create-commit-signature-protection | ||||||
| func (s *RepositoriesService) RequireSignaturesOnProtectedBranch(ctx context.Context, owner, repo, branch string) (*SignaturesProtectedBranch, *Response, error) { | func (s *RepositoriesService) RequireSignaturesOnProtectedBranch(ctx context.Context, owner, repo, branch string) (*SignaturesProtectedBranch, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("POST", u, nil) | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
| @@ -904,7 +1097,7 @@ func (s *RepositoriesService) RequireSignaturesOnProtectedBranch(ctx context.Con | |||||||
| 
 | 
 | ||||||
| // OptionalSignaturesOnProtectedBranch removes required signed commits on a given branch. | // OptionalSignaturesOnProtectedBranch removes required signed commits on a given branch. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#remove-required-signatures-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#delete-commit-signature-protection | ||||||
| func (s *RepositoriesService) OptionalSignaturesOnProtectedBranch(ctx context.Context, owner, repo, branch string) (*Response, error) { | func (s *RepositoriesService) OptionalSignaturesOnProtectedBranch(ctx context.Context, owner, repo, branch string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -920,7 +1113,7 @@ func (s *RepositoriesService) OptionalSignaturesOnProtectedBranch(ctx context.Co | |||||||
| 
 | 
 | ||||||
| // UpdateRequiredStatusChecks updates the required status checks for a given protected branch. | // UpdateRequiredStatusChecks updates the required status checks for a given protected branch. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#update-required-status-checks-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#update-status-check-potection | ||||||
| func (s *RepositoriesService) UpdateRequiredStatusChecks(ctx context.Context, owner, repo, branch string, sreq *RequiredStatusChecksRequest) (*RequiredStatusChecks, *Response, error) { | func (s *RepositoriesService) UpdateRequiredStatusChecks(ctx context.Context, owner, repo, branch string, sreq *RequiredStatusChecksRequest) (*RequiredStatusChecks, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, sreq) | 	req, err := s.client.NewRequest("PATCH", u, sreq) | ||||||
| @@ -939,7 +1132,7 @@ func (s *RepositoriesService) UpdateRequiredStatusChecks(ctx context.Context, ow | |||||||
| 
 | 
 | ||||||
| // License gets the contents of a repository's license if one is detected. | // License gets the contents of a repository's license if one is detected. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/licenses/#get-the-contents-of-a-repositorys-license | // GitHub API docs: https://developer.github.com/v3/licenses/#get-the-license-for-a-repository | ||||||
| func (s *RepositoriesService) License(ctx context.Context, owner, repo string) (*RepositoryLicense, *Response, error) { | func (s *RepositoriesService) License(ctx context.Context, owner, repo string) (*RepositoryLicense, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/license", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/license", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -958,7 +1151,7 @@ func (s *RepositoriesService) License(ctx context.Context, owner, repo string) ( | |||||||
| 
 | 
 | ||||||
| // GetPullRequestReviewEnforcement gets pull request review enforcement of a protected branch. | // GetPullRequestReviewEnforcement gets pull request review enforcement of a protected branch. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#get-pull-request-review-enforcement-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#get-pull-request-review-protection | ||||||
| func (s *RepositoriesService) GetPullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string) (*PullRequestReviewsEnforcement, *Response, error) { | func (s *RepositoriesService) GetPullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string) (*PullRequestReviewsEnforcement, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -981,7 +1174,7 @@ func (s *RepositoriesService) GetPullRequestReviewEnforcement(ctx context.Contex | |||||||
| // UpdatePullRequestReviewEnforcement patches pull request review enforcement of a protected branch. | // UpdatePullRequestReviewEnforcement patches pull request review enforcement of a protected branch. | ||||||
| // It requires admin access and branch protection to be enabled. | // It requires admin access and branch protection to be enabled. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#update-pull-request-review-enforcement-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#update-pull-request-review-protection | ||||||
| func (s *RepositoriesService) UpdatePullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string, patch *PullRequestReviewsEnforcementUpdate) (*PullRequestReviewsEnforcement, *Response, error) { | func (s *RepositoriesService) UpdatePullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string, patch *PullRequestReviewsEnforcementUpdate) (*PullRequestReviewsEnforcement, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, patch) | 	req, err := s.client.NewRequest("PATCH", u, patch) | ||||||
| @@ -1004,13 +1197,13 @@ func (s *RepositoriesService) UpdatePullRequestReviewEnforcement(ctx context.Con | |||||||
| // DisableDismissalRestrictions disables dismissal restrictions of a protected branch. | // DisableDismissalRestrictions disables dismissal restrictions of a protected branch. | ||||||
| // It requires admin access and branch protection to be enabled. | // It requires admin access and branch protection to be enabled. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#update-pull-request-review-enforcement-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#update-pull-request-review-protection | ||||||
| func (s *RepositoriesService) DisableDismissalRestrictions(ctx context.Context, owner, repo, branch string) (*PullRequestReviewsEnforcement, *Response, error) { | func (s *RepositoriesService) DisableDismissalRestrictions(ctx context.Context, owner, repo, branch string) (*PullRequestReviewsEnforcement, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) | ||||||
| 
 | 
 | ||||||
| 	data := struct { | 	data := new(struct { | ||||||
| 		R []interface{} `json:"dismissal_restrictions"` | 		DismissalRestrictionsRequest `json:"dismissal_restrictions"` | ||||||
| 	}{[]interface{}{}} | 	}) | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, data) | 	req, err := s.client.NewRequest("PATCH", u, data) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -1031,7 +1224,7 @@ func (s *RepositoriesService) DisableDismissalRestrictions(ctx context.Context, | |||||||
| 
 | 
 | ||||||
| // RemovePullRequestReviewEnforcement removes pull request enforcement of a protected branch. | // RemovePullRequestReviewEnforcement removes pull request enforcement of a protected branch. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#remove-pull-request-review-enforcement-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#delete-pull-request-review-protection | ||||||
| func (s *RepositoriesService) RemovePullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string) (*Response, error) { | func (s *RepositoriesService) RemovePullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -1047,7 +1240,7 @@ func (s *RepositoriesService) RemovePullRequestReviewEnforcement(ctx context.Con | |||||||
| 
 | 
 | ||||||
| // GetAdminEnforcement gets admin enforcement information of a protected branch. | // GetAdminEnforcement gets admin enforcement information of a protected branch. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#get-admin-enforcement-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#get-admin-branch-protection | ||||||
| func (s *RepositoriesService) GetAdminEnforcement(ctx context.Context, owner, repo, branch string) (*AdminEnforcement, *Response, error) { | func (s *RepositoriesService) GetAdminEnforcement(ctx context.Context, owner, repo, branch string) (*AdminEnforcement, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -1070,7 +1263,7 @@ func (s *RepositoriesService) GetAdminEnforcement(ctx context.Context, owner, re | |||||||
| // AddAdminEnforcement adds admin enforcement to a protected branch. | // AddAdminEnforcement adds admin enforcement to a protected branch. | ||||||
| // It requires admin access and branch protection to be enabled. | // It requires admin access and branch protection to be enabled. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#add-admin-enforcement-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#set-admin-branch-protection | ||||||
| func (s *RepositoriesService) AddAdminEnforcement(ctx context.Context, owner, repo, branch string) (*AdminEnforcement, *Response, error) { | func (s *RepositoriesService) AddAdminEnforcement(ctx context.Context, owner, repo, branch string) (*AdminEnforcement, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("POST", u, nil) | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
| @@ -1092,7 +1285,7 @@ func (s *RepositoriesService) AddAdminEnforcement(ctx context.Context, owner, re | |||||||
| 
 | 
 | ||||||
| // RemoveAdminEnforcement removes admin enforcement from a protected branch. | // RemoveAdminEnforcement removes admin enforcement from a protected branch. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/branches/#remove-admin-enforcement-of-protected-branch | // GitHub API docs: https://developer.github.com/v3/repos/branches/#delete-admin-branch-protection | ||||||
| func (s *RepositoriesService) RemoveAdminEnforcement(ctx context.Context, owner, repo, branch string) (*Response, error) { | func (s *RepositoriesService) RemoveAdminEnforcement(ctx context.Context, owner, repo, branch string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch) | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -1113,7 +1306,7 @@ type repositoryTopics struct { | |||||||
| 
 | 
 | ||||||
| // ListAllTopics lists topics for a repository. | // ListAllTopics lists topics for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#list-all-topics-for-a-repository | // GitHub API docs: https://developer.github.com/v3/repos/#get-all-repository-topics | ||||||
| func (s *RepositoriesService) ListAllTopics(ctx context.Context, owner, repo string) ([]string, *Response, error) { | func (s *RepositoriesService) ListAllTopics(ctx context.Context, owner, repo string) ([]string, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/topics", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/topics", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -1135,7 +1328,7 @@ func (s *RepositoriesService) ListAllTopics(ctx context.Context, owner, repo str | |||||||
| 
 | 
 | ||||||
| // ReplaceAllTopics replaces topics for a repository. | // ReplaceAllTopics replaces topics for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/#replace-all-topics-for-a-repository | // GitHub API docs: https://developer.github.com/v3/repos/#replace-all-repository-topics | ||||||
| func (s *RepositoriesService) ReplaceAllTopics(ctx context.Context, owner, repo string, topics []string) ([]string, *Response, error) { | func (s *RepositoriesService) ReplaceAllTopics(ctx context.Context, owner, repo string, topics []string) ([]string, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/topics", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/topics", owner, repo) | ||||||
| 	t := &repositoryTopics{ | 	t := &repositoryTopics{ | ||||||
| @@ -1161,6 +1354,93 @@ func (s *RepositoriesService) ReplaceAllTopics(ctx context.Context, owner, repo | |||||||
| 	return t.Names, resp, nil | 	return t.Names, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // ListApps lists the Github apps that have push access to a given protected branch. | ||||||
|  | // It requires the Github apps to have `write` access to the `content` permission. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/branches/#list-apps-with-access-to-the-protected-branch | ||||||
|  | func (s *RepositoriesService) ListApps(ctx context.Context, owner, repo, branch string) ([]*App, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var apps []*App | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &apps) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return apps, resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReplaceAppRestrictions replaces the apps that have push access to a given protected branch. | ||||||
|  | // It removes all apps that previously had push access and grants push access to the new list of apps. | ||||||
|  | // It requires the Github apps to have `write` access to the `content` permission. | ||||||
|  | // | ||||||
|  | // Note: The list of users, apps, and teams in total is limited to 100 items. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/branches/#set-app-access-restrictions | ||||||
|  | func (s *RepositoriesService) ReplaceAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch) | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, slug) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var apps []*App | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &apps) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return apps, resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AddAppRestrictions grants the specified apps push access to a given protected branch. | ||||||
|  | // It requires the Github apps to have `write` access to the `content` permission. | ||||||
|  | // | ||||||
|  | // Note: The list of users, apps, and teams in total is limited to 100 items. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/branches/#add-app-access-restrictions | ||||||
|  | func (s *RepositoriesService) AddAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch) | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, slug) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var apps []*App | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &apps) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return apps, resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // RemoveAppRestrictions removes the ability of an app to push to this branch. | ||||||
|  | // It requires the Github apps to have `write` access to the `content` permission. | ||||||
|  | // | ||||||
|  | // Note: The list of users, apps, and teams in total is limited to 100 items. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/branches/#remove-app-access-restrictions | ||||||
|  | func (s *RepositoriesService) RemoveAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, slug) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var apps []*App | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &apps) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return apps, resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // TransferRequest represents a request to transfer a repository. | // TransferRequest represents a request to transfer a repository. | ||||||
| type TransferRequest struct { | type TransferRequest struct { | ||||||
| 	NewOwner string  `json:"new_owner"` | 	NewOwner string  `json:"new_owner"` | ||||||
| @@ -1184,8 +1464,34 @@ func (s *RepositoriesService) Transfer(ctx context.Context, owner, repo string, | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. | 	r := new(Repository) | ||||||
| 	req.Header.Set("Accept", mediaTypeRepositoryTransferPreview) | 	resp, err := s.client.Do(ctx, req, r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return r, resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DispatchRequestOptions represents a request to trigger a repository_dispatch event. | ||||||
|  | type DispatchRequestOptions struct { | ||||||
|  | 	// EventType is a custom webhook event name. (Required.) | ||||||
|  | 	EventType string `json:"event_type"` | ||||||
|  | 	// ClientPayload is a custom JSON payload with extra information about the webhook event. | ||||||
|  | 	// Defaults to an empty JSON object. | ||||||
|  | 	ClientPayload *json.RawMessage `json:"client_payload,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Dispatch triggers a repository_dispatch event in a GitHub Actions workflow. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/#create-a-repository-dispatch-event | ||||||
|  | func (s *RepositoriesService) Dispatch(ctx context.Context, owner, repo string, opts DispatchRequestOptions) (*Repository, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/dispatches", owner, repo) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, &opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	r := new(Repository) | 	r := new(Repository) | ||||||
| 	resp, err := s.client.Do(ctx, req, r) | 	resp, err := s.client.Do(ctx, req, r) | ||||||
| @@ -26,12 +26,25 @@ type ListCollaboratorsOptions struct { | |||||||
| 	ListOptions | 	ListOptions | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // CollaboratorInvitation represents an invitation created when adding a collaborator. | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#response-when-a-new-invitation-is-created | ||||||
|  | type CollaboratorInvitation struct { | ||||||
|  | 	ID          *int64      `json:"id,omitempty"` | ||||||
|  | 	Repo        *Repository `json:"repository,omitempty"` | ||||||
|  | 	Invitee     *User       `json:"invitee,omitempty"` | ||||||
|  | 	Inviter     *User       `json:"inviter,omitempty"` | ||||||
|  | 	Permissions *string     `json:"permissions,omitempty"` | ||||||
|  | 	CreatedAt   *Timestamp  `json:"created_at,omitempty"` | ||||||
|  | 	URL         *string     `json:"url,omitempty"` | ||||||
|  | 	HTMLURL     *string     `json:"html_url,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ListCollaborators lists the GitHub users that have access to the repository. | // ListCollaborators lists the GitHub users that have access to the repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#list-collaborators | // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#list-repository-collaborators | ||||||
| func (s *RepositoriesService) ListCollaborators(ctx context.Context, owner, repo string, opt *ListCollaboratorsOptions) ([]*User, *Response, error) { | func (s *RepositoriesService) ListCollaborators(ctx context.Context, owner, repo string, opts *ListCollaboratorsOptions) ([]*User, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/collaborators", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/collaborators", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -41,8 +54,6 @@ func (s *RepositoriesService) ListCollaborators(ctx context.Context, owner, repo | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |  | ||||||
| 
 |  | ||||||
| 	var users []*User | 	var users []*User | ||||||
| 	resp, err := s.client.Do(ctx, req, &users) | 	resp, err := s.client.Do(ctx, req, &users) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -57,7 +68,7 @@ func (s *RepositoriesService) ListCollaborators(ctx context.Context, owner, repo | |||||||
| // Note: This will return false if the user is not a collaborator OR the user | // Note: This will return false if the user is not a collaborator OR the user | ||||||
| // is not a GitHub user. | // is not a GitHub user. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#get | // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#check-if-a-user-is-a-repository-collaborator | ||||||
| func (s *RepositoriesService) IsCollaborator(ctx context.Context, owner, repo, user string) (bool, *Response, error) { | func (s *RepositoriesService) IsCollaborator(ctx context.Context, owner, repo, user string) (bool, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user) | 	u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -80,7 +91,7 @@ type RepositoryPermissionLevel struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetPermissionLevel retrieves the specific permission level a collaborator has for a given repository. | // GetPermissionLevel retrieves the specific permission level a collaborator has for a given repository. | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#review-a-users-permission-level | // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#get-repository-permissions-for-a-user | ||||||
| func (s *RepositoriesService) GetPermissionLevel(ctx context.Context, owner, repo, user string) (*RepositoryPermissionLevel, *Response, error) { | func (s *RepositoriesService) GetPermissionLevel(ctx context.Context, owner, repo, user string) (*RepositoryPermissionLevel, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/collaborators/%v/permission", owner, repo, user) | 	u := fmt.Sprintf("repos/%v/%v/collaborators/%v/permission", owner, repo, user) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -104,6 +115,8 @@ type RepositoryAddCollaboratorOptions struct { | |||||||
| 	//     pull - team members can pull, but not push to or administer this repository | 	//     pull - team members can pull, but not push to or administer this repository | ||||||
| 	//     push - team members can pull and push, but not administer this repository | 	//     push - team members can pull and push, but not administer this repository | ||||||
| 	//     admin - team members can pull, push and administer this repository | 	//     admin - team members can pull, push and administer this repository | ||||||
|  | 	//     maintain - team members can manage the repository without access to sensitive or destructive actions. | ||||||
|  | 	//     triage - team members can proactively manage issues and pull requests without write access. | ||||||
| 	// | 	// | ||||||
| 	// Default value is "push". This option is only valid for organization-owned repositories. | 	// Default value is "push". This option is only valid for organization-owned repositories. | ||||||
| 	Permission string `json:"permission,omitempty"` | 	Permission string `json:"permission,omitempty"` | ||||||
| @@ -112,21 +125,25 @@ type RepositoryAddCollaboratorOptions struct { | |||||||
| // AddCollaborator sends an invitation to the specified GitHub user | // AddCollaborator sends an invitation to the specified GitHub user | ||||||
| // to become a collaborator to the given repo. | // to become a collaborator to the given repo. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#add-user-as-a-collaborator | // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#add-a-repository-collaborator | ||||||
| func (s *RepositoriesService) AddCollaborator(ctx context.Context, owner, repo, user string, opt *RepositoryAddCollaboratorOptions) (*Response, error) { | func (s *RepositoriesService) AddCollaborator(ctx context.Context, owner, repo, user string, opts *RepositoryAddCollaboratorOptions) (*CollaboratorInvitation, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user) | 	u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, opt) | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 	acr := new(CollaboratorInvitation) | ||||||
| 	return s.client.Do(ctx, req, nil) | 	resp, err := s.client.Do(ctx, req, acr) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 	return acr, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // RemoveCollaborator removes the specified GitHub user as collaborator from the given repo. | // RemoveCollaborator removes the specified GitHub user as collaborator from the given repo. | ||||||
| // Note: Does not return error if a valid user that is not a collaborator is removed. | // Note: Does not return error if a valid user that is not a collaborator is removed. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#remove-collaborator | // GitHub API docs: https://developer.github.com/v3/repos/collaborators/#remove-a-repository-collaborator | ||||||
| func (s *RepositoriesService) RemoveCollaborator(ctx context.Context, owner, repo, user string) (*Response, error) { | func (s *RepositoriesService) RemoveCollaborator(ctx context.Context, owner, repo, user string) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user) | 	u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -16,6 +16,7 @@ type RepositoryComment struct { | |||||||
| 	HTMLURL   *string    `json:"html_url,omitempty"` | 	HTMLURL   *string    `json:"html_url,omitempty"` | ||||||
| 	URL       *string    `json:"url,omitempty"` | 	URL       *string    `json:"url,omitempty"` | ||||||
| 	ID        *int64     `json:"id,omitempty"` | 	ID        *int64     `json:"id,omitempty"` | ||||||
|  | 	NodeID    *string    `json:"node_id,omitempty"` | ||||||
| 	CommitID  *string    `json:"commit_id,omitempty"` | 	CommitID  *string    `json:"commit_id,omitempty"` | ||||||
| 	User      *User      `json:"user,omitempty"` | 	User      *User      `json:"user,omitempty"` | ||||||
| 	Reactions *Reactions `json:"reactions,omitempty"` | 	Reactions *Reactions `json:"reactions,omitempty"` | ||||||
| @@ -36,9 +37,9 @@ func (r RepositoryComment) String() string { | |||||||
| // ListComments lists all the comments for the repository. | // ListComments lists all the comments for the repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository | // GitHub API docs: https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository | ||||||
| func (s *RepositoriesService) ListComments(ctx context.Context, owner, repo string, opt *ListOptions) ([]*RepositoryComment, *Response, error) { | func (s *RepositoriesService) ListComments(ctx context.Context, owner, repo string, opts *ListOptions) ([]*RepositoryComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/comments", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/comments", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -62,10 +63,10 @@ func (s *RepositoriesService) ListComments(ctx context.Context, owner, repo stri | |||||||
| 
 | 
 | ||||||
| // ListCommitComments lists all the comments for a given commit SHA. | // ListCommitComments lists all the comments for a given commit SHA. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/comments/#list-comments-for-a-single-commit | // GitHub API docs: https://developer.github.com/v3/repos/comments/#list-commit-comments | ||||||
| func (s *RepositoriesService) ListCommitComments(ctx context.Context, owner, repo, sha string, opt *ListOptions) ([]*RepositoryComment, *Response, error) { | func (s *RepositoriesService) ListCommitComments(ctx context.Context, owner, repo, sha string, opts *ListOptions) ([]*RepositoryComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/commits/%v/comments", owner, repo, sha) | 	u := fmt.Sprintf("repos/%v/%v/commits/%v/comments", owner, repo, sha) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -109,7 +110,7 @@ func (s *RepositoriesService) CreateComment(ctx context.Context, owner, repo, sh | |||||||
| 
 | 
 | ||||||
| // GetComment gets a single comment from a repository. | // GetComment gets a single comment from a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/comments/#get-a-single-commit-comment | // GitHub API docs: https://developer.github.com/v3/repos/comments/#get-a-commit-comment | ||||||
| func (s *RepositoriesService) GetComment(ctx context.Context, owner, repo string, id int64) (*RepositoryComment, *Response, error) { | func (s *RepositoriesService) GetComment(ctx context.Context, owner, repo string, id int64) (*RepositoryComment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/comments/%v", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/comments/%v", owner, repo, id) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -9,7 +9,6 @@ import ( | |||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/url" |  | ||||||
| 	"time" | 	"time" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @@ -17,19 +16,20 @@ import ( | |||||||
| // Note that it's wrapping a Commit, so author/committer information is in two places, | // Note that it's wrapping a Commit, so author/committer information is in two places, | ||||||
| // but contain different details about them: in RepositoryCommit "github details", in Commit - "git details". | // but contain different details about them: in RepositoryCommit "github details", in Commit - "git details". | ||||||
| type RepositoryCommit struct { | type RepositoryCommit struct { | ||||||
| 	SHA         *string  `json:"sha,omitempty"` | 	NodeID      *string   `json:"node_id,omitempty"` | ||||||
| 	Commit      *Commit  `json:"commit,omitempty"` | 	SHA         *string   `json:"sha,omitempty"` | ||||||
| 	Author      *User    `json:"author,omitempty"` | 	Commit      *Commit   `json:"commit,omitempty"` | ||||||
| 	Committer   *User    `json:"committer,omitempty"` | 	Author      *User     `json:"author,omitempty"` | ||||||
| 	Parents     []Commit `json:"parents,omitempty"` | 	Committer   *User     `json:"committer,omitempty"` | ||||||
| 	HTMLURL     *string  `json:"html_url,omitempty"` | 	Parents     []*Commit `json:"parents,omitempty"` | ||||||
| 	URL         *string  `json:"url,omitempty"` | 	HTMLURL     *string   `json:"html_url,omitempty"` | ||||||
| 	CommentsURL *string  `json:"comments_url,omitempty"` | 	URL         *string   `json:"url,omitempty"` | ||||||
|  | 	CommentsURL *string   `json:"comments_url,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// Details about how many changes were made in this commit. Only filled in during GetCommit! | 	// Details about how many changes were made in this commit. Only filled in during GetCommit! | ||||||
| 	Stats *CommitStats `json:"stats,omitempty"` | 	Stats *CommitStats `json:"stats,omitempty"` | ||||||
| 	// Details about which files, and how this commit touched. Only filled in during GetCommit! | 	// Details about which files, and how this commit touched. Only filled in during GetCommit! | ||||||
| 	Files []CommitFile `json:"files,omitempty"` | 	Files []*CommitFile `json:"files,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r RepositoryCommit) String() string { | func (r RepositoryCommit) String() string { | ||||||
| @@ -78,9 +78,9 @@ type CommitsComparison struct { | |||||||
| 	BehindBy     *int    `json:"behind_by,omitempty"` | 	BehindBy     *int    `json:"behind_by,omitempty"` | ||||||
| 	TotalCommits *int    `json:"total_commits,omitempty"` | 	TotalCommits *int    `json:"total_commits,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	Commits []RepositoryCommit `json:"commits,omitempty"` | 	Commits []*RepositoryCommit `json:"commits,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	Files []CommitFile `json:"files,omitempty"` | 	Files []*CommitFile `json:"files,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	HTMLURL      *string `json:"html_url,omitempty"` | 	HTMLURL      *string `json:"html_url,omitempty"` | ||||||
| 	PermalinkURL *string `json:"permalink_url,omitempty"` | 	PermalinkURL *string `json:"permalink_url,omitempty"` | ||||||
| @@ -114,12 +114,19 @@ type CommitsListOptions struct { | |||||||
| 	ListOptions | 	ListOptions | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // BranchCommit is the result of listing branches with commit SHA. | ||||||
|  | type BranchCommit struct { | ||||||
|  | 	Name      *string `json:"name,omitempty"` | ||||||
|  | 	Commit    *Commit `json:"commit,omitempty"` | ||||||
|  | 	Protected *bool   `json:"protected,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ListCommits lists the commits of a repository. | // ListCommits lists the commits of a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/commits/#list | // GitHub API docs: https://developer.github.com/v3/repos/commits/#list-commits | ||||||
| func (s *RepositoriesService) ListCommits(ctx context.Context, owner, repo string, opt *CommitsListOptions) ([]*RepositoryCommit, *Response, error) { | func (s *RepositoriesService) ListCommits(ctx context.Context, owner, repo string, opts *CommitsListOptions) ([]*RepositoryCommit, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/commits", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/commits", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -141,7 +148,7 @@ func (s *RepositoriesService) ListCommits(ctx context.Context, owner, repo strin | |||||||
| // GetCommit fetches the specified commit, including all details about it. | // GetCommit fetches the specified commit, including all details about it. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/commits/#get-a-single-commit | // GitHub API docs: https://developer.github.com/v3/repos/commits/#get-a-single-commit | ||||||
| // See also: https://developer.github.com/v3/git/commits/#get-a-single-commit provides the same functionality | // GitHub API docs: https://developer.github.com/v3/repos/commits/#get-a-commit | ||||||
| func (s *RepositoriesService) GetCommit(ctx context.Context, owner, repo, sha string) (*RepositoryCommit, *Response, error) { | func (s *RepositoriesService) GetCommit(ctx context.Context, owner, repo, sha string) (*RepositoryCommit, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/commits/%v", owner, repo, sha) | 	u := fmt.Sprintf("repos/%v/%v/commits/%v", owner, repo, sha) | ||||||
| 
 | 
 | ||||||
| @@ -160,20 +167,22 @@ func (s *RepositoriesService) GetCommit(ctx context.Context, owner, repo, sha st | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetCommitRaw fetches the specified commit in raw (diff or patch) format. | // GetCommitRaw fetches the specified commit in raw (diff or patch) format. | ||||||
| func (s *RepositoriesService) GetCommitRaw(ctx context.Context, owner string, repo string, sha string, opt RawOptions) (string, *Response, error) { | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/commits/#get-a-commit | ||||||
|  | func (s *RepositoriesService) GetCommitRaw(ctx context.Context, owner string, repo string, sha string, opts RawOptions) (string, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/commits/%v", owner, repo, sha) | 	u := fmt.Sprintf("repos/%v/%v/commits/%v", owner, repo, sha) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", nil, err | 		return "", nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	switch opt.Type { | 	switch opts.Type { | ||||||
| 	case Diff: | 	case Diff: | ||||||
| 		req.Header.Set("Accept", mediaTypeV3Diff) | 		req.Header.Set("Accept", mediaTypeV3Diff) | ||||||
| 	case Patch: | 	case Patch: | ||||||
| 		req.Header.Set("Accept", mediaTypeV3Patch) | 		req.Header.Set("Accept", mediaTypeV3Patch) | ||||||
| 	default: | 	default: | ||||||
| 		return "", nil, fmt.Errorf("unsupported raw type %d", opt.Type) | 		return "", nil, fmt.Errorf("unsupported raw type %d", opts.Type) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var buf bytes.Buffer | 	var buf bytes.Buffer | ||||||
| @@ -188,9 +197,9 @@ func (s *RepositoriesService) GetCommitRaw(ctx context.Context, owner string, re | |||||||
| // GetCommitSHA1 gets the SHA-1 of a commit reference. If a last-known SHA1 is | // GetCommitSHA1 gets the SHA-1 of a commit reference. If a last-known SHA1 is | ||||||
| // supplied and no new commits have occurred, a 304 Unmodified response is returned. | // supplied and no new commits have occurred, a 304 Unmodified response is returned. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/commits/#get-the-sha-1-of-a-commit-reference | // GitHub API docs: https://developer.github.com/v3/repos/commits/#get-a-commit | ||||||
| func (s *RepositoriesService) GetCommitSHA1(ctx context.Context, owner, repo, ref, lastSHA string) (string, *Response, error) { | func (s *RepositoriesService) GetCommitSHA1(ctx context.Context, owner, repo, ref, lastSHA string) (string, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/commits/%v", owner, repo, url.QueryEscape(ref)) | 	u := fmt.Sprintf("repos/%v/%v/commits/%v", owner, repo, refURLEscape(ref)) | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -231,3 +240,26 @@ func (s *RepositoriesService) CompareCommits(ctx context.Context, owner, repo st | |||||||
| 
 | 
 | ||||||
| 	return comp, resp, nil | 	return comp, resp, nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // ListBranchesHeadCommit gets all branches where the given commit SHA is the HEAD, | ||||||
|  | // or latest commit for the branch. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/commits/#list-branches-for-head-commit | ||||||
|  | func (s *RepositoriesService) ListBranchesHeadCommit(ctx context.Context, owner, repo, sha string) ([]*BranchCommit, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/commits/%v/branches-where-head", owner, repo, sha) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeListPullsOrBranchesForCommitPreview) | ||||||
|  | 	var branchCommits []*BranchCommit | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &branchCommits) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return branchCommits, resp, nil | ||||||
|  | } | ||||||
| @@ -38,7 +38,7 @@ type CommunityHealthMetrics struct { | |||||||
| 
 | 
 | ||||||
| // GetCommunityHealthMetrics retrieves all the community health  metrics for a  repository. | // GetCommunityHealthMetrics retrieves all the community health  metrics for a  repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/community/#retrieve-community-health-metrics | // GitHub API docs: https://developer.github.com/v3/repos/community/#get-community-profile-metrics | ||||||
| func (s *RepositoriesService) GetCommunityHealthMetrics(ctx context.Context, owner, repo string) (*CommunityHealthMetrics, *Response, error) { | func (s *RepositoriesService) GetCommunityHealthMetrics(ctx context.Context, owner, repo string) (*CommunityHealthMetrics, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/community/profile", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/community/profile", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -12,6 +12,7 @@ import ( | |||||||
| 	"context" | 	"context" | ||||||
| 	"encoding/base64" | 	"encoding/base64" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| @@ -76,6 +77,9 @@ func (r *RepositoryContent) GetContent() (string, error) { | |||||||
| 
 | 
 | ||||||
| 	switch encoding { | 	switch encoding { | ||||||
| 	case "base64": | 	case "base64": | ||||||
|  | 		if r.Content == nil { | ||||||
|  | 			return "", errors.New("malformed response: base64 encoding of null content") | ||||||
|  | 		} | ||||||
| 		c, err := base64.StdEncoding.DecodeString(*r.Content) | 		c, err := base64.StdEncoding.DecodeString(*r.Content) | ||||||
| 		return string(c), err | 		return string(c), err | ||||||
| 	case "": | 	case "": | ||||||
| @@ -90,10 +94,10 @@ func (r *RepositoryContent) GetContent() (string, error) { | |||||||
| 
 | 
 | ||||||
| // GetReadme gets the Readme file for the repository. | // GetReadme gets the Readme file for the repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/contents/#get-the-readme | // GitHub API docs: https://developer.github.com/v3/repos/contents/#get-a-repository-readme | ||||||
| func (s *RepositoriesService) GetReadme(ctx context.Context, owner, repo string, opt *RepositoryContentGetOptions) (*RepositoryContent, *Response, error) { | func (s *RepositoriesService) GetReadme(ctx context.Context, owner, repo string, opts *RepositoryContentGetOptions) (*RepositoryContent, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/readme", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/readme", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -113,10 +117,10 @@ func (s *RepositoriesService) GetReadme(ctx context.Context, owner, repo string, | |||||||
| // specified file. This function will work with files of any size, as opposed | // specified file. This function will work with files of any size, as opposed | ||||||
| // to GetContents which is limited to 1 Mb files. It is the caller's | // to GetContents which is limited to 1 Mb files. It is the caller's | ||||||
| // responsibility to close the ReadCloser. | // responsibility to close the ReadCloser. | ||||||
| func (s *RepositoriesService) DownloadContents(ctx context.Context, owner, repo, filepath string, opt *RepositoryContentGetOptions) (io.ReadCloser, error) { | func (s *RepositoriesService) DownloadContents(ctx context.Context, owner, repo, filepath string, opts *RepositoryContentGetOptions) (io.ReadCloser, error) { | ||||||
| 	dir := path.Dir(filepath) | 	dir := path.Dir(filepath) | ||||||
| 	filename := path.Base(filepath) | 	filename := path.Base(filepath) | ||||||
| 	_, dirContents, _, err := s.GetContents(ctx, owner, repo, dir, opt) | 	_, dirContents, _, err := s.GetContents(ctx, owner, repo, dir, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -142,11 +146,11 @@ func (s *RepositoriesService) DownloadContents(ctx context.Context, owner, repo, | |||||||
| // as possible, both result types will be returned but only one will contain a | // as possible, both result types will be returned but only one will contain a | ||||||
| // value and the other will be nil. | // value and the other will be nil. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/contents/#get-contents | // GitHub API docs: https://developer.github.com/v3/repos/contents/#get-repository-content | ||||||
| func (s *RepositoriesService) GetContents(ctx context.Context, owner, repo, path string, opt *RepositoryContentGetOptions) (fileContent *RepositoryContent, directoryContent []*RepositoryContent, resp *Response, err error) { | func (s *RepositoriesService) GetContents(ctx context.Context, owner, repo, path string, opts *RepositoryContentGetOptions) (fileContent *RepositoryContent, directoryContent []*RepositoryContent, resp *Response, err error) { | ||||||
| 	escapedPath := (&url.URL{Path: path}).String() | 	escapedPath := (&url.URL{Path: path}).String() | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, escapedPath) | 	u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, escapedPath) | ||||||
| 	u, err = addOptions(u, opt) | 	u, err = addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, nil, err | 		return nil, nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -173,10 +177,10 @@ func (s *RepositoriesService) GetContents(ctx context.Context, owner, repo, path | |||||||
| // CreateFile creates a new file in a repository at the given path and returns | // CreateFile creates a new file in a repository at the given path and returns | ||||||
| // the commit and file metadata. | // the commit and file metadata. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/contents/#create-a-file | // GitHub API docs: https://developer.github.com/v3/repos/contents/#create-or-update-file-contents | ||||||
| func (s *RepositoriesService) CreateFile(ctx context.Context, owner, repo, path string, opt *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) { | func (s *RepositoriesService) CreateFile(ctx context.Context, owner, repo, path string, opts *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path) | 	u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, opt) | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -191,10 +195,10 @@ func (s *RepositoriesService) CreateFile(ctx context.Context, owner, repo, path | |||||||
| // UpdateFile updates a file in a repository at the given path and returns the | // UpdateFile updates a file in a repository at the given path and returns the | ||||||
| // commit and file metadata. Requires the blob SHA of the file being updated. | // commit and file metadata. Requires the blob SHA of the file being updated. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/contents/#update-a-file | // GitHub API docs: https://developer.github.com/v3/repos/contents/#create-or-update-file-contents | ||||||
| func (s *RepositoriesService) UpdateFile(ctx context.Context, owner, repo, path string, opt *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) { | func (s *RepositoriesService) UpdateFile(ctx context.Context, owner, repo, path string, opts *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path) | 	u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path) | ||||||
| 	req, err := s.client.NewRequest("PUT", u, opt) | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -210,9 +214,9 @@ func (s *RepositoriesService) UpdateFile(ctx context.Context, owner, repo, path | |||||||
| // Requires the blob SHA of the file to be deleted. | // Requires the blob SHA of the file to be deleted. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/contents/#delete-a-file | // GitHub API docs: https://developer.github.com/v3/repos/contents/#delete-a-file | ||||||
| func (s *RepositoriesService) DeleteFile(ctx context.Context, owner, repo, path string, opt *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) { | func (s *RepositoriesService) DeleteFile(ctx context.Context, owner, repo, path string, opts *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path) | 	u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, opt) | 	req, err := s.client.NewRequest("DELETE", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -224,15 +228,15 @@ func (s *RepositoriesService) DeleteFile(ctx context.Context, owner, repo, path | |||||||
| 	return deleteResponse, resp, nil | 	return deleteResponse, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // archiveFormat is used to define the archive type when calling GetArchiveLink. | // ArchiveFormat is used to define the archive type when calling GetArchiveLink. | ||||||
| type archiveFormat string | type ArchiveFormat string | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| 	// Tarball specifies an archive in gzipped tar format. | 	// Tarball specifies an archive in gzipped tar format. | ||||||
| 	Tarball archiveFormat = "tarball" | 	Tarball ArchiveFormat = "tarball" | ||||||
| 
 | 
 | ||||||
| 	// Zipball specifies an archive in zip format. | 	// Zipball specifies an archive in zip format. | ||||||
| 	Zipball archiveFormat = "zipball" | 	Zipball ArchiveFormat = "zipball" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // GetArchiveLink returns an URL to download a tarball or zipball archive for a | // GetArchiveLink returns an URL to download a tarball or zipball archive for a | ||||||
| @@ -240,15 +244,28 @@ const ( | |||||||
| // or github.Zipball constant. | // or github.Zipball constant. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/contents/#get-archive-link | // GitHub API docs: https://developer.github.com/v3/repos/contents/#get-archive-link | ||||||
| func (s *RepositoriesService) GetArchiveLink(ctx context.Context, owner, repo string, archiveformat archiveFormat, opt *RepositoryContentGetOptions) (*url.URL, *Response, error) { | func (s *RepositoriesService) GetArchiveLink(ctx context.Context, owner, repo string, archiveformat ArchiveFormat, opts *RepositoryContentGetOptions, followRedirects bool) (*url.URL, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/%s", owner, repo, archiveformat) | 	u := fmt.Sprintf("repos/%s/%s/%s", owner, repo, archiveformat) | ||||||
| 	if opt != nil && opt.Ref != "" { | 	if opts != nil && opts.Ref != "" { | ||||||
| 		u += fmt.Sprintf("/%s", opt.Ref) | 		u += fmt.Sprintf("/%s", opts.Ref) | ||||||
| 	} | 	} | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	resp, err := s.getArchiveLinkFromURL(ctx, u, followRedirects) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
|  | 	if resp.StatusCode != http.StatusFound { | ||||||
|  | 		return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) | ||||||
|  | 	} | ||||||
|  | 	parsedURL, err := url.Parse(resp.Header.Get("Location")) | ||||||
|  | 	return parsedURL, newResponse(resp), err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *RepositoriesService) getArchiveLinkFromURL(ctx context.Context, u string, followRedirects bool) (*http.Response, error) { | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	var resp *http.Response | 	var resp *http.Response | ||||||
| 	// Use http.DefaultTransport if no custom Transport is configured | 	// Use http.DefaultTransport if no custom Transport is configured | ||||||
| 	req = withContext(ctx, req) | 	req = withContext(ctx, req) | ||||||
| @@ -258,12 +275,14 @@ func (s *RepositoriesService) GetArchiveLink(ctx context.Context, owner, repo st | |||||||
| 		resp, err = s.client.client.Transport.RoundTrip(req) | 		resp, err = s.client.client.Transport.RoundTrip(req) | ||||||
| 	} | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	resp.Body.Close() | 	resp.Body.Close() | ||||||
| 	if resp.StatusCode != http.StatusFound { | 
 | ||||||
| 		return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) | 	// If redirect response is returned, follow it | ||||||
|  | 	if followRedirects && resp.StatusCode == http.StatusMovedPermanently { | ||||||
|  | 		u = resp.Header.Get("Location") | ||||||
|  | 		resp, err = s.getArchiveLinkFromURL(ctx, u, false) | ||||||
| 	} | 	} | ||||||
| 	parsedURL, err := url.Parse(resp.Header.Get("Location")) | 	return resp, err | ||||||
| 	return parsedURL, newResponse(resp), err |  | ||||||
| } | } | ||||||
| @@ -32,15 +32,15 @@ type Deployment struct { | |||||||
| 
 | 
 | ||||||
| // DeploymentRequest represents a deployment request | // DeploymentRequest represents a deployment request | ||||||
| type DeploymentRequest struct { | type DeploymentRequest struct { | ||||||
| 	Ref                   *string   `json:"ref,omitempty"` | 	Ref                   *string     `json:"ref,omitempty"` | ||||||
| 	Task                  *string   `json:"task,omitempty"` | 	Task                  *string     `json:"task,omitempty"` | ||||||
| 	AutoMerge             *bool     `json:"auto_merge,omitempty"` | 	AutoMerge             *bool       `json:"auto_merge,omitempty"` | ||||||
| 	RequiredContexts      *[]string `json:"required_contexts,omitempty"` | 	RequiredContexts      *[]string   `json:"required_contexts,omitempty"` | ||||||
| 	Payload               *string   `json:"payload,omitempty"` | 	Payload               interface{} `json:"payload,omitempty"` | ||||||
| 	Environment           *string   `json:"environment,omitempty"` | 	Environment           *string     `json:"environment,omitempty"` | ||||||
| 	Description           *string   `json:"description,omitempty"` | 	Description           *string     `json:"description,omitempty"` | ||||||
| 	TransientEnvironment  *bool     `json:"transient_environment,omitempty"` | 	TransientEnvironment  *bool       `json:"transient_environment,omitempty"` | ||||||
| 	ProductionEnvironment *bool     `json:"production_environment,omitempty"` | 	ProductionEnvironment *bool       `json:"production_environment,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // DeploymentsListOptions specifies the optional parameters to the | // DeploymentsListOptions specifies the optional parameters to the | ||||||
| @@ -64,9 +64,9 @@ type DeploymentsListOptions struct { | |||||||
| // ListDeployments lists the deployments of a repository. | // ListDeployments lists the deployments of a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/deployments/#list-deployments | // GitHub API docs: https://developer.github.com/v3/repos/deployments/#list-deployments | ||||||
| func (s *RepositoriesService) ListDeployments(ctx context.Context, owner, repo string, opt *DeploymentsListOptions) ([]*Deployment, *Response, error) { | func (s *RepositoriesService) ListDeployments(ctx context.Context, owner, repo string, opts *DeploymentsListOptions) ([]*Deployment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/deployments", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/deployments", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -87,7 +87,7 @@ func (s *RepositoriesService) ListDeployments(ctx context.Context, owner, repo s | |||||||
| 
 | 
 | ||||||
| // GetDeployment returns a single deployment of a repository. | // GetDeployment returns a single deployment of a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/deployments/#get-a-single-deployment | // GitHub API docs: https://developer.github.com/v3/repos/deployments/#get-a-deployment | ||||||
| func (s *RepositoriesService) GetDeployment(ctx context.Context, owner, repo string, deploymentID int64) (*Deployment, *Response, error) { | func (s *RepositoriesService) GetDeployment(ctx context.Context, owner, repo string, deploymentID int64) (*Deployment, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/deployments/%v", owner, repo, deploymentID) | 	u := fmt.Sprintf("repos/%v/%v/deployments/%v", owner, repo, deploymentID) | ||||||
| 
 | 
 | ||||||
| @@ -129,21 +129,38 @@ func (s *RepositoriesService) CreateDeployment(ctx context.Context, owner, repo | |||||||
| 	return d, resp, nil | 	return d, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // DeleteDeployment deletes an existing deployment for a repository. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/deployments/#delete-a-deployment | ||||||
|  | func (s *RepositoriesService) DeleteDeployment(ctx context.Context, owner, repo string, deploymentID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/deployments/%v", owner, repo, deploymentID) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // DeploymentStatus represents the status of a | // DeploymentStatus represents the status of a | ||||||
| // particular deployment. | // particular deployment. | ||||||
| type DeploymentStatus struct { | type DeploymentStatus struct { | ||||||
| 	ID *int64 `json:"id,omitempty"` | 	ID *int64 `json:"id,omitempty"` | ||||||
| 	// State is the deployment state. | 	// State is the deployment state. | ||||||
| 	// Possible values are: "pending", "success", "failure", "error", "inactive". | 	// Possible values are: "pending", "success", "failure", "error", | ||||||
| 	State         *string    `json:"state,omitempty"` | 	// "inactive", "in_progress", "queued". | ||||||
| 	Creator       *User      `json:"creator,omitempty"` | 	State          *string    `json:"state,omitempty"` | ||||||
| 	Description   *string    `json:"description,omitempty"` | 	Creator        *User      `json:"creator,omitempty"` | ||||||
| 	TargetURL     *string    `json:"target_url,omitempty"` | 	Description    *string    `json:"description,omitempty"` | ||||||
| 	CreatedAt     *Timestamp `json:"created_at,omitempty"` | 	Environment    *string    `json:"environment,omitempty"` | ||||||
| 	UpdatedAt     *Timestamp `json:"updated_at,omitempty"` | 	NodeID         *string    `json:"node_id,omitempty"` | ||||||
| 	DeploymentURL *string    `json:"deployment_url,omitempty"` | 	CreatedAt      *Timestamp `json:"created_at,omitempty"` | ||||||
| 	RepositoryURL *string    `json:"repository_url,omitempty"` | 	UpdatedAt      *Timestamp `json:"updated_at,omitempty"` | ||||||
| 	NodeID        *string    `json:"node_id,omitempty"` | 	TargetURL      *string    `json:"target_url,omitempty"` | ||||||
|  | 	DeploymentURL  *string    `json:"deployment_url,omitempty"` | ||||||
|  | 	RepositoryURL  *string    `json:"repository_url,omitempty"` | ||||||
|  | 	EnvironmentURL *string    `json:"environment_url,omitempty"` | ||||||
|  | 	LogURL         *string    `json:"log_url,omitempty"` | ||||||
|  | 	URL            *string    `json:"url,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // DeploymentStatusRequest represents a deployment request | // DeploymentStatusRequest represents a deployment request | ||||||
| @@ -159,9 +176,9 @@ type DeploymentStatusRequest struct { | |||||||
| // ListDeploymentStatuses lists the statuses of a given deployment of a repository. | // ListDeploymentStatuses lists the statuses of a given deployment of a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/deployments/#list-deployment-statuses | // GitHub API docs: https://developer.github.com/v3/repos/deployments/#list-deployment-statuses | ||||||
| func (s *RepositoriesService) ListDeploymentStatuses(ctx context.Context, owner, repo string, deployment int64, opt *ListOptions) ([]*DeploymentStatus, *Response, error) { | func (s *RepositoriesService) ListDeploymentStatuses(ctx context.Context, owner, repo string, deployment int64, opts *ListOptions) ([]*DeploymentStatus, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/deployments/%v/statuses", owner, repo, deployment) | 	u := fmt.Sprintf("repos/%v/%v/deployments/%v/statuses", owner, repo, deployment) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -171,6 +188,10 @@ func (s *RepositoriesService) ListDeploymentStatuses(ctx context.Context, owner, | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// TODO: remove custom Accept headers when APIs fully launch. | ||||||
|  | 	acceptHeaders := []string{mediaTypeDeploymentStatusPreview, mediaTypeExpandDeploymentStatusPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  | 
 | ||||||
| 	var statuses []*DeploymentStatus | 	var statuses []*DeploymentStatus | ||||||
| 	resp, err := s.client.Do(ctx, req, &statuses) | 	resp, err := s.client.Do(ctx, req, &statuses) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -182,7 +203,7 @@ func (s *RepositoriesService) ListDeploymentStatuses(ctx context.Context, owner, | |||||||
| 
 | 
 | ||||||
| // GetDeploymentStatus returns a single deployment status of a repository. | // GetDeploymentStatus returns a single deployment status of a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/deployments/#get-a-single-deployment-status | // GitHub API docs: https://developer.github.com/v3/repos/deployments/#get-a-deployment-status | ||||||
| func (s *RepositoriesService) GetDeploymentStatus(ctx context.Context, owner, repo string, deploymentID, deploymentStatusID int64) (*DeploymentStatus, *Response, error) { | func (s *RepositoriesService) GetDeploymentStatus(ctx context.Context, owner, repo string, deploymentID, deploymentStatusID int64) (*DeploymentStatus, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/deployments/%v/statuses/%v", owner, repo, deploymentID, deploymentStatusID) | 	u := fmt.Sprintf("repos/%v/%v/deployments/%v/statuses/%v", owner, repo, deploymentID, deploymentStatusID) | ||||||
| 
 | 
 | ||||||
| @@ -25,9 +25,9 @@ type RepositoryListForksOptions struct { | |||||||
| // ListForks lists the forks of the specified repository. | // ListForks lists the forks of the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/forks/#list-forks | // GitHub API docs: https://developer.github.com/v3/repos/forks/#list-forks | ||||||
| func (s *RepositoriesService) ListForks(ctx context.Context, owner, repo string, opt *RepositoryListForksOptions) ([]*Repository, *Response, error) { | func (s *RepositoriesService) ListForks(ctx context.Context, owner, repo string, opts *RepositoryListForksOptions) ([]*Repository, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/forks", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/forks", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -66,9 +66,9 @@ type RepositoryCreateForkOptions struct { | |||||||
| // in a successful request. | // in a successful request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/forks/#create-a-fork | // GitHub API docs: https://developer.github.com/v3/repos/forks/#create-a-fork | ||||||
| func (s *RepositoriesService) CreateFork(ctx context.Context, owner, repo string, opt *RepositoryCreateForkOptions) (*Repository, *Response, error) { | func (s *RepositoriesService) CreateFork(ctx context.Context, owner, repo string, opts *RepositoryCreateForkOptions) (*Repository, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/forks", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/forks", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -19,18 +19,18 @@ import ( | |||||||
| // | // | ||||||
| // GitHub API docs: https://help.github.com/articles/post-receive-hooks | // GitHub API docs: https://help.github.com/articles/post-receive-hooks | ||||||
| type WebHookPayload struct { | type WebHookPayload struct { | ||||||
| 	After      *string         `json:"after,omitempty"` | 	After      *string          `json:"after,omitempty"` | ||||||
| 	Before     *string         `json:"before,omitempty"` | 	Before     *string          `json:"before,omitempty"` | ||||||
| 	Commits    []WebHookCommit `json:"commits,omitempty"` | 	Commits    []*WebHookCommit `json:"commits,omitempty"` | ||||||
| 	Compare    *string         `json:"compare,omitempty"` | 	Compare    *string          `json:"compare,omitempty"` | ||||||
| 	Created    *bool           `json:"created,omitempty"` | 	Created    *bool            `json:"created,omitempty"` | ||||||
| 	Deleted    *bool           `json:"deleted,omitempty"` | 	Deleted    *bool            `json:"deleted,omitempty"` | ||||||
| 	Forced     *bool           `json:"forced,omitempty"` | 	Forced     *bool            `json:"forced,omitempty"` | ||||||
| 	HeadCommit *WebHookCommit  `json:"head_commit,omitempty"` | 	HeadCommit *WebHookCommit   `json:"head_commit,omitempty"` | ||||||
| 	Pusher     *User           `json:"pusher,omitempty"` | 	Pusher     *User            `json:"pusher,omitempty"` | ||||||
| 	Ref        *string         `json:"ref,omitempty"` | 	Ref        *string          `json:"ref,omitempty"` | ||||||
| 	Repo       *Repository     `json:"repository,omitempty"` | 	Repo       *Repository      `json:"repository,omitempty"` | ||||||
| 	Sender     *User           `json:"sender,omitempty"` | 	Sender     *User            `json:"sender,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (w WebHookPayload) String() string { | func (w WebHookPayload) String() string { | ||||||
| @@ -104,7 +104,7 @@ type createHookRequest struct { | |||||||
| // Note that only a subset of the hook fields are used and hook must | // Note that only a subset of the hook fields are used and hook must | ||||||
| // not be nil. | // not be nil. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/hooks/#create-a-hook | // GitHub API docs: https://developer.github.com/v3/repos/hooks/#create-a-repository-webhook | ||||||
| func (s *RepositoriesService) CreateHook(ctx context.Context, owner, repo string, hook *Hook) (*Hook, *Response, error) { | func (s *RepositoriesService) CreateHook(ctx context.Context, owner, repo string, hook *Hook) (*Hook, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/hooks", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/hooks", owner, repo) | ||||||
| 
 | 
 | ||||||
| @@ -131,10 +131,10 @@ func (s *RepositoriesService) CreateHook(ctx context.Context, owner, repo string | |||||||
| 
 | 
 | ||||||
| // ListHooks lists all Hooks for the specified repository. | // ListHooks lists all Hooks for the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/hooks/#list | // GitHub API docs: https://developer.github.com/v3/repos/hooks/#list-repository-webhooks | ||||||
| func (s *RepositoriesService) ListHooks(ctx context.Context, owner, repo string, opt *ListOptions) ([]*Hook, *Response, error) { | func (s *RepositoriesService) ListHooks(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Hook, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/hooks", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/hooks", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -155,7 +155,7 @@ func (s *RepositoriesService) ListHooks(ctx context.Context, owner, repo string, | |||||||
| 
 | 
 | ||||||
| // GetHook returns a single specified Hook. | // GetHook returns a single specified Hook. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/hooks/#get-single-hook | // GitHub API docs: https://developer.github.com/v3/repos/hooks/#get-a-repository-webhook | ||||||
| func (s *RepositoriesService) GetHook(ctx context.Context, owner, repo string, id int64) (*Hook, *Response, error) { | func (s *RepositoriesService) GetHook(ctx context.Context, owner, repo string, id int64) (*Hook, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -173,7 +173,7 @@ func (s *RepositoriesService) GetHook(ctx context.Context, owner, repo string, i | |||||||
| 
 | 
 | ||||||
| // EditHook updates a specified Hook. | // EditHook updates a specified Hook. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/hooks/#edit-a-hook | // GitHub API docs: https://developer.github.com/v3/repos/hooks/#update-a-repository-webhook | ||||||
| func (s *RepositoriesService) EditHook(ctx context.Context, owner, repo string, id int64, hook *Hook) (*Hook, *Response, error) { | func (s *RepositoriesService) EditHook(ctx context.Context, owner, repo string, id int64, hook *Hook) (*Hook, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id) | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, hook) | 	req, err := s.client.NewRequest("PATCH", u, hook) | ||||||
| @@ -191,7 +191,7 @@ func (s *RepositoriesService) EditHook(ctx context.Context, owner, repo string, | |||||||
| 
 | 
 | ||||||
| // DeleteHook deletes a specified Hook. | // DeleteHook deletes a specified Hook. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/hooks/#delete-a-hook | // GitHub API docs: https://developer.github.com/v3/repos/hooks/#delete-a-repository-webhook | ||||||
| func (s *RepositoriesService) DeleteHook(ctx context.Context, owner, repo string, id int64) (*Response, error) { | func (s *RepositoriesService) DeleteHook(ctx context.Context, owner, repo string, id int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id) | ||||||
| 	req, err := s.client.NewRequest("DELETE", u, nil) | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
| @@ -203,7 +203,7 @@ func (s *RepositoriesService) DeleteHook(ctx context.Context, owner, repo string | |||||||
| 
 | 
 | ||||||
| // PingHook triggers a 'ping' event to be sent to the Hook. | // PingHook triggers a 'ping' event to be sent to the Hook. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/hooks/#ping-a-hook | // GitHub API docs: https://developer.github.com/v3/repos/hooks/#ping-a-repository-webhook | ||||||
| func (s *RepositoriesService) PingHook(ctx context.Context, owner, repo string, id int64) (*Response, error) { | func (s *RepositoriesService) PingHook(ctx context.Context, owner, repo string, id int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/hooks/%d/pings", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/hooks/%d/pings", owner, repo, id) | ||||||
| 	req, err := s.client.NewRequest("POST", u, nil) | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
| @@ -215,7 +215,7 @@ func (s *RepositoriesService) PingHook(ctx context.Context, owner, repo string, | |||||||
| 
 | 
 | ||||||
| // TestHook triggers a test Hook by github. | // TestHook triggers a test Hook by github. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/hooks/#test-a-push-hook | // GitHub API docs: https://developer.github.com/v3/repos/hooks/#test-the-push-repository-webhook | ||||||
| func (s *RepositoriesService) TestHook(ctx context.Context, owner, repo string, id int64) (*Response, error) { | func (s *RepositoriesService) TestHook(ctx context.Context, owner, repo string, id int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/hooks/%d/tests", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/hooks/%d/tests", owner, repo, id) | ||||||
| 	req, err := s.client.NewRequest("POST", u, nil) | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
| @@ -27,10 +27,10 @@ type RepositoryInvitation struct { | |||||||
| 
 | 
 | ||||||
| // ListInvitations lists all currently-open repository invitations. | // ListInvitations lists all currently-open repository invitations. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/invitations/#list-invitations-for-a-repository | // GitHub API docs: https://developer.github.com/v3/repos/invitations/#list-repository-invitations | ||||||
| func (s *RepositoriesService) ListInvitations(ctx context.Context, owner, repo string, opt *ListOptions) ([]*RepositoryInvitation, *Response, error) { | func (s *RepositoriesService) ListInvitations(ctx context.Context, owner, repo string, opts *ListOptions) ([]*RepositoryInvitation, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/invitations", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/invitations", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -14,10 +14,10 @@ import ( | |||||||
| 
 | 
 | ||||||
| // ListKeys lists the deploy keys for a repository. | // ListKeys lists the deploy keys for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/keys/#list | // GitHub API docs: https://developer.github.com/v3/repos/keys/#list-deploy-keys | ||||||
| func (s *RepositoriesService) ListKeys(ctx context.Context, owner string, repo string, opt *ListOptions) ([]*Key, *Response, error) { | func (s *RepositoriesService) ListKeys(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*Key, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/keys", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/keys", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -38,7 +38,7 @@ func (s *RepositoriesService) ListKeys(ctx context.Context, owner string, repo s | |||||||
| 
 | 
 | ||||||
| // GetKey fetches a single deploy key. | // GetKey fetches a single deploy key. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/keys/#get | // GitHub API docs: https://developer.github.com/v3/repos/keys/#get-a-deploy-key | ||||||
| func (s *RepositoriesService) GetKey(ctx context.Context, owner string, repo string, id int64) (*Key, *Response, error) { | func (s *RepositoriesService) GetKey(ctx context.Context, owner string, repo string, id int64) (*Key, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id) | ||||||
| 
 | 
 | ||||||
| @@ -58,7 +58,7 @@ func (s *RepositoriesService) GetKey(ctx context.Context, owner string, repo str | |||||||
| 
 | 
 | ||||||
| // CreateKey adds a deploy key for a repository. | // CreateKey adds a deploy key for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/keys/#create | // GitHub API docs: https://developer.github.com/v3/repos/keys/#create-a-deploy-key | ||||||
| func (s *RepositoriesService) CreateKey(ctx context.Context, owner string, repo string, key *Key) (*Key, *Response, error) { | func (s *RepositoriesService) CreateKey(ctx context.Context, owner string, repo string, key *Key) (*Key, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/keys", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/keys", owner, repo) | ||||||
| 
 | 
 | ||||||
| @@ -76,29 +76,9 @@ func (s *RepositoriesService) CreateKey(ctx context.Context, owner string, repo | |||||||
| 	return k, resp, nil | 	return k, resp, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // EditKey edits a deploy key. |  | ||||||
| // |  | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/keys/#edit |  | ||||||
| func (s *RepositoriesService) EditKey(ctx context.Context, owner string, repo string, id int64, key *Key) (*Key, *Response, error) { |  | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id) |  | ||||||
| 
 |  | ||||||
| 	req, err := s.client.NewRequest("PATCH", u, key) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, nil, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	k := new(Key) |  | ||||||
| 	resp, err := s.client.Do(ctx, req, k) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, resp, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return k, resp, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // DeleteKey deletes a deploy key. | // DeleteKey deletes a deploy key. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/keys/#delete | // GitHub API docs: https://developer.github.com/v3/repos/keys/#delete-a-deploy-key | ||||||
| func (s *RepositoriesService) DeleteKey(ctx context.Context, owner string, repo string, id int64) (*Response, error) { | func (s *RepositoriesService) DeleteKey(ctx context.Context, owner string, repo string, id int64) (*Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id) | ||||||
| 
 | 
 | ||||||
| @@ -20,7 +20,7 @@ type RepositoryMergeRequest struct { | |||||||
| 
 | 
 | ||||||
| // Merge a branch in the specified repository. | // Merge a branch in the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/merging/#perform-a-merge | // GitHub API docs: https://developer.github.com/v3/repos/merging/#merge-a-branch | ||||||
| func (s *RepositoriesService) Merge(ctx context.Context, owner, repo string, request *RepositoryMergeRequest) (*RepositoryCommit, *Response, error) { | func (s *RepositoriesService) Merge(ctx context.Context, owner, repo string, request *RepositoryMergeRequest) (*RepositoryCommit, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/merges", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/merges", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("POST", u, request) | 	req, err := s.client.NewRequest("POST", u, request) | ||||||
| @@ -12,11 +12,18 @@ import ( | |||||||
| 
 | 
 | ||||||
| // Pages represents a GitHub Pages site configuration. | // Pages represents a GitHub Pages site configuration. | ||||||
| type Pages struct { | type Pages struct { | ||||||
| 	URL       *string `json:"url,omitempty"` | 	URL       *string      `json:"url,omitempty"` | ||||||
| 	Status    *string `json:"status,omitempty"` | 	Status    *string      `json:"status,omitempty"` | ||||||
| 	CNAME     *string `json:"cname,omitempty"` | 	CNAME     *string      `json:"cname,omitempty"` | ||||||
| 	Custom404 *bool   `json:"custom_404,omitempty"` | 	Custom404 *bool        `json:"custom_404,omitempty"` | ||||||
| 	HTMLURL   *string `json:"html_url,omitempty"` | 	HTMLURL   *string      `json:"html_url,omitempty"` | ||||||
|  | 	Source    *PagesSource `json:"source,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // PagesSource represents a GitHub page's source. | ||||||
|  | type PagesSource struct { | ||||||
|  | 	Branch *string `json:"branch,omitempty"` | ||||||
|  | 	Path   *string `json:"path,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // PagesError represents a build error for a GitHub Pages site. | // PagesError represents a build error for a GitHub Pages site. | ||||||
| @@ -36,9 +43,86 @@ type PagesBuild struct { | |||||||
| 	UpdatedAt *Timestamp  `json:"updated_at,omitempty"` | 	UpdatedAt *Timestamp  `json:"updated_at,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // createPagesRequest is a subset of Pages and is used internally | ||||||
|  | // by EnablePages to pass only the known fields for the endpoint. | ||||||
|  | type createPagesRequest struct { | ||||||
|  | 	Source *PagesSource `json:"source,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // EnablePages enables GitHub Pages for the named repo. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/pages/#create-a-github-pages-site | ||||||
|  | func (s *RepositoriesService) EnablePages(ctx context.Context, owner, repo string, pages *Pages) (*Pages, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/pages", owner, repo) | ||||||
|  | 
 | ||||||
|  | 	pagesReq := &createPagesRequest{ | ||||||
|  | 		Source: pages.Source, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, pagesReq) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	req.Header.Set("Accept", mediaTypeEnablePagesAPIPreview) | ||||||
|  | 
 | ||||||
|  | 	enable := new(Pages) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, enable) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return enable, resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // PagesUpdate sets up parameters needed to update a GitHub Pages site. | ||||||
|  | type PagesUpdate struct { | ||||||
|  | 	// CNAME represents a custom domain for the repository. | ||||||
|  | 	// Leaving CNAME empty will remove the custom domain. | ||||||
|  | 	CNAME *string `json:"cname"` | ||||||
|  | 	// Source must include the branch name, and may optionally specify the subdirectory "/docs". | ||||||
|  | 	// Possible values are: "gh-pages", "master", and "master /docs". | ||||||
|  | 	Source *string `json:"source,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UpdatePages updates GitHub Pages for the named repo. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/pages/#update-information-about-a-github-pages-site | ||||||
|  | func (s *RepositoriesService) UpdatePages(ctx context.Context, owner, repo string, opts *PagesUpdate) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/pages", owner, repo) | ||||||
|  | 
 | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	resp, err := s.client.Do(ctx, req, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return resp, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DisablePages disables GitHub Pages for the named repo. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/pages/#delete-a-github-pages-site | ||||||
|  | func (s *RepositoriesService) DisablePages(ctx context.Context, owner, repo string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("repos/%v/%v/pages", owner, repo) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	req.Header.Set("Accept", mediaTypeEnablePagesAPIPreview) | ||||||
|  | 
 | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // GetPagesInfo fetches information about a GitHub Pages site. | // GetPagesInfo fetches information about a GitHub Pages site. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/pages/#get-information-about-a-pages-site | // GitHub API docs: https://developer.github.com/v3/repos/pages/#get-a-github-pages-site | ||||||
| func (s *RepositoriesService) GetPagesInfo(ctx context.Context, owner, repo string) (*Pages, *Response, error) { | func (s *RepositoriesService) GetPagesInfo(ctx context.Context, owner, repo string) (*Pages, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pages", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/pages", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -46,9 +130,6 @@ func (s *RepositoriesService) GetPagesInfo(ctx context.Context, owner, repo stri | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypePagesPreview) |  | ||||||
| 
 |  | ||||||
| 	site := new(Pages) | 	site := new(Pages) | ||||||
| 	resp, err := s.client.Do(ctx, req, site) | 	resp, err := s.client.Do(ctx, req, site) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -60,10 +141,10 @@ func (s *RepositoriesService) GetPagesInfo(ctx context.Context, owner, repo stri | |||||||
| 
 | 
 | ||||||
| // ListPagesBuilds lists the builds for a GitHub Pages site. | // ListPagesBuilds lists the builds for a GitHub Pages site. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/pages/#list-pages-builds | // GitHub API docs: https://developer.github.com/v3/repos/pages/#list-github-pages-builds | ||||||
| func (s *RepositoriesService) ListPagesBuilds(ctx context.Context, owner, repo string, opt *ListOptions) ([]*PagesBuild, *Response, error) { | func (s *RepositoriesService) ListPagesBuilds(ctx context.Context, owner, repo string, opts *ListOptions) ([]*PagesBuild, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pages/builds", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/pages/builds", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -84,7 +165,7 @@ func (s *RepositoriesService) ListPagesBuilds(ctx context.Context, owner, repo s | |||||||
| 
 | 
 | ||||||
| // GetLatestPagesBuild fetches the latest build information for a GitHub pages site. | // GetLatestPagesBuild fetches the latest build information for a GitHub pages site. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/pages/#list-latest-pages-build | // GitHub API docs: https://developer.github.com/v3/repos/pages/#get-latest-pages-build | ||||||
| func (s *RepositoriesService) GetLatestPagesBuild(ctx context.Context, owner, repo string) (*PagesBuild, *Response, error) { | func (s *RepositoriesService) GetLatestPagesBuild(ctx context.Context, owner, repo string) (*PagesBuild, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pages/builds/latest", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/pages/builds/latest", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -103,7 +184,7 @@ func (s *RepositoriesService) GetLatestPagesBuild(ctx context.Context, owner, re | |||||||
| 
 | 
 | ||||||
| // GetPageBuild fetches the specific build information for a GitHub pages site. | // GetPageBuild fetches the specific build information for a GitHub pages site. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/pages/#list-a-specific-pages-build | // GitHub API docs: https://developer.github.com/v3/repos/pages/#get-github-pages-build | ||||||
| func (s *RepositoriesService) GetPageBuild(ctx context.Context, owner, repo string, id int64) (*PagesBuild, *Response, error) { | func (s *RepositoriesService) GetPageBuild(ctx context.Context, owner, repo string, id int64) (*PagesBuild, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pages/builds/%v", owner, repo, id) | 	u := fmt.Sprintf("repos/%v/%v/pages/builds/%v", owner, repo, id) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -122,7 +203,7 @@ func (s *RepositoriesService) GetPageBuild(ctx context.Context, owner, repo stri | |||||||
| 
 | 
 | ||||||
| // RequestPageBuild requests a build of a GitHub Pages site without needing to push new commit. | // RequestPageBuild requests a build of a GitHub Pages site without needing to push new commit. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/pages/#request-a-page-build | // GitHub API docs: https://developer.github.com/v3/repos/pages/#request-a-github-pages-build | ||||||
| func (s *RepositoriesService) RequestPageBuild(ctx context.Context, owner, repo string) (*PagesBuild, *Response, error) { | func (s *RepositoriesService) RequestPageBuild(ctx context.Context, owner, repo string) (*PagesBuild, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pages/builds", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/pages/builds", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("POST", u, nil) | 	req, err := s.client.NewRequest("POST", u, nil) | ||||||
| @@ -130,9 +211,6 @@ func (s *RepositoriesService) RequestPageBuild(ctx context.Context, owner, repo | |||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 	req.Header.Set("Accept", mediaTypePagesPreview) |  | ||||||
| 
 |  | ||||||
| 	build := new(PagesBuild) | 	build := new(PagesBuild) | ||||||
| 	resp, err := s.client.Do(ctx, req, build) | 	resp, err := s.client.Do(ctx, req, build) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -25,9 +25,9 @@ func (p PreReceiveHook) String() string { | |||||||
| // ListPreReceiveHooks lists all pre-receive hooks for the specified repository. | // ListPreReceiveHooks lists all pre-receive hooks for the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/enterprise/2.13/v3/repos/pre_receive_hooks/#list-pre-receive-hooks | // GitHub API docs: https://developer.github.com/enterprise/2.13/v3/repos/pre_receive_hooks/#list-pre-receive-hooks | ||||||
| func (s *RepositoriesService) ListPreReceiveHooks(ctx context.Context, owner, repo string, opt *ListOptions) ([]*PreReceiveHook, *Response, error) { | func (s *RepositoriesService) ListPreReceiveHooks(ctx context.Context, owner, repo string, opts *ListOptions) ([]*PreReceiveHook, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/pre-receive-hooks", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/pre-receive-hooks", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -22,9 +22,9 @@ type ProjectListOptions struct { | |||||||
| // ListProjects lists the projects for a repo. | // ListProjects lists the projects for a repo. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/#list-repository-projects | // GitHub API docs: https://developer.github.com/v3/projects/#list-repository-projects | ||||||
| func (s *RepositoriesService) ListProjects(ctx context.Context, owner, repo string, opt *ProjectListOptions) ([]*Project, *Response, error) { | func (s *RepositoriesService) ListProjects(ctx context.Context, owner, repo string, opts *ProjectListOptions) ([]*Project, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/projects", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/projects", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -49,9 +49,9 @@ func (s *RepositoriesService) ListProjects(ctx context.Context, owner, repo stri | |||||||
| // CreateProject creates a GitHub Project for the specified repository. | // CreateProject creates a GitHub Project for the specified repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/projects/#create-a-repository-project | // GitHub API docs: https://developer.github.com/v3/projects/#create-a-repository-project | ||||||
| func (s *RepositoriesService) CreateProject(ctx context.Context, owner, repo string, opt *ProjectOptions) (*Project, *Response, error) { | func (s *RepositoriesService) CreateProject(ctx context.Context, owner, repo string, opts *ProjectOptions) (*Project, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/projects", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/projects", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("POST", u, opt) | 	req, err := s.client.NewRequest("POST", u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -27,18 +27,18 @@ type RepositoryRelease struct { | |||||||
| 	Prerelease      *bool   `json:"prerelease,omitempty"` | 	Prerelease      *bool   `json:"prerelease,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// The following fields are not used in CreateRelease or EditRelease: | 	// The following fields are not used in CreateRelease or EditRelease: | ||||||
| 	ID          *int64         `json:"id,omitempty"` | 	ID          *int64          `json:"id,omitempty"` | ||||||
| 	CreatedAt   *Timestamp     `json:"created_at,omitempty"` | 	CreatedAt   *Timestamp      `json:"created_at,omitempty"` | ||||||
| 	PublishedAt *Timestamp     `json:"published_at,omitempty"` | 	PublishedAt *Timestamp      `json:"published_at,omitempty"` | ||||||
| 	URL         *string        `json:"url,omitempty"` | 	URL         *string         `json:"url,omitempty"` | ||||||
| 	HTMLURL     *string        `json:"html_url,omitempty"` | 	HTMLURL     *string         `json:"html_url,omitempty"` | ||||||
| 	AssetsURL   *string        `json:"assets_url,omitempty"` | 	AssetsURL   *string         `json:"assets_url,omitempty"` | ||||||
| 	Assets      []ReleaseAsset `json:"assets,omitempty"` | 	Assets      []*ReleaseAsset `json:"assets,omitempty"` | ||||||
| 	UploadURL   *string        `json:"upload_url,omitempty"` | 	UploadURL   *string         `json:"upload_url,omitempty"` | ||||||
| 	ZipballURL  *string        `json:"zipball_url,omitempty"` | 	ZipballURL  *string         `json:"zipball_url,omitempty"` | ||||||
| 	TarballURL  *string        `json:"tarball_url,omitempty"` | 	TarballURL  *string         `json:"tarball_url,omitempty"` | ||||||
| 	Author      *User          `json:"author,omitempty"` | 	Author      *User           `json:"author,omitempty"` | ||||||
| 	NodeID      *string        `json:"node_id,omitempty"` | 	NodeID      *string         `json:"node_id,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r RepositoryRelease) String() string { | func (r RepositoryRelease) String() string { | ||||||
| @@ -68,10 +68,10 @@ func (r ReleaseAsset) String() string { | |||||||
| 
 | 
 | ||||||
| // ListReleases lists the releases for a repository. | // ListReleases lists the releases for a repository. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository | // GitHub API docs: https://developer.github.com/v3/repos/releases/#list-releases | ||||||
| func (s *RepositoriesService) ListReleases(ctx context.Context, owner, repo string, opt *ListOptions) ([]*RepositoryRelease, *Response, error) { | func (s *RepositoriesService) ListReleases(ctx context.Context, owner, repo string, opts *ListOptions) ([]*RepositoryRelease, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/releases", owner, repo) | 	u := fmt.Sprintf("repos/%s/%s/releases", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -91,7 +91,7 @@ func (s *RepositoriesService) ListReleases(ctx context.Context, owner, repo stri | |||||||
| 
 | 
 | ||||||
| // GetRelease fetches a single release. | // GetRelease fetches a single release. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release | // GitHub API docs: https://developer.github.com/v3/repos/releases/#get-a-release | ||||||
| func (s *RepositoriesService) GetRelease(ctx context.Context, owner, repo string, id int64) (*RepositoryRelease, *Response, error) { | func (s *RepositoriesService) GetRelease(ctx context.Context, owner, repo string, id int64) (*RepositoryRelease, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id) | 	u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id) | ||||||
| 	return s.getSingleRelease(ctx, u) | 	return s.getSingleRelease(ctx, u) | ||||||
| @@ -178,7 +178,7 @@ func (s *RepositoriesService) CreateRelease(ctx context.Context, owner, repo str | |||||||
| // Note that only a subset of the release fields are used. | // Note that only a subset of the release fields are used. | ||||||
| // See RepositoryRelease for more information. | // See RepositoryRelease for more information. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/releases/#edit-a-release | // GitHub API docs: https://developer.github.com/v3/repos/releases/#update-a-release | ||||||
| func (s *RepositoriesService) EditRelease(ctx context.Context, owner, repo string, id int64, release *RepositoryRelease) (*RepositoryRelease, *Response, error) { | func (s *RepositoriesService) EditRelease(ctx context.Context, owner, repo string, id int64, release *RepositoryRelease) (*RepositoryRelease, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id) | 	u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id) | ||||||
| 
 | 
 | ||||||
| @@ -219,10 +219,10 @@ func (s *RepositoriesService) DeleteRelease(ctx context.Context, owner, repo str | |||||||
| 
 | 
 | ||||||
| // ListReleaseAssets lists the release's assets. | // ListReleaseAssets lists the release's assets. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/releases/#list-assets-for-a-release | // GitHub API docs: https://developer.github.com/v3/repos/releases/#list-release-assets | ||||||
| func (s *RepositoriesService) ListReleaseAssets(ctx context.Context, owner, repo string, id int64, opt *ListOptions) ([]*ReleaseAsset, *Response, error) { | func (s *RepositoriesService) ListReleaseAssets(ctx context.Context, owner, repo string, id int64, opts *ListOptions) ([]*ReleaseAsset, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/releases/%d/assets", owner, repo, id) | 	u := fmt.Sprintf("repos/%s/%s/releases/%d/assets", owner, repo, id) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -242,7 +242,7 @@ func (s *RepositoriesService) ListReleaseAssets(ctx context.Context, owner, repo | |||||||
| 
 | 
 | ||||||
| // GetReleaseAsset fetches a single release asset. | // GetReleaseAsset fetches a single release asset. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release-asset | // GitHub API docs: https://developer.github.com/v3/repos/releases/#get-a-release-asset | ||||||
| func (s *RepositoriesService) GetReleaseAsset(ctx context.Context, owner, repo string, id int64) (*ReleaseAsset, *Response, error) { | func (s *RepositoriesService) GetReleaseAsset(ctx context.Context, owner, repo string, id int64) (*ReleaseAsset, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id) | 	u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id) | ||||||
| 
 | 
 | ||||||
| @@ -266,8 +266,13 @@ func (s *RepositoriesService) GetReleaseAsset(ctx context.Context, owner, repo s | |||||||
| // If a redirect is returned, the redirect URL will be returned as a string instead | // If a redirect is returned, the redirect URL will be returned as a string instead | ||||||
| // of the io.ReadCloser. Exactly one of rc and redirectURL will be zero. | // of the io.ReadCloser. Exactly one of rc and redirectURL will be zero. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release-asset | // followRedirectsClient can be passed to download the asset from a redirected | ||||||
| func (s *RepositoriesService) DownloadReleaseAsset(ctx context.Context, owner, repo string, id int64) (rc io.ReadCloser, redirectURL string, err error) { | // location. Passing http.DefaultClient is recommended unless special circumstances | ||||||
|  | // exist, but it's possible to pass any http.Client. If nil is passed the | ||||||
|  | // redirectURL will be returned instead. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/repos/releases/#get-a-release-asset | ||||||
|  | func (s *RepositoriesService) DownloadReleaseAsset(ctx context.Context, owner, repo string, id int64, followRedirectsClient *http.Client) (rc io.ReadCloser, redirectURL string, err error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id) | 	u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id) | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -293,6 +298,10 @@ func (s *RepositoriesService) DownloadReleaseAsset(ctx context.Context, owner, r | |||||||
| 		if !strings.Contains(err.Error(), "disable redirect") { | 		if !strings.Contains(err.Error(), "disable redirect") { | ||||||
| 			return nil, "", err | 			return nil, "", err | ||||||
| 		} | 		} | ||||||
|  | 		if followRedirectsClient != nil { | ||||||
|  | 			rc, err := s.downloadReleaseAssetFromURL(ctx, followRedirectsClient, loc) | ||||||
|  | 			return rc, "", err | ||||||
|  | 		} | ||||||
| 		return nil, loc, nil // Intentionally return no error with valid redirect URL. | 		return nil, loc, nil // Intentionally return no error with valid redirect URL. | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @@ -304,9 +313,27 @@ func (s *RepositoriesService) DownloadReleaseAsset(ctx context.Context, owner, r | |||||||
| 	return resp.Body, "", nil | 	return resp.Body, "", nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (s *RepositoriesService) downloadReleaseAssetFromURL(ctx context.Context, followRedirectsClient *http.Client, url string) (rc io.ReadCloser, err error) { | ||||||
|  | 	req, err := http.NewRequest("GET", url, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	req = withContext(ctx, req) | ||||||
|  | 	req.Header.Set("Accept", "*/*") | ||||||
|  | 	resp, err := followRedirectsClient.Do(req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	if err := CheckResponse(resp); err != nil { | ||||||
|  | 		resp.Body.Close() | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return resp.Body, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // EditReleaseAsset edits a repository release asset. | // EditReleaseAsset edits a repository release asset. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/releases/#edit-a-release-asset | // GitHub API docs: https://developer.github.com/v3/repos/releases/#update-a-release-asset | ||||||
| func (s *RepositoriesService) EditReleaseAsset(ctx context.Context, owner, repo string, id int64, release *ReleaseAsset) (*ReleaseAsset, *Response, error) { | func (s *RepositoriesService) EditReleaseAsset(ctx context.Context, owner, repo string, id int64, release *ReleaseAsset) (*ReleaseAsset, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id) | 	u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id) | ||||||
| 
 | 
 | ||||||
| @@ -340,9 +367,9 @@ func (s *RepositoriesService) DeleteReleaseAsset(ctx context.Context, owner, rep | |||||||
| // To upload assets that cannot be represented by an os.File, call NewUploadRequest directly. | // To upload assets that cannot be represented by an os.File, call NewUploadRequest directly. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/releases/#upload-a-release-asset | // GitHub API docs: https://developer.github.com/v3/repos/releases/#upload-a-release-asset | ||||||
| func (s *RepositoriesService) UploadReleaseAsset(ctx context.Context, owner, repo string, id int64, opt *UploadOptions, file *os.File) (*ReleaseAsset, *Response, error) { | func (s *RepositoriesService) UploadReleaseAsset(ctx context.Context, owner, repo string, id int64, opts *UploadOptions, file *os.File) (*ReleaseAsset, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%s/%s/releases/%d/assets", owner, repo, id) | 	u := fmt.Sprintf("repos/%s/%s/releases/%d/assets", owner, repo, id) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -356,8 +383,8 @@ func (s *RepositoriesService) UploadReleaseAsset(ctx context.Context, owner, rep | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mediaType := mime.TypeByExtension(filepath.Ext(file.Name())) | 	mediaType := mime.TypeByExtension(filepath.Ext(file.Name())) | ||||||
| 	if opt.MediaType != "" { | 	if opts.MediaType != "" { | ||||||
| 		mediaType = opt.MediaType | 		mediaType = opts.MediaType | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	req, err := s.client.NewUploadRequest(u, file, stat.Size(), mediaType) | 	req, err := s.client.NewUploadRequest(u, file, stat.Size(), mediaType) | ||||||
| @@ -14,9 +14,9 @@ import ( | |||||||
| // ContributorStats represents a contributor to a repository and their | // ContributorStats represents a contributor to a repository and their | ||||||
| // weekly contributions to a given repo. | // weekly contributions to a given repo. | ||||||
| type ContributorStats struct { | type ContributorStats struct { | ||||||
| 	Author *Contributor  `json:"author,omitempty"` | 	Author *Contributor   `json:"author,omitempty"` | ||||||
| 	Total  *int          `json:"total,omitempty"` | 	Total  *int           `json:"total,omitempty"` | ||||||
| 	Weeks  []WeeklyStats `json:"weeks,omitempty"` | 	Weeks  []*WeeklyStats `json:"weeks,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c ContributorStats) String() string { | func (c ContributorStats) String() string { | ||||||
| @@ -45,7 +45,7 @@ func (w WeeklyStats) String() string { | |||||||
| // it is now computing the requested statistics. A follow up request, after a | // it is now computing the requested statistics. A follow up request, after a | ||||||
| // delay of a second or so, should result in a successful request. | // delay of a second or so, should result in a successful request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/statistics/#contributors | // GitHub API docs: https://developer.github.com/v3/repos/statistics/#get-all-contributor-commit-activity | ||||||
| func (s *RepositoriesService) ListContributorsStats(ctx context.Context, owner, repo string) ([]*ContributorStats, *Response, error) { | func (s *RepositoriesService) ListContributorsStats(ctx context.Context, owner, repo string) ([]*ContributorStats, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/stats/contributors", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/stats/contributors", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -84,7 +84,7 @@ func (w WeeklyCommitActivity) String() string { | |||||||
| // it is now computing the requested statistics. A follow up request, after a | // it is now computing the requested statistics. A follow up request, after a | ||||||
| // delay of a second or so, should result in a successful request. | // delay of a second or so, should result in a successful request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/statistics/#commit-activity | // GitHub API docs: https://developer.github.com/v3/repos/statistics/#get-the-last-year-of-commit-activity | ||||||
| func (s *RepositoriesService) ListCommitActivity(ctx context.Context, owner, repo string) ([]*WeeklyCommitActivity, *Response, error) { | func (s *RepositoriesService) ListCommitActivity(ctx context.Context, owner, repo string) ([]*WeeklyCommitActivity, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/stats/commit_activity", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/stats/commit_activity", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -111,7 +111,7 @@ func (s *RepositoriesService) ListCommitActivity(ctx context.Context, owner, rep | |||||||
| // it is now computing the requested statistics. A follow up request, after a | // it is now computing the requested statistics. A follow up request, after a | ||||||
| // delay of a second or so, should result in a successful request. | // delay of a second or so, should result in a successful request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/statistics/#code-frequency | // GitHub API docs: https://developer.github.com/v3/repos/statistics/#get-the-weekly-commit-activity | ||||||
| func (s *RepositoriesService) ListCodeFrequency(ctx context.Context, owner, repo string) ([]*WeeklyStats, *Response, error) { | func (s *RepositoriesService) ListCodeFrequency(ctx context.Context, owner, repo string) ([]*WeeklyStats, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/stats/code_frequency", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/stats/code_frequency", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -164,7 +164,7 @@ func (r RepositoryParticipation) String() string { | |||||||
| // it is now computing the requested statistics. A follow up request, after a | // it is now computing the requested statistics. A follow up request, after a | ||||||
| // delay of a second or so, should result in a successful request. | // delay of a second or so, should result in a successful request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/statistics/#participation | // GitHub API docs: https://developer.github.com/v3/repos/statistics/#get-the-weekly-commit-count | ||||||
| func (s *RepositoriesService) ListParticipation(ctx context.Context, owner, repo string) (*RepositoryParticipation, *Response, error) { | func (s *RepositoriesService) ListParticipation(ctx context.Context, owner, repo string) (*RepositoryParticipation, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/stats/participation", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/stats/participation", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -197,7 +197,7 @@ type PunchCard struct { | |||||||
| // it is now computing the requested statistics. A follow up request, after a | // it is now computing the requested statistics. A follow up request, after a | ||||||
| // delay of a second or so, should result in a successful request. | // delay of a second or so, should result in a successful request. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/statistics/#punch-card | // GitHub API docs: https://developer.github.com/v3/repos/statistics/#get-the-hourly-commit-count-for-each-day | ||||||
| func (s *RepositoriesService) ListPunchCard(ctx context.Context, owner, repo string) ([]*PunchCard, *Response, error) { | func (s *RepositoriesService) ListPunchCard(ctx context.Context, owner, repo string) ([]*PunchCard, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/stats/punch_card", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/stats/punch_card", owner, repo) | ||||||
| 	req, err := s.client.NewRequest("GET", u, nil) | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
| @@ -8,14 +8,14 @@ package github | |||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/url" |  | ||||||
| 	"time" | 	"time" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // RepoStatus represents the status of a repository at a particular reference. | // RepoStatus represents the status of a repository at a particular reference. | ||||||
| type RepoStatus struct { | type RepoStatus struct { | ||||||
| 	ID  *int64  `json:"id,omitempty"` | 	ID     *int64  `json:"id,omitempty"` | ||||||
| 	URL *string `json:"url,omitempty"` | 	NodeID *string `json:"node_id,omitempty"` | ||||||
|  | 	URL    *string `json:"url,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	// State is the current state of the repository. Possible values are: | 	// State is the current state of the repository. Possible values are: | ||||||
| 	// pending, success, error, or failure. | 	// pending, success, error, or failure. | ||||||
| @@ -43,10 +43,10 @@ func (r RepoStatus) String() string { | |||||||
| // ListStatuses lists the statuses of a repository at the specified | // ListStatuses lists the statuses of a repository at the specified | ||||||
| // reference. ref can be a SHA, a branch name, or a tag name. | // reference. ref can be a SHA, a branch name, or a tag name. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/statuses/#list-statuses-for-a-specific-ref | // GitHub API docs: https://developer.github.com/v3/repos/statuses/#list-commit-statuses-for-a-reference | ||||||
| func (s *RepositoriesService) ListStatuses(ctx context.Context, owner, repo, ref string, opt *ListOptions) ([]*RepoStatus, *Response, error) { | func (s *RepositoriesService) ListStatuses(ctx context.Context, owner, repo, ref string, opts *ListOptions) ([]*RepoStatus, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/commits/%v/statuses", owner, repo, url.QueryEscape(ref)) | 	u := fmt.Sprintf("repos/%v/%v/commits/%v/statuses", owner, repo, refURLEscape(ref)) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -68,9 +68,9 @@ func (s *RepositoriesService) ListStatuses(ctx context.Context, owner, repo, ref | |||||||
| // CreateStatus creates a new status for a repository at the specified | // CreateStatus creates a new status for a repository at the specified | ||||||
| // reference. Ref can be a SHA, a branch name, or a tag name. | // reference. Ref can be a SHA, a branch name, or a tag name. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/statuses/#create-a-status | // GitHub API docs: https://developer.github.com/v3/repos/statuses/#create-a-commit-status | ||||||
| func (s *RepositoriesService) CreateStatus(ctx context.Context, owner, repo, ref string, status *RepoStatus) (*RepoStatus, *Response, error) { | func (s *RepositoriesService) CreateStatus(ctx context.Context, owner, repo, ref string, status *RepoStatus) (*RepoStatus, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/statuses/%v", owner, repo, url.QueryEscape(ref)) | 	u := fmt.Sprintf("repos/%v/%v/statuses/%v", owner, repo, refURLEscape(ref)) | ||||||
| 	req, err := s.client.NewRequest("POST", u, status) | 	req, err := s.client.NewRequest("POST", u, status) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| @@ -91,10 +91,10 @@ type CombinedStatus struct { | |||||||
| 	// failure, pending, or success. | 	// failure, pending, or success. | ||||||
| 	State *string `json:"state,omitempty"` | 	State *string `json:"state,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	Name       *string      `json:"name,omitempty"` | 	Name       *string       `json:"name,omitempty"` | ||||||
| 	SHA        *string      `json:"sha,omitempty"` | 	SHA        *string       `json:"sha,omitempty"` | ||||||
| 	TotalCount *int         `json:"total_count,omitempty"` | 	TotalCount *int          `json:"total_count,omitempty"` | ||||||
| 	Statuses   []RepoStatus `json:"statuses,omitempty"` | 	Statuses   []*RepoStatus `json:"statuses,omitempty"` | ||||||
| 
 | 
 | ||||||
| 	CommitURL     *string `json:"commit_url,omitempty"` | 	CommitURL     *string `json:"commit_url,omitempty"` | ||||||
| 	RepositoryURL *string `json:"repository_url,omitempty"` | 	RepositoryURL *string `json:"repository_url,omitempty"` | ||||||
| @@ -107,10 +107,10 @@ func (s CombinedStatus) String() string { | |||||||
| // GetCombinedStatus returns the combined status of a repository at the specified | // GetCombinedStatus returns the combined status of a repository at the specified | ||||||
| // reference. ref can be a SHA, a branch name, or a tag name. | // reference. ref can be a SHA, a branch name, or a tag name. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref | // GitHub API docs: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-reference | ||||||
| func (s *RepositoriesService) GetCombinedStatus(ctx context.Context, owner, repo, ref string, opt *ListOptions) (*CombinedStatus, *Response, error) { | func (s *RepositoriesService) GetCombinedStatus(ctx context.Context, owner, repo, ref string, opts *ListOptions) (*CombinedStatus, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/commits/%v/status", owner, repo, url.QueryEscape(ref)) | 	u := fmt.Sprintf("repos/%v/%v/commits/%v/status", owner, repo, refURLEscape(ref)) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -54,7 +54,7 @@ type TrafficBreakdownOptions struct { | |||||||
| 
 | 
 | ||||||
| // ListTrafficReferrers list the top 10 referrers over the last 14 days. | // ListTrafficReferrers list the top 10 referrers over the last 14 days. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/traffic/#list-referrers | // GitHub API docs: https://developer.github.com/v3/repos/traffic/#get-top-referral-sources | ||||||
| func (s *RepositoriesService) ListTrafficReferrers(ctx context.Context, owner, repo string) ([]*TrafficReferrer, *Response, error) { | func (s *RepositoriesService) ListTrafficReferrers(ctx context.Context, owner, repo string) ([]*TrafficReferrer, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/traffic/popular/referrers", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/traffic/popular/referrers", owner, repo) | ||||||
| 
 | 
 | ||||||
| @@ -74,7 +74,7 @@ func (s *RepositoriesService) ListTrafficReferrers(ctx context.Context, owner, r | |||||||
| 
 | 
 | ||||||
| // ListTrafficPaths list the top 10 popular content over the last 14 days. | // ListTrafficPaths list the top 10 popular content over the last 14 days. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/traffic/#list-paths | // GitHub API docs: https://developer.github.com/v3/repos/traffic/#get-top-referral-paths | ||||||
| func (s *RepositoriesService) ListTrafficPaths(ctx context.Context, owner, repo string) ([]*TrafficPath, *Response, error) { | func (s *RepositoriesService) ListTrafficPaths(ctx context.Context, owner, repo string) ([]*TrafficPath, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/traffic/popular/paths", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/traffic/popular/paths", owner, repo) | ||||||
| 
 | 
 | ||||||
| @@ -94,10 +94,10 @@ func (s *RepositoriesService) ListTrafficPaths(ctx context.Context, owner, repo | |||||||
| 
 | 
 | ||||||
| // ListTrafficViews get total number of views for the last 14 days and breaks it down either per day or week. | // ListTrafficViews get total number of views for the last 14 days and breaks it down either per day or week. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/traffic/#views | // GitHub API docs: https://developer.github.com/v3/repos/traffic/#get-page-views | ||||||
| func (s *RepositoriesService) ListTrafficViews(ctx context.Context, owner, repo string, opt *TrafficBreakdownOptions) (*TrafficViews, *Response, error) { | func (s *RepositoriesService) ListTrafficViews(ctx context.Context, owner, repo string, opts *TrafficBreakdownOptions) (*TrafficViews, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/traffic/views", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/traffic/views", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -118,10 +118,10 @@ func (s *RepositoriesService) ListTrafficViews(ctx context.Context, owner, repo | |||||||
| 
 | 
 | ||||||
| // ListTrafficClones get total number of clones for the last 14 days and breaks it down either per day or week for the last 14 days. | // ListTrafficClones get total number of clones for the last 14 days and breaks it down either per day or week for the last 14 days. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/repos/traffic/#views | // GitHub API docs: https://developer.github.com/v3/repos/traffic/#get-repository-clones | ||||||
| func (s *RepositoriesService) ListTrafficClones(ctx context.Context, owner, repo string, opt *TrafficBreakdownOptions) (*TrafficClones, *Response, error) { | func (s *RepositoriesService) ListTrafficClones(ctx context.Context, owner, repo string, opts *TrafficBreakdownOptions) (*TrafficClones, *Response, error) { | ||||||
| 	u := fmt.Sprintf("repos/%v/%v/traffic/clones", owner, repo) | 	u := fmt.Sprintf("repos/%v/%v/traffic/clones", owner, repo) | ||||||
| 	u, err := addOptions(u, opt) | 	u, err := addOptions(u, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, nil, err | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| @@ -24,6 +24,11 @@ import ( | |||||||
| // will search for such issues, sorting by creation date in ascending order | // will search for such issues, sorting by creation date in ascending order | ||||||
| // (i.e., oldest first). | // (i.e., oldest first). | ||||||
| // | // | ||||||
|  | // If query includes multiple conditions, it MUST NOT include "+" as the condition separator. | ||||||
|  | // You have to use " " as the separator instead. | ||||||
|  | // For example, querying with "language:c++" and "leveldb", then query should be | ||||||
|  | // "language:c++ leveldb" but not "language:c+++leveldb". | ||||||
|  | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/search/ | // GitHub API docs: https://developer.github.com/v3/search/ | ||||||
| type SearchService service | type SearchService service | ||||||
| 
 | 
 | ||||||
| @@ -57,17 +62,48 @@ type searchParameters struct { | |||||||
| 
 | 
 | ||||||
| // RepositoriesSearchResult represents the result of a repositories search. | // RepositoriesSearchResult represents the result of a repositories search. | ||||||
| type RepositoriesSearchResult struct { | type RepositoriesSearchResult struct { | ||||||
| 	Total             *int         `json:"total_count,omitempty"` | 	Total             *int          `json:"total_count,omitempty"` | ||||||
| 	IncompleteResults *bool        `json:"incomplete_results,omitempty"` | 	IncompleteResults *bool         `json:"incomplete_results,omitempty"` | ||||||
| 	Repositories      []Repository `json:"items,omitempty"` | 	Repositories      []*Repository `json:"items,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Repositories searches repositories via various criteria. | // Repositories searches repositories via various criteria. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/search/#search-repositories | // GitHub API docs: https://developer.github.com/v3/search/#search-repositories | ||||||
| func (s *SearchService) Repositories(ctx context.Context, query string, opt *SearchOptions) (*RepositoriesSearchResult, *Response, error) { | func (s *SearchService) Repositories(ctx context.Context, query string, opts *SearchOptions) (*RepositoriesSearchResult, *Response, error) { | ||||||
| 	result := new(RepositoriesSearchResult) | 	result := new(RepositoriesSearchResult) | ||||||
| 	resp, err := s.search(ctx, "repositories", &searchParameters{Query: query}, opt, result) | 	resp, err := s.search(ctx, "repositories", &searchParameters{Query: query}, opts, result) | ||||||
|  | 	return result, resp, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // TopicsSearchResult represents the result of a topics search. | ||||||
|  | type TopicsSearchResult struct { | ||||||
|  | 	Total             *int           `json:"total_count,omitempty"` | ||||||
|  | 	IncompleteResults *bool          `json:"incomplete_results,omitempty"` | ||||||
|  | 	Topics            []*TopicResult `json:"items,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type TopicResult struct { | ||||||
|  | 	Name             *string    `json:"name,omitempty"` | ||||||
|  | 	DisplayName      *string    `json:"display_name,omitempty"` | ||||||
|  | 	ShortDescription *string    `json:"short_description,omitempty"` | ||||||
|  | 	Description      *string    `json:"description,omitempty"` | ||||||
|  | 	CreatedBy        *string    `json:"created_by,omitempty"` | ||||||
|  | 	CreatedAt        *Timestamp `json:"created_at,omitempty"` | ||||||
|  | 	UpdatedAt        *string    `json:"updated_at,omitempty"` | ||||||
|  | 	Featured         *bool      `json:"featured,omitempty"` | ||||||
|  | 	Curated          *bool      `json:"curated,omitempty"` | ||||||
|  | 	Score            *float64   `json:"score,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Topics finds topics via various criteria. Results are sorted by best match. | ||||||
|  | // Please see https://help.github.com/en/articles/searching-topics for more | ||||||
|  | // information about search qualifiers. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/search/#search-topics | ||||||
|  | func (s *SearchService) Topics(ctx context.Context, query string, opts *SearchOptions) (*TopicsSearchResult, *Response, error) { | ||||||
|  | 	result := new(TopicsSearchResult) | ||||||
|  | 	resp, err := s.search(ctx, "topics", &searchParameters{Query: query}, opts, result) | ||||||
| 	return result, resp, err | 	return result, resp, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -96,41 +132,41 @@ type CommitResult struct { | |||||||
| // Commits searches commits via various criteria. | // Commits searches commits via various criteria. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/search/#search-commits | // GitHub API docs: https://developer.github.com/v3/search/#search-commits | ||||||
| func (s *SearchService) Commits(ctx context.Context, query string, opt *SearchOptions) (*CommitsSearchResult, *Response, error) { | func (s *SearchService) Commits(ctx context.Context, query string, opts *SearchOptions) (*CommitsSearchResult, *Response, error) { | ||||||
| 	result := new(CommitsSearchResult) | 	result := new(CommitsSearchResult) | ||||||
| 	resp, err := s.search(ctx, "commits", &searchParameters{Query: query}, opt, result) | 	resp, err := s.search(ctx, "commits", &searchParameters{Query: query}, opts, result) | ||||||
| 	return result, resp, err | 	return result, resp, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // IssuesSearchResult represents the result of an issues search. | // IssuesSearchResult represents the result of an issues search. | ||||||
| type IssuesSearchResult struct { | type IssuesSearchResult struct { | ||||||
| 	Total             *int    `json:"total_count,omitempty"` | 	Total             *int     `json:"total_count,omitempty"` | ||||||
| 	IncompleteResults *bool   `json:"incomplete_results,omitempty"` | 	IncompleteResults *bool    `json:"incomplete_results,omitempty"` | ||||||
| 	Issues            []Issue `json:"items,omitempty"` | 	Issues            []*Issue `json:"items,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Issues searches issues via various criteria. | // Issues searches issues via various criteria. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/search/#search-issues | // GitHub API docs: https://developer.github.com/v3/search/#search-issues-and-pull-requests | ||||||
| func (s *SearchService) Issues(ctx context.Context, query string, opt *SearchOptions) (*IssuesSearchResult, *Response, error) { | func (s *SearchService) Issues(ctx context.Context, query string, opts *SearchOptions) (*IssuesSearchResult, *Response, error) { | ||||||
| 	result := new(IssuesSearchResult) | 	result := new(IssuesSearchResult) | ||||||
| 	resp, err := s.search(ctx, "issues", &searchParameters{Query: query}, opt, result) | 	resp, err := s.search(ctx, "issues", &searchParameters{Query: query}, opts, result) | ||||||
| 	return result, resp, err | 	return result, resp, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // UsersSearchResult represents the result of a users search. | // UsersSearchResult represents the result of a users search. | ||||||
| type UsersSearchResult struct { | type UsersSearchResult struct { | ||||||
| 	Total             *int   `json:"total_count,omitempty"` | 	Total             *int    `json:"total_count,omitempty"` | ||||||
| 	IncompleteResults *bool  `json:"incomplete_results,omitempty"` | 	IncompleteResults *bool   `json:"incomplete_results,omitempty"` | ||||||
| 	Users             []User `json:"items,omitempty"` | 	Users             []*User `json:"items,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Users searches users via various criteria. | // Users searches users via various criteria. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/search/#search-users | // GitHub API docs: https://developer.github.com/v3/search/#search-users | ||||||
| func (s *SearchService) Users(ctx context.Context, query string, opt *SearchOptions) (*UsersSearchResult, *Response, error) { | func (s *SearchService) Users(ctx context.Context, query string, opts *SearchOptions) (*UsersSearchResult, *Response, error) { | ||||||
| 	result := new(UsersSearchResult) | 	result := new(UsersSearchResult) | ||||||
| 	resp, err := s.search(ctx, "users", &searchParameters{Query: query}, opt, result) | 	resp, err := s.search(ctx, "users", &searchParameters{Query: query}, opts, result) | ||||||
| 	return result, resp, err | 	return result, resp, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -142,11 +178,11 @@ type Match struct { | |||||||
| 
 | 
 | ||||||
| // TextMatch represents a text match for a SearchResult | // TextMatch represents a text match for a SearchResult | ||||||
| type TextMatch struct { | type TextMatch struct { | ||||||
| 	ObjectURL  *string `json:"object_url,omitempty"` | 	ObjectURL  *string  `json:"object_url,omitempty"` | ||||||
| 	ObjectType *string `json:"object_type,omitempty"` | 	ObjectType *string  `json:"object_type,omitempty"` | ||||||
| 	Property   *string `json:"property,omitempty"` | 	Property   *string  `json:"property,omitempty"` | ||||||
| 	Fragment   *string `json:"fragment,omitempty"` | 	Fragment   *string  `json:"fragment,omitempty"` | ||||||
| 	Matches    []Match `json:"matches,omitempty"` | 	Matches    []*Match `json:"matches,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (tm TextMatch) String() string { | func (tm TextMatch) String() string { | ||||||
| @@ -155,19 +191,19 @@ func (tm TextMatch) String() string { | |||||||
| 
 | 
 | ||||||
| // CodeSearchResult represents the result of a code search. | // CodeSearchResult represents the result of a code search. | ||||||
| type CodeSearchResult struct { | type CodeSearchResult struct { | ||||||
| 	Total             *int         `json:"total_count,omitempty"` | 	Total             *int          `json:"total_count,omitempty"` | ||||||
| 	IncompleteResults *bool        `json:"incomplete_results,omitempty"` | 	IncompleteResults *bool         `json:"incomplete_results,omitempty"` | ||||||
| 	CodeResults       []CodeResult `json:"items,omitempty"` | 	CodeResults       []*CodeResult `json:"items,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // CodeResult represents a single search result. | // CodeResult represents a single search result. | ||||||
| type CodeResult struct { | type CodeResult struct { | ||||||
| 	Name        *string     `json:"name,omitempty"` | 	Name        *string      `json:"name,omitempty"` | ||||||
| 	Path        *string     `json:"path,omitempty"` | 	Path        *string      `json:"path,omitempty"` | ||||||
| 	SHA         *string     `json:"sha,omitempty"` | 	SHA         *string      `json:"sha,omitempty"` | ||||||
| 	HTMLURL     *string     `json:"html_url,omitempty"` | 	HTMLURL     *string      `json:"html_url,omitempty"` | ||||||
| 	Repository  *Repository `json:"repository,omitempty"` | 	Repository  *Repository  `json:"repository,omitempty"` | ||||||
| 	TextMatches []TextMatch `json:"text_matches,omitempty"` | 	TextMatches []*TextMatch `json:"text_matches,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c CodeResult) String() string { | func (c CodeResult) String() string { | ||||||
| @@ -177,9 +213,9 @@ func (c CodeResult) String() string { | |||||||
| // Code searches code via various criteria. | // Code searches code via various criteria. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/search/#search-code | // GitHub API docs: https://developer.github.com/v3/search/#search-code | ||||||
| func (s *SearchService) Code(ctx context.Context, query string, opt *SearchOptions) (*CodeSearchResult, *Response, error) { | func (s *SearchService) Code(ctx context.Context, query string, opts *SearchOptions) (*CodeSearchResult, *Response, error) { | ||||||
| 	result := new(CodeSearchResult) | 	result := new(CodeSearchResult) | ||||||
| 	resp, err := s.search(ctx, "code", &searchParameters{Query: query}, opt, result) | 	resp, err := s.search(ctx, "code", &searchParameters{Query: query}, opts, result) | ||||||
| 	return result, resp, err | 	return result, resp, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -208,9 +244,9 @@ func (l LabelResult) String() string { | |||||||
| // Labels searches labels in the repository with ID repoID via various criteria. | // Labels searches labels in the repository with ID repoID via various criteria. | ||||||
| // | // | ||||||
| // GitHub API docs: https://developer.github.com/v3/search/#search-labels | // GitHub API docs: https://developer.github.com/v3/search/#search-labels | ||||||
| func (s *SearchService) Labels(ctx context.Context, repoID int64, query string, opt *SearchOptions) (*LabelsSearchResult, *Response, error) { | func (s *SearchService) Labels(ctx context.Context, repoID int64, query string, opts *SearchOptions) (*LabelsSearchResult, *Response, error) { | ||||||
| 	result := new(LabelsSearchResult) | 	result := new(LabelsSearchResult) | ||||||
| 	resp, err := s.search(ctx, "labels", &searchParameters{RepositoryID: &repoID, Query: query}, opt, result) | 	resp, err := s.search(ctx, "labels", &searchParameters{RepositoryID: &repoID, Query: query}, opts, result) | ||||||
| 	return result, resp, err | 	return result, resp, err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -219,8 +255,8 @@ func (s *SearchService) Labels(ctx context.Context, repoID int64, query string, | |||||||
| // | // | ||||||
| // If searchParameters.Query includes multiple condition, it MUST NOT include "+" as condition separator. | // If searchParameters.Query includes multiple condition, it MUST NOT include "+" as condition separator. | ||||||
| // For example, querying with "language:c++" and "leveldb", then searchParameters.Query should be "language:c++ leveldb" but not "language:c+++leveldb". | // For example, querying with "language:c++" and "leveldb", then searchParameters.Query should be "language:c++ leveldb" but not "language:c+++leveldb". | ||||||
| func (s *SearchService) search(ctx context.Context, searchType string, parameters *searchParameters, opt *SearchOptions, result interface{}) (*Response, error) { | func (s *SearchService) search(ctx context.Context, searchType string, parameters *searchParameters, opts *SearchOptions, result interface{}) (*Response, error) { | ||||||
| 	params, err := qs.Values(opt) | 	params, err := qs.Values(opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -240,15 +276,15 @@ func (s *SearchService) search(ctx context.Context, searchType string, parameter | |||||||
| 		// Accept header for search commits preview endpoint | 		// Accept header for search commits preview endpoint | ||||||
| 		// TODO: remove custom Accept header when this API fully launches. | 		// TODO: remove custom Accept header when this API fully launches. | ||||||
| 		req.Header.Set("Accept", mediaTypeCommitSearchPreview) | 		req.Header.Set("Accept", mediaTypeCommitSearchPreview) | ||||||
|  | 	case searchType == "topics": | ||||||
|  | 		// Accept header for search repositories based on topics preview endpoint | ||||||
|  | 		// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 		req.Header.Set("Accept", mediaTypeTopicsPreview) | ||||||
| 	case searchType == "repositories": | 	case searchType == "repositories": | ||||||
| 		// Accept header for search repositories based on topics preview endpoint | 		// Accept header for search repositories based on topics preview endpoint | ||||||
| 		// TODO: remove custom Accept header when this API fully launches. | 		// TODO: remove custom Accept header when this API fully launches. | ||||||
| 		req.Header.Set("Accept", mediaTypeTopicsPreview) | 		req.Header.Set("Accept", mediaTypeTopicsPreview) | ||||||
| 	case searchType == "labels": | 	case opts != nil && opts.TextMatch: | ||||||
| 		// Accept header for search labels based on label description preview endpoint. |  | ||||||
| 		// TODO: remove custom Accept header when this API fully launches. |  | ||||||
| 		req.Header.Set("Accept", mediaTypeLabelDescriptionSearchPreview) |  | ||||||
| 	case opt != nil && opt.TextMatch: |  | ||||||
| 		// Accept header defaults to "application/vnd.github.v3+json" | 		// Accept header defaults to "application/vnd.github.v3+json" | ||||||
| 		// We change it here to fetch back text-match metadata | 		// We change it here to fetch back text-match metadata | ||||||
| 		req.Header.Set("Accept", "application/vnd.github.v3.text-match+json") | 		req.Header.Set("Accept", "application/vnd.github.v3.text-match+json") | ||||||
							
								
								
									
										850
									
								
								vendor/github.com/google/go-github/v32/github/teams.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										850
									
								
								vendor/github.com/google/go-github/v32/github/teams.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,850 @@ | |||||||
|  | // Copyright 2018 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"net/http" | ||||||
|  | 	"strings" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // TeamsService provides access to the team-related functions | ||||||
|  | // in the GitHub API. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/ | ||||||
|  | type TeamsService service | ||||||
|  |  | ||||||
|  | // Team represents a team within a GitHub organization. Teams are used to | ||||||
|  | // manage access to an organization's repositories. | ||||||
|  | type Team struct { | ||||||
|  | 	ID          *int64  `json:"id,omitempty"` | ||||||
|  | 	NodeID      *string `json:"node_id,omitempty"` | ||||||
|  | 	Name        *string `json:"name,omitempty"` | ||||||
|  | 	Description *string `json:"description,omitempty"` | ||||||
|  | 	URL         *string `json:"url,omitempty"` | ||||||
|  | 	Slug        *string `json:"slug,omitempty"` | ||||||
|  |  | ||||||
|  | 	// Permission specifies the default permission for repositories owned by the team. | ||||||
|  | 	Permission *string `json:"permission,omitempty"` | ||||||
|  |  | ||||||
|  | 	// Privacy identifies the level of privacy this team should have. | ||||||
|  | 	// Possible values are: | ||||||
|  | 	//     secret - only visible to organization owners and members of this team | ||||||
|  | 	//     closed - visible to all members of this organization | ||||||
|  | 	// Default is "secret". | ||||||
|  | 	Privacy *string `json:"privacy,omitempty"` | ||||||
|  |  | ||||||
|  | 	MembersCount    *int          `json:"members_count,omitempty"` | ||||||
|  | 	ReposCount      *int          `json:"repos_count,omitempty"` | ||||||
|  | 	Organization    *Organization `json:"organization,omitempty"` | ||||||
|  | 	MembersURL      *string       `json:"members_url,omitempty"` | ||||||
|  | 	RepositoriesURL *string       `json:"repositories_url,omitempty"` | ||||||
|  | 	Parent          *Team         `json:"parent,omitempty"` | ||||||
|  |  | ||||||
|  | 	// LDAPDN is only available in GitHub Enterprise and when the team | ||||||
|  | 	// membership is synchronized with LDAP. | ||||||
|  | 	LDAPDN *string `json:"ldap_dn,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (t Team) String() string { | ||||||
|  | 	return Stringify(t) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Invitation represents a team member's invitation status. | ||||||
|  | type Invitation struct { | ||||||
|  | 	ID     *int64  `json:"id,omitempty"` | ||||||
|  | 	NodeID *string `json:"node_id,omitempty"` | ||||||
|  | 	Login  *string `json:"login,omitempty"` | ||||||
|  | 	Email  *string `json:"email,omitempty"` | ||||||
|  | 	// Role can be one of the values - 'direct_member', 'admin', 'billing_manager', 'hiring_manager', or 'reinstate'. | ||||||
|  | 	Role              *string    `json:"role,omitempty"` | ||||||
|  | 	CreatedAt         *time.Time `json:"created_at,omitempty"` | ||||||
|  | 	Inviter           *User      `json:"inviter,omitempty"` | ||||||
|  | 	TeamCount         *int       `json:"team_count,omitempty"` | ||||||
|  | 	InvitationTeamURL *string    `json:"invitation_team_url,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (i Invitation) String() string { | ||||||
|  | 	return Stringify(i) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListTeams lists all of the teams for an organization. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#list-teams | ||||||
|  | func (s *TeamsService) ListTeams(ctx context.Context, org string, opts *ListOptions) ([]*Team, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams", org) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var teams []*Team | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &teams) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return teams, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetTeamByID fetches a team, given a specified organization ID, by ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#get-a-team-by-name | ||||||
|  | func (s *TeamsService) GetTeamByID(ctx context.Context, orgID, teamID int64) (*Team, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v", orgID, teamID) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	t := new(Team) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, t) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return t, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetTeamBySlug fetches a team, given a specified organization name, by slug. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#get-a-team-by-name | ||||||
|  | func (s *TeamsService) GetTeamBySlug(ctx context.Context, org, slug string) (*Team, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v", org, slug) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	t := new(Team) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, t) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return t, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewTeam represents a team to be created or modified. | ||||||
|  | type NewTeam struct { | ||||||
|  | 	Name         string   `json:"name"` // Name of the team. (Required.) | ||||||
|  | 	Description  *string  `json:"description,omitempty"` | ||||||
|  | 	Maintainers  []string `json:"maintainers,omitempty"` | ||||||
|  | 	RepoNames    []string `json:"repo_names,omitempty"` | ||||||
|  | 	ParentTeamID *int64   `json:"parent_team_id,omitempty"` | ||||||
|  |  | ||||||
|  | 	// Deprecated: Permission is deprecated when creating or editing a team in an org | ||||||
|  | 	// using the new GitHub permission model. It no longer identifies the | ||||||
|  | 	// permission a team has on its repos, but only specifies the default | ||||||
|  | 	// permission a repo is initially added with. Avoid confusion by | ||||||
|  | 	// specifying a permission value when calling AddTeamRepo. | ||||||
|  | 	Permission *string `json:"permission,omitempty"` | ||||||
|  |  | ||||||
|  | 	// Privacy identifies the level of privacy this team should have. | ||||||
|  | 	// Possible values are: | ||||||
|  | 	//     secret - only visible to organization owners and members of this team | ||||||
|  | 	//     closed - visible to all members of this organization | ||||||
|  | 	// Default is "secret". | ||||||
|  | 	Privacy *string `json:"privacy,omitempty"` | ||||||
|  |  | ||||||
|  | 	// LDAPDN may be used in GitHub Enterprise when the team membership | ||||||
|  | 	// is synchronized with LDAP. | ||||||
|  | 	LDAPDN *string `json:"ldap_dn,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (s NewTeam) String() string { | ||||||
|  | 	return Stringify(s) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateTeam creates a new team within an organization. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#create-a-team | ||||||
|  | func (s *TeamsService) CreateTeam(ctx context.Context, org string, team NewTeam) (*Team, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams", org) | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, team) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	t := new(Team) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, t) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return t, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // newTeamNoParent is the same as NewTeam but ensures that the | ||||||
|  | // "parent_team_id" field will be null. It is for internal use | ||||||
|  | // only and should not be exported. | ||||||
|  | type newTeamNoParent struct { | ||||||
|  | 	Name         string   `json:"name"` | ||||||
|  | 	Description  *string  `json:"description,omitempty"` | ||||||
|  | 	Maintainers  []string `json:"maintainers,omitempty"` | ||||||
|  | 	RepoNames    []string `json:"repo_names,omitempty"` | ||||||
|  | 	ParentTeamID *int64   `json:"parent_team_id"` // This will be "null" | ||||||
|  | 	Privacy      *string  `json:"privacy,omitempty"` | ||||||
|  | 	LDAPDN       *string  `json:"ldap_dn,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // copyNewTeamWithoutParent is used to set the "parent_team_id" | ||||||
|  | // field to "null" after copying the other fields from a NewTeam. | ||||||
|  | // It is for internal use only and should not be exported. | ||||||
|  | func copyNewTeamWithoutParent(team *NewTeam) *newTeamNoParent { | ||||||
|  | 	return &newTeamNoParent{ | ||||||
|  | 		Name:        team.Name, | ||||||
|  | 		Description: team.Description, | ||||||
|  | 		Maintainers: team.Maintainers, | ||||||
|  | 		RepoNames:   team.RepoNames, | ||||||
|  | 		Privacy:     team.Privacy, | ||||||
|  | 		LDAPDN:      team.LDAPDN, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // EditTeamByID edits a team, given an organization ID, selected by ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#update-a-team | ||||||
|  | func (s *TeamsService) EditTeamByID(ctx context.Context, orgID, teamID int64, team NewTeam, removeParent bool) (*Team, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v", orgID, teamID) | ||||||
|  |  | ||||||
|  | 	var req *http.Request | ||||||
|  | 	var err error | ||||||
|  | 	if removeParent { | ||||||
|  | 		teamRemoveParent := copyNewTeamWithoutParent(&team) | ||||||
|  | 		req, err = s.client.NewRequest("PATCH", u, teamRemoveParent) | ||||||
|  | 	} else { | ||||||
|  | 		req, err = s.client.NewRequest("PATCH", u, team) | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	t := new(Team) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, t) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return t, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // EditTeamBySlug edits a team, given an organization name, by slug. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#update-a-team | ||||||
|  | func (s *TeamsService) EditTeamBySlug(ctx context.Context, org, slug string, team NewTeam, removeParent bool) (*Team, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v", org, slug) | ||||||
|  |  | ||||||
|  | 	var req *http.Request | ||||||
|  | 	var err error | ||||||
|  | 	if removeParent { | ||||||
|  | 		teamRemoveParent := copyNewTeamWithoutParent(&team) | ||||||
|  | 		req, err = s.client.NewRequest("PATCH", u, teamRemoveParent) | ||||||
|  | 	} else { | ||||||
|  | 		req, err = s.client.NewRequest("PATCH", u, team) | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	t := new(Team) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, t) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return t, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteTeamByID deletes a team referenced by ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#delete-a-team | ||||||
|  | func (s *TeamsService) DeleteTeamByID(ctx context.Context, orgID, teamID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v", orgID, teamID) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteTeamBySlug deletes a team reference by slug. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#delete-a-team | ||||||
|  | func (s *TeamsService) DeleteTeamBySlug(ctx context.Context, org, slug string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v", org, slug) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListChildTeamsByParentID lists child teams for a parent team given parent ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#list-child-teams | ||||||
|  | func (s *TeamsService) ListChildTeamsByParentID(ctx context.Context, orgID, teamID int64, opts *ListOptions) ([]*Team, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/teams", orgID, teamID) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var teams []*Team | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &teams) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return teams, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListChildTeamsByParentSlug lists child teams for a parent team given parent slug. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#list-child-teams | ||||||
|  | func (s *TeamsService) ListChildTeamsByParentSlug(ctx context.Context, org, slug string, opts *ListOptions) ([]*Team, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/teams", org, slug) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var teams []*Team | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &teams) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return teams, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListTeamReposByID lists the repositories given a team ID that the specified team has access to. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#list-team-repositories | ||||||
|  | func (s *TeamsService) ListTeamReposByID(ctx context.Context, orgID, teamID int64, opts *ListOptions) ([]*Repository, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/repos", orgID, teamID) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when topics API fully launches. | ||||||
|  | 	headers := []string{mediaTypeTopicsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(headers, ", ")) | ||||||
|  |  | ||||||
|  | 	var repos []*Repository | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &repos) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return repos, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListTeamReposBySlug lists the repositories given a team slug that the specified team has access to. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#list-team-repositories | ||||||
|  | func (s *TeamsService) ListTeamReposBySlug(ctx context.Context, org, slug string, opts *ListOptions) ([]*Repository, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/repos", org, slug) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when topics API fully launches. | ||||||
|  | 	headers := []string{mediaTypeTopicsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(headers, ", ")) | ||||||
|  |  | ||||||
|  | 	var repos []*Repository | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &repos) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return repos, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IsTeamRepoByID checks if a team, given its ID, manages the specified repository. If the | ||||||
|  | // repository is managed by team, a Repository is returned which includes the | ||||||
|  | // permissions team has for that repo. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#check-team-permissions-for-a-repository | ||||||
|  | func (s *TeamsService) IsTeamRepoByID(ctx context.Context, orgID, teamID int64, owner, repo string) (*Repository, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/repos/%v/%v", orgID, teamID, owner, repo) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	headers := []string{mediaTypeOrgPermissionRepo} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(headers, ", ")) | ||||||
|  |  | ||||||
|  | 	repository := new(Repository) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, repository) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return repository, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IsTeamRepoBySlug checks if a team, given its slug, manages the specified repository. If the | ||||||
|  | // repository is managed by team, a Repository is returned which includes the | ||||||
|  | // permissions team has for that repo. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#check-team-permissions-for-a-repository | ||||||
|  | func (s *TeamsService) IsTeamRepoBySlug(ctx context.Context, org, slug, owner, repo string) (*Repository, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/repos/%v/%v", org, slug, owner, repo) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	headers := []string{mediaTypeOrgPermissionRepo} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(headers, ", ")) | ||||||
|  |  | ||||||
|  | 	repository := new(Repository) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, repository) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return repository, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // TeamAddTeamRepoOptions specifies the optional parameters to the | ||||||
|  | // TeamsService.AddTeamRepo method. | ||||||
|  | type TeamAddTeamRepoOptions struct { | ||||||
|  | 	// Permission specifies the permission to grant the team on this repository. | ||||||
|  | 	// Possible values are: | ||||||
|  | 	//     pull - team members can pull, but not push to or administer this repository | ||||||
|  | 	//     push - team members can pull and push, but not administer this repository | ||||||
|  | 	//     admin - team members can pull, push and administer this repository | ||||||
|  | 	//     maintain - team members can manage the repository without access to sensitive or destructive actions. | ||||||
|  | 	//     triage - team members can proactively manage issues and pull requests without write access. | ||||||
|  | 	// | ||||||
|  | 	// If not specified, the team's permission attribute will be used. | ||||||
|  | 	Permission string `json:"permission,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // AddTeamRepoByID adds a repository to be managed by the specified team given the team ID. | ||||||
|  | // The specified repository must be owned by the organization to which the team | ||||||
|  | // belongs, or a direct fork of a repository owned by the organization. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#add-or-update-team-repository-permissions | ||||||
|  | func (s *TeamsService) AddTeamRepoByID(ctx context.Context, orgID, teamID int64, owner, repo string, opts *TeamAddTeamRepoOptions) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/repos/%v/%v", orgID, teamID, owner, repo) | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // AddTeamRepoBySlug adds a repository to be managed by the specified team given the team slug. | ||||||
|  | // The specified repository must be owned by the organization to which the team | ||||||
|  | // belongs, or a direct fork of a repository owned by the organization. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#add-or-update-team-repository-permissions | ||||||
|  | func (s *TeamsService) AddTeamRepoBySlug(ctx context.Context, org, slug, owner, repo string, opts *TeamAddTeamRepoOptions) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/repos/%v/%v", org, slug, owner, repo) | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RemoveTeamRepoByID removes a repository from being managed by the specified | ||||||
|  | // team given the team ID. Note that this does not delete the repository, it | ||||||
|  | // just removes it from the team. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#remove-a-repository-from-a-team | ||||||
|  | func (s *TeamsService) RemoveTeamRepoByID(ctx context.Context, orgID, teamID int64, owner, repo string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/repos/%v/%v", orgID, teamID, owner, repo) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RemoveTeamRepoBySlug removes a repository from being managed by the specified | ||||||
|  | // team given the team slug. Note that this does not delete the repository, it | ||||||
|  | // just removes it from the team. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#remove-a-repository-from-a-team | ||||||
|  | func (s *TeamsService) RemoveTeamRepoBySlug(ctx context.Context, org, slug, owner, repo string) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/repos/%v/%v", org, slug, owner, repo) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListUserTeams lists a user's teams | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#list-teams-for-the-authenticated-user | ||||||
|  | func (s *TeamsService) ListUserTeams(ctx context.Context, opts *ListOptions) ([]*Team, *Response, error) { | ||||||
|  | 	u := "user/teams" | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var teams []*Team | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &teams) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return teams, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListTeamProjectsByID lists the organization projects for a team given the team ID. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#list-team-projects | ||||||
|  | func (s *TeamsService) ListTeamProjectsByID(ctx context.Context, orgID, teamID int64) ([]*Project, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/projects", orgID, teamID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	acceptHeaders := []string{mediaTypeProjectsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  |  | ||||||
|  | 	var projects []*Project | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &projects) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return projects, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListTeamProjectsBySlug lists the organization projects for a team given the team slug. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#list-team-projects | ||||||
|  | func (s *TeamsService) ListTeamProjectsBySlug(ctx context.Context, org, slug string) ([]*Project, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/projects", org, slug) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	acceptHeaders := []string{mediaTypeProjectsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  |  | ||||||
|  | 	var projects []*Project | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &projects) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return projects, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ReviewTeamProjectsByID checks whether a team, given its ID, has read, write, or admin | ||||||
|  | // permissions for an organization project. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#check-team-permissions-for-a-project | ||||||
|  | func (s *TeamsService) ReviewTeamProjectsByID(ctx context.Context, orgID, teamID, projectID int64) (*Project, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/projects/%v", orgID, teamID, projectID) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	acceptHeaders := []string{mediaTypeProjectsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  |  | ||||||
|  | 	projects := &Project{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &projects) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return projects, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ReviewTeamProjectsBySlug checks whether a team, given its slug, has read, write, or admin | ||||||
|  | // permissions for an organization project. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#check-team-permissions-for-a-project | ||||||
|  | func (s *TeamsService) ReviewTeamProjectsBySlug(ctx context.Context, org, slug string, projectID int64) (*Project, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/projects/%v", org, slug, projectID) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	acceptHeaders := []string{mediaTypeProjectsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  |  | ||||||
|  | 	projects := &Project{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &projects) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return projects, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // TeamProjectOptions specifies the optional parameters to the | ||||||
|  | // TeamsService.AddTeamProject method. | ||||||
|  | type TeamProjectOptions struct { | ||||||
|  | 	// Permission specifies the permission to grant to the team for this project. | ||||||
|  | 	// Possible values are: | ||||||
|  | 	//     "read" - team members can read, but not write to or administer this project. | ||||||
|  | 	//     "write" - team members can read and write, but not administer this project. | ||||||
|  | 	//     "admin" - team members can read, write and administer this project. | ||||||
|  | 	// | ||||||
|  | 	Permission *string `json:"permission,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // AddTeamProjectByID adds an organization project to a team given the team ID. | ||||||
|  | // To add a project to a team or update the team's permission on a project, the | ||||||
|  | // authenticated user must have admin permissions for the project. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#add-or-update-team-project-permissions | ||||||
|  | func (s *TeamsService) AddTeamProjectByID(ctx context.Context, orgID, teamID, projectID int64, opts *TeamProjectOptions) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/projects/%v", orgID, teamID, projectID) | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	acceptHeaders := []string{mediaTypeProjectsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // AddTeamProjectBySlug adds an organization project to a team given the team slug. | ||||||
|  | // To add a project to a team or update the team's permission on a project, the | ||||||
|  | // authenticated user must have admin permissions for the project. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#add-or-update-team-project-permissions | ||||||
|  | func (s *TeamsService) AddTeamProjectBySlug(ctx context.Context, org, slug string, projectID int64, opts *TeamProjectOptions) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/projects/%v", org, slug, projectID) | ||||||
|  | 	req, err := s.client.NewRequest("PUT", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	acceptHeaders := []string{mediaTypeProjectsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RemoveTeamProjectByID removes an organization project from a team given team ID. | ||||||
|  | // An organization owner or a team maintainer can remove any project from the team. | ||||||
|  | // To remove a project from a team as an organization member, the authenticated user | ||||||
|  | // must have "read" access to both the team and project, or "admin" access to the team | ||||||
|  | // or project. | ||||||
|  | // Note: This endpoint removes the project from the team, but does not delete it. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#remove-a-project-from-a-team | ||||||
|  | func (s *TeamsService) RemoveTeamProjectByID(ctx context.Context, orgID, teamID, projectID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/projects/%v", orgID, teamID, projectID) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	acceptHeaders := []string{mediaTypeProjectsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RemoveTeamProjectBySlug removes an organization project from a team given team slug. | ||||||
|  | // An organization owner or a team maintainer can remove any project from the team. | ||||||
|  | // To remove a project from a team as an organization member, the authenticated user | ||||||
|  | // must have "read" access to both the team and project, or "admin" access to the team | ||||||
|  | // or project. | ||||||
|  | // Note: This endpoint removes the project from the team, but does not delete it. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/#remove-a-project-from-a-team | ||||||
|  | func (s *TeamsService) RemoveTeamProjectBySlug(ctx context.Context, org, slug string, projectID int64) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/projects/%v", org, slug, projectID) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// TODO: remove custom Accept header when this API fully launches. | ||||||
|  | 	acceptHeaders := []string{mediaTypeProjectsPreview} | ||||||
|  | 	req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IDPGroupList represents a list of external identity provider (IDP) groups. | ||||||
|  | type IDPGroupList struct { | ||||||
|  | 	Groups []*IDPGroup `json:"groups"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IDPGroup represents an external identity provider (IDP) group. | ||||||
|  | type IDPGroup struct { | ||||||
|  | 	GroupID          *string `json:"group_id,omitempty"` | ||||||
|  | 	GroupName        *string `json:"group_name,omitempty"` | ||||||
|  | 	GroupDescription *string `json:"group_description,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListIDPGroupsInOrganization lists IDP groups available in an organization. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/team_sync/#list-idp-groups-for-an-organization | ||||||
|  | func (s *TeamsService) ListIDPGroupsInOrganization(ctx context.Context, org string, opts *ListCursorOptions) (*IDPGroupList, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/team-sync/groups", org) | ||||||
|  | 	u, err := addOptions(u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	groups := new(IDPGroupList) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, groups) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 	return groups, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListIDPGroupsForTeamByID lists IDP groups connected to a team on GitHub | ||||||
|  | // given organization and team IDs. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/team_sync/#list-idp-groups-for-a-team | ||||||
|  | func (s *TeamsService) ListIDPGroupsForTeamByID(ctx context.Context, orgID, teamID int64) (*IDPGroupList, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/team-sync/group-mappings", orgID, teamID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	groups := new(IDPGroupList) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, groups) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 	return groups, resp, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListIDPGroupsForTeamBySlug lists IDP groups connected to a team on GitHub | ||||||
|  | // given organization name and team slug. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/team_sync/#list-idp-groups-for-a-team | ||||||
|  | func (s *TeamsService) ListIDPGroupsForTeamBySlug(ctx context.Context, org, slug string) (*IDPGroupList, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/team-sync/group-mappings", org, slug) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	groups := new(IDPGroupList) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, groups) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  | 	return groups, resp, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateOrUpdateIDPGroupConnectionsByID creates, updates, or removes a connection | ||||||
|  | // between a team and an IDP group given organization and team IDs. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/team_sync/#create-or-update-idp-group-connections | ||||||
|  | func (s *TeamsService) CreateOrUpdateIDPGroupConnectionsByID(ctx context.Context, orgID, teamID int64, opts IDPGroupList) (*IDPGroupList, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/team-sync/group-mappings", orgID, teamID) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("PATCH", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	groups := new(IDPGroupList) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, groups) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return groups, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateOrUpdateIDPGroupConnectionsBySlug creates, updates, or removes a connection | ||||||
|  | // between a team and an IDP group given organization name and team slug. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/team_sync/#create-or-update-idp-group-connections | ||||||
|  | func (s *TeamsService) CreateOrUpdateIDPGroupConnectionsBySlug(ctx context.Context, org, slug string, opts IDPGroupList) (*IDPGroupList, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/team-sync/group-mappings", org, slug) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("PATCH", u, opts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	groups := new(IDPGroupList) | ||||||
|  | 	resp, err := s.client.Do(ctx, req, groups) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return groups, resp, nil | ||||||
|  | } | ||||||
							
								
								
									
										242
									
								
								vendor/github.com/google/go-github/v32/github/teams_discussion_comments.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								vendor/github.com/google/go-github/v32/github/teams_discussion_comments.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,242 @@ | |||||||
|  | // Copyright 2018 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 | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // DiscussionComment represents a GitHub dicussion in a team. | ||||||
|  | type DiscussionComment struct { | ||||||
|  | 	Author        *User      `json:"author,omitempty"` | ||||||
|  | 	Body          *string    `json:"body,omitempty"` | ||||||
|  | 	BodyHTML      *string    `json:"body_html,omitempty"` | ||||||
|  | 	BodyVersion   *string    `json:"body_version,omitempty"` | ||||||
|  | 	CreatedAt     *Timestamp `json:"created_at,omitempty"` | ||||||
|  | 	LastEditedAt  *Timestamp `json:"last_edited_at,omitempty"` | ||||||
|  | 	DiscussionURL *string    `json:"discussion_url,omitempty"` | ||||||
|  | 	HTMLURL       *string    `json:"html_url,omitempty"` | ||||||
|  | 	NodeID        *string    `json:"node_id,omitempty"` | ||||||
|  | 	Number        *int       `json:"number,omitempty"` | ||||||
|  | 	UpdatedAt     *Timestamp `json:"updated_at,omitempty"` | ||||||
|  | 	URL           *string    `json:"url,omitempty"` | ||||||
|  | 	Reactions     *Reactions `json:"reactions,omitempty"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c DiscussionComment) String() string { | ||||||
|  | 	return Stringify(c) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DiscussionCommentListOptions specifies optional parameters to the | ||||||
|  | // TeamServices.ListComments method. | ||||||
|  | type DiscussionCommentListOptions struct { | ||||||
|  | 	// Sorts the discussion comments by the date they were created. | ||||||
|  | 	// Accepted values are asc and desc. Default is desc. | ||||||
|  | 	Direction string `url:"direction,omitempty"` | ||||||
|  | 	ListOptions | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListCommentsByID lists all comments on a team discussion by team ID. | ||||||
|  | // Authenticated user must grant read:discussion scope. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#list-discussion-comments | ||||||
|  | func (s *TeamsService) ListCommentsByID(ctx context.Context, orgID, teamID int64, discussionNumber int, options *DiscussionCommentListOptions) ([]*DiscussionComment, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments", orgID, teamID, discussionNumber) | ||||||
|  | 	u, err := addOptions(u, options) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var comments []*DiscussionComment | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &comments) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return comments, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ListCommentsBySlug lists all comments on a team discussion by team slug. | ||||||
|  | // Authenticated user must grant read:discussion scope. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#list-discussion-comments | ||||||
|  | func (s *TeamsService) ListCommentsBySlug(ctx context.Context, org, slug string, discussionNumber int, options *DiscussionCommentListOptions) ([]*DiscussionComment, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments", org, slug, discussionNumber) | ||||||
|  | 	u, err := addOptions(u, options) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var comments []*DiscussionComment | ||||||
|  | 	resp, err := s.client.Do(ctx, req, &comments) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return comments, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetCommentByID gets a specific comment on a team discussion by team ID. | ||||||
|  | // Authenticated user must grant read:discussion scope. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#get-a-discussion-comment | ||||||
|  | func (s *TeamsService) GetCommentByID(ctx context.Context, orgID, teamID int64, discussionNumber, commentNumber int) (*DiscussionComment, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v", orgID, teamID, discussionNumber, commentNumber) | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	discussionComment := &DiscussionComment{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, discussionComment) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return discussionComment, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetCommentBySlug gets a specific comment on a team discussion by team slug. | ||||||
|  | // Authenticated user must grant read:discussion scope. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#get-a-discussion-comment | ||||||
|  | func (s *TeamsService) GetCommentBySlug(ctx context.Context, org, slug string, discussionNumber, commentNumber int) (*DiscussionComment, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v", org, slug, discussionNumber, commentNumber) | ||||||
|  |  | ||||||
|  | 	req, err := s.client.NewRequest("GET", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	discussionComment := &DiscussionComment{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, discussionComment) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return discussionComment, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateCommentByID creates a new comment on a team discussion by team ID. | ||||||
|  | // Authenticated user must grant write:discussion scope. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#create-a-discussion-comment | ||||||
|  | func (s *TeamsService) CreateCommentByID(ctx context.Context, orgID, teamID int64, discsusionNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments", orgID, teamID, discsusionNumber) | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, comment) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	discussionComment := &DiscussionComment{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, discussionComment) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return discussionComment, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CreateCommentBySlug creates a new comment on a team discussion by team slug. | ||||||
|  | // Authenticated user must grant write:discussion scope. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#create-a-discussion-comment | ||||||
|  | func (s *TeamsService) CreateCommentBySlug(ctx context.Context, org, slug string, discsusionNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments", org, slug, discsusionNumber) | ||||||
|  | 	req, err := s.client.NewRequest("POST", u, comment) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	discussionComment := &DiscussionComment{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, discussionComment) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return discussionComment, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // EditCommentByID edits the body text of a discussion comment by team ID. | ||||||
|  | // Authenticated user must grant write:discussion scope. | ||||||
|  | // User is allowed to edit body of a comment only. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#update-a-discussion-comment | ||||||
|  | func (s *TeamsService) EditCommentByID(ctx context.Context, orgID, teamID int64, discussionNumber, commentNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v", orgID, teamID, discussionNumber, commentNumber) | ||||||
|  | 	req, err := s.client.NewRequest("PATCH", u, comment) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	discussionComment := &DiscussionComment{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, discussionComment) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return discussionComment, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // EditCommentBySlug edits the body text of a discussion comment by team slug. | ||||||
|  | // Authenticated user must grant write:discussion scope. | ||||||
|  | // User is allowed to edit body of a comment only. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#update-a-discussion-comment | ||||||
|  | func (s *TeamsService) EditCommentBySlug(ctx context.Context, org, slug string, discussionNumber, commentNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v", org, slug, discussionNumber, commentNumber) | ||||||
|  | 	req, err := s.client.NewRequest("PATCH", u, comment) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	discussionComment := &DiscussionComment{} | ||||||
|  | 	resp, err := s.client.Do(ctx, req, discussionComment) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, resp, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return discussionComment, resp, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteCommentByID deletes a comment on a team discussion by team ID. | ||||||
|  | // Authenticated user must grant write:discussion scope. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#delete-a-discussion-comment | ||||||
|  | func (s *TeamsService) DeleteCommentByID(ctx context.Context, orgID, teamID int64, discussionNumber, commentNumber int) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v", orgID, teamID, discussionNumber, commentNumber) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DeleteCommentBySlug deletes a comment on a team discussion by team slug. | ||||||
|  | // Authenticated user must grant write:discussion scope. | ||||||
|  | // | ||||||
|  | // GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#delete-a-discussion-comment | ||||||
|  | func (s *TeamsService) DeleteCommentBySlug(ctx context.Context, org, slug string, discussionNumber, commentNumber int) (*Response, error) { | ||||||
|  | 	u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v", org, slug, discussionNumber, commentNumber) | ||||||
|  | 	req, err := s.client.NewRequest("DELETE", u, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return s.client.Do(ctx, req, nil) | ||||||
|  | } | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user