Changelog Overhaul (#18)
Formatting Signed-off-by: jolheiser <john.olheiser@gmail.com> Skip regex if not set and add newline after error Signed-off-by: jolheiser <john.olheiser@gmail.com> Change skip label to regex Signed-off-by: jolheiser <john.olheiser@gmail.com> Wording Signed-off-by: jolheiser <john.olheiser@gmail.com> Re-generate Signed-off-by: jolheiser <john.olheiser@gmail.com> Wipe out go.sum and tidy Signed-off-by: jolheiser <john.olheiser@gmail.com> Fix potential bug Signed-off-by: jolheiser <john.olheiser@gmail.com> Formatting Signed-off-by: jolheiser <john.olheiser@gmail.com> Formatting Signed-off-by: jolheiser <john.olheiser@gmail.com> Add fresh paint Signed-off-by: jolheiser <john.olheiser@gmail.com> Co-authored-by: jolheiser <john.olheiser@gmail.com> Reviewed-by: Guillermo Prandi <guillep2k@noreply.gitea.io> Reviewed-by: lafriks <lafriks@noreply.gitea.io>
This commit is contained in:
parent
e79866fe55
commit
0692cd4388
7
.gitignore
vendored
7
.gitignore
vendored
@ -1 +1,6 @@
|
|||||||
changelog
|
# GoLand
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Binaries
|
||||||
|
/changelog
|
||||||
|
/changelog.exe
|
33
README.md
33
README.md
@ -1,25 +1,40 @@
|
|||||||
# Changelog - Generate changelog of gitea repository
|
# Changelog
|
||||||
|
A changelog generator for Gitea
|
||||||
|
|
||||||
[![Build Status](https://drone.gitea.io/api/badges/go-gitea/changelog/status.svg)](https://drone.gitea.io/go-gitea/changelog)
|
[![Build Status](https://drone.gitea.com/api/badges/gitea/changelog/status.svg)](https://drone.gitea.com/gitea/changelog)
|
||||||
|
|
||||||
## Purpose
|
## Purpose
|
||||||
|
|
||||||
This repo currently is part of Gitea. The purpose it to generate changelog when writing release notes. If a project management like Gitea, it could use this tool, otherwise please find another. The tool generate changelog depends on your PRs on the milestone and the labels of a PR.
|
This repo is currently part of Gitea. The purpose of it is to generate a changelog when writing release notes.
|
||||||
|
This project was made for Gitea, so while you are free to use it in your own projects, it is subject to change with Gitea.
|
||||||
|
This tool generates a changelog from PRs based on their milestone and labels.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
```
|
```
|
||||||
go get github.com/go-gitea/changelog
|
go get gitea.com/gitea/changelog
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
See the [changelog.yml.example](changelog.yml.example) example file.
|
See the [changelog.example.yml](changelog.example.yml) example file.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
#### Changelog Entries
|
||||||
```
|
```
|
||||||
changelog -m=1.2.0 -c=/path/to/my_config_file
|
changelog -m=1.11.0 -c=/path/to/my_config_file generate
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Contributors List
|
||||||
|
```
|
||||||
|
changelog -m=1.11.0 -c=/path/to/my_config_file contributors
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building
|
||||||
|
```
|
||||||
|
go generate ./...
|
||||||
|
go build
|
||||||
```
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
@ -28,9 +43,9 @@ Fork -> Patch -> Push -> Pull Request
|
|||||||
|
|
||||||
## Authors
|
## Authors
|
||||||
|
|
||||||
* [Maintainers](https://github.com/orgs/go-gitea/people)
|
* [Maintainers](https://gitea.com/org/gitea/members)
|
||||||
* [Contributors](https://github.com/go-gitea/changelog/graphs/contributors)
|
* [Contributors](https://gitea.com/gitea/changelog/commits/branch/master)<!-- FIXME when contributors page works -->
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
This project is licensed under the MIT License. See the [LICENSE](https://github.com/go-gitea/changelog/blob/master/LICENSE) file for the full license text.
|
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for the full license text.
|
||||||
|
35
changelog.example.go
Normal file
35
changelog.example.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
exampleFile = "changelog.example.yml"
|
||||||
|
writeFile = "config_default.go"
|
||||||
|
tmpl = `package main
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
defaultConfig = []byte(` + "`" + `%s` + "`" + `)
|
||||||
|
}
|
||||||
|
`
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
bytes, err := ioutil.ReadFile(exampleFile)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Could not read from %s. Are you in the root directory of the project?", exampleFile)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
data := fmt.Sprintf(tmpl, string(bytes))
|
||||||
|
|
||||||
|
if err := ioutil.WriteFile(writeFile, []byte(data), os.ModePerm); err != nil {
|
||||||
|
fmt.Printf("Could not write to %s.", writeFile)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
@ -1,11 +1,14 @@
|
|||||||
|
# The full repository name
|
||||||
repo: go-gitea/gitea
|
repo: go-gitea/gitea
|
||||||
|
|
||||||
|
# Changelog groups and which labeled PRs to add to each group
|
||||||
groups:
|
groups:
|
||||||
-
|
-
|
||||||
name: BREAKING
|
name: BREAKING
|
||||||
labels:
|
labels:
|
||||||
- kind/breaking
|
- kind/breaking
|
||||||
-
|
-
|
||||||
name: FEATURE
|
name: FEATURES
|
||||||
labels:
|
labels:
|
||||||
- kind/feature
|
- kind/feature
|
||||||
-
|
-
|
||||||
@ -13,7 +16,7 @@ groups:
|
|||||||
labels:
|
labels:
|
||||||
- kind/bug
|
- kind/bug
|
||||||
-
|
-
|
||||||
name: ENHANCEMENT
|
name: ENHANCEMENTS
|
||||||
labels:
|
labels:
|
||||||
- kind/enhancement
|
- kind/enhancement
|
||||||
- kind/refactor
|
- kind/refactor
|
||||||
@ -42,3 +45,6 @@ groups:
|
|||||||
-
|
-
|
||||||
name: MISC
|
name: MISC
|
||||||
default: true
|
default: true
|
||||||
|
|
||||||
|
# regex indicating which labels to skip for the changelog
|
||||||
|
skip-labels: skip-changelog|backport\/.+
|
54
config.go
Normal file
54
config.go
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
//go:generate go run changelog.example.go
|
||||||
|
//go:generate go fmt ./...
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"regexp"
|
||||||
|
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var defaultConfig []byte
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
Repo string `yaml:"repo"`
|
||||||
|
Groups []struct {
|
||||||
|
Name string `yaml:"name"`
|
||||||
|
Labels []string `yaml:"labels"`
|
||||||
|
Default bool `yaml:"default"`
|
||||||
|
} `yaml:"groups"`
|
||||||
|
SkipLabels string `yaml:"skip-labels"`
|
||||||
|
SkipRegex *regexp.Regexp `yaml:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadConfig() (*Config, error) {
|
||||||
|
var err error
|
||||||
|
var configContent []byte
|
||||||
|
if len(configPath) == 0 {
|
||||||
|
configContent = defaultConfig
|
||||||
|
} else {
|
||||||
|
configContent, err = ioutil.ReadFile(configPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var config *Config
|
||||||
|
if err = yaml.Unmarshal(configContent, &config); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(config.SkipLabels) > 0 {
|
||||||
|
if config.SkipRegex, err = regexp.Compile(config.SkipLabels); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config, nil
|
||||||
|
}
|
54
config_default.go
Normal file
54
config_default.go
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
defaultConfig = []byte(`# The full repository name
|
||||||
|
repo: go-gitea/gitea
|
||||||
|
|
||||||
|
# Changelog groups and which labeled PRs to add to each group
|
||||||
|
groups:
|
||||||
|
-
|
||||||
|
name: BREAKING
|
||||||
|
labels:
|
||||||
|
- kind/breaking
|
||||||
|
-
|
||||||
|
name: FEATURES
|
||||||
|
labels:
|
||||||
|
- kind/feature
|
||||||
|
-
|
||||||
|
name: BUGFIXES
|
||||||
|
labels:
|
||||||
|
- kind/bug
|
||||||
|
-
|
||||||
|
name: ENHANCEMENTS
|
||||||
|
labels:
|
||||||
|
- kind/enhancement
|
||||||
|
- kind/refactor
|
||||||
|
- kind/ui
|
||||||
|
-
|
||||||
|
name: SECURITY
|
||||||
|
labels:
|
||||||
|
- kind/security
|
||||||
|
-
|
||||||
|
name: TESTING
|
||||||
|
labels:
|
||||||
|
- kind/testing
|
||||||
|
-
|
||||||
|
name: TRANSLATION
|
||||||
|
labels:
|
||||||
|
- kind/translation
|
||||||
|
-
|
||||||
|
name: BUILD
|
||||||
|
labels:
|
||||||
|
- kind/build
|
||||||
|
- kind/lint
|
||||||
|
-
|
||||||
|
name: DOCS
|
||||||
|
labels:
|
||||||
|
- kind/docs
|
||||||
|
-
|
||||||
|
name: MISC
|
||||||
|
default: true
|
||||||
|
|
||||||
|
# regex indicating which labels to skip for the changelog
|
||||||
|
skip-labels: skip-changelog|backport\/.+`)
|
||||||
|
}
|
@ -7,65 +7,33 @@ package main
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/go-yaml/yaml"
|
|
||||||
"github.com/google/go-github/github"
|
"github.com/google/go-github/github"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var cmdContributors = cli.Command{
|
var cmdContributors = &cli.Command{
|
||||||
Name: "contributors",
|
Name: "contributors",
|
||||||
Usage: "generate contributors list of the milestone",
|
Usage: "generate contributors list",
|
||||||
Description: `generate contributors list of the milestone`,
|
Description: "generate contributors list",
|
||||||
Action: runContributors,
|
Action: runContributors,
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "milestone, m",
|
|
||||||
Usage: "Generate which tag from",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "config, c",
|
|
||||||
Usage: "Specify a config file",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func runContributors(cmd *cli.Context) {
|
func runContributors(cmd *cli.Context) error {
|
||||||
milestone := cmd.String("milestone")
|
config, err := LoadConfig()
|
||||||
if milestone == "" {
|
|
||||||
fmt.Println("Please specify a milestone")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
var configContent []byte
|
|
||||||
if cmd.String("config") == "" {
|
|
||||||
configContent = defaultConfig
|
|
||||||
} else {
|
|
||||||
configContent, err = ioutil.ReadFile(cmd.String("config"))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Load config from file %s failed: %v\n", cmd.String("config"), err)
|
return err
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var config Config
|
|
||||||
err = yaml.Unmarshal(configContent, &config)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("Unmarshal config content failed: %v\n", err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
client := github.NewClient(nil)
|
client := github.NewClient(nil)
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
var contributorsMap = make(map[string]bool)
|
contributorsMap := make(map[string]bool)
|
||||||
var query = fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Repo, milestone)
|
query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Repo, milestone)
|
||||||
var p = 1
|
p := 1
|
||||||
var perPage = 100
|
perPage := 100
|
||||||
for {
|
for {
|
||||||
result, _, err := client.Search.Issues(ctx, query, &github.SearchOptions{
|
result, _, err := client.Search.Issues(ctx, query, &github.SearchOptions{
|
||||||
ListOptions: github.ListOptions{
|
ListOptions: github.ListOptions{
|
||||||
@ -97,4 +65,6 @@ func runContributors(cmd *cli.Context) {
|
|||||||
for _, contributor := range contributors {
|
for _, contributor := range contributors {
|
||||||
fmt.Printf("* [@%s](https://github.com/%s)\n", contributor, contributor)
|
fmt.Printf("* [@%s](https://github.com/%s)\n", contributor, contributor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
103
generate.go
Normal file
103
generate.go
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/go-github/github"
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var cmdGenerate = &cli.Command{
|
||||||
|
Name: "generate",
|
||||||
|
Usage: "generate changelog",
|
||||||
|
Description: "generate changelog",
|
||||||
|
Action: runGenerate,
|
||||||
|
}
|
||||||
|
|
||||||
|
func runGenerate(cmd *cli.Context) error {
|
||||||
|
config, err := LoadConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
client := github.NewClient(nil)
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
labels := make(map[string]string)
|
||||||
|
changelogs := make(map[string][]github.Issue)
|
||||||
|
var defaultGroup string
|
||||||
|
for _, g := range config.Groups {
|
||||||
|
changelogs[g.Name] = []github.Issue{}
|
||||||
|
for _, l := range g.Labels {
|
||||||
|
labels[l] = g.Name
|
||||||
|
}
|
||||||
|
if g.Default {
|
||||||
|
defaultGroup = g.Name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if defaultGroup == "" {
|
||||||
|
defaultGroup = config.Groups[len(config.Groups)-1].Name
|
||||||
|
}
|
||||||
|
|
||||||
|
query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Repo, milestone)
|
||||||
|
p := 1
|
||||||
|
perPage := 100
|
||||||
|
for {
|
||||||
|
result, _, err := client.Search.Issues(ctx, query, &github.SearchOptions{
|
||||||
|
ListOptions: github.ListOptions{
|
||||||
|
Page: p,
|
||||||
|
PerPage: perPage,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
p++
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
PRLoop: // labels in Go, let's get old school
|
||||||
|
for _, pr := range result.Issues {
|
||||||
|
var label string
|
||||||
|
for _, lb := range pr.Labels {
|
||||||
|
if config.SkipRegex != nil && config.SkipRegex.MatchString(lb.GetName()) {
|
||||||
|
continue PRLoop
|
||||||
|
}
|
||||||
|
|
||||||
|
if g, ok := labels[lb.GetName()]; ok && len(label) == 0 {
|
||||||
|
label = g
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(label) > 0 {
|
||||||
|
changelogs[label] = append(changelogs[label], pr)
|
||||||
|
} else {
|
||||||
|
changelogs[defaultGroup] = append(changelogs[defaultGroup], pr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(result.Issues) != perPage {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("## [%s](https://github.com/%s/releases/tag/v%s) - %s\n", milestone, config.Repo, milestone, time.Now().Format("2006-01-02"))
|
||||||
|
for _, g := range config.Groups {
|
||||||
|
if len(changelogs[g.Name]) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("* " + g.Name)
|
||||||
|
for _, pr := range changelogs[g.Name] {
|
||||||
|
fmt.Printf(" * %s (#%d)\n", *pr.Title, *pr.Number)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
11
go.mod
Normal file
11
go.mod
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
module code.gitea.io/changelog
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
|
||||||
|
github.com/google/go-github v17.0.0+incompatible
|
||||||
|
github.com/google/go-querystring v1.0.0 // indirect
|
||||||
|
github.com/urfave/cli/v2 v2.1.1
|
||||||
|
gopkg.in/yaml.v2 v2.2.7
|
||||||
|
)
|
21
go.sum
Normal file
21
go.sum
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
|
github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=
|
||||||
|
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
|
||||||
|
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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||||
|
github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k=
|
||||||
|
github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=
|
||||||
|
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
212
main.go
212
main.go
@ -5,199 +5,49 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/go-yaml/yaml"
|
"github.com/urfave/cli/v2"
|
||||||
"github.com/google/go-github/github"
|
|
||||||
"github.com/urfave/cli"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// Version of changelog
|
// Version of changelog
|
||||||
Version = "0.1"
|
Version = "0.2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
milestone string
|
||||||
|
configPath string
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
app := cli.NewApp()
|
app := &cli.App{
|
||||||
app.Name = "changelog"
|
Name: "changelog",
|
||||||
app.Usage = "Generate changelog of gitea repository"
|
Usage: "Changelog generator for Gitea",
|
||||||
app.Version = Version
|
Version: Version,
|
||||||
app.Commands = []cli.Command{
|
Flags: []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "milestone",
|
||||||
|
Aliases: []string{"m"},
|
||||||
|
Usage: "Targeted milestone",
|
||||||
|
Required: true,
|
||||||
|
Destination: &milestone,
|
||||||
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "config",
|
||||||
|
Aliases: []string{"c"},
|
||||||
|
Usage: "Specify a config file",
|
||||||
|
Destination: &configPath,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Commands: []*cli.Command{
|
||||||
cmdGenerate,
|
cmdGenerate,
|
||||||
cmdContributors,
|
cmdContributors,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
err := app.Run(os.Args)
|
|
||||||
if err != nil {
|
if err := app.Run(os.Args); err != nil {
|
||||||
log.Fatal(4, "Failed to run app with %s: %v", os.Args, err)
|
fmt.Printf("Failed to run app with %s: %v\n", os.Args[1:], err)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var cmdGenerate = cli.Command{
|
|
||||||
Name: "generate",
|
|
||||||
Usage: "generate changelog of gitea repository",
|
|
||||||
Description: `generate changelog of gitea repository`,
|
|
||||||
Action: runGenerate,
|
|
||||||
Flags: []cli.Flag{
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "milestone, m",
|
|
||||||
Usage: "Generate which tag from",
|
|
||||||
},
|
|
||||||
cli.StringFlag{
|
|
||||||
Name: "config, c",
|
|
||||||
Usage: "Specify a config file",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
type Config struct {
|
|
||||||
Repo string `yml:"repo"`
|
|
||||||
Groups []struct {
|
|
||||||
Name string `yml:"name"`
|
|
||||||
Labels []string `yml:"labels"`
|
|
||||||
Default bool `yml:"default"`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
defaultConfig = []byte(`repo: go-gitea/gitea
|
|
||||||
groups:
|
|
||||||
-
|
|
||||||
name: BREAKING
|
|
||||||
labels:
|
|
||||||
- kind/breaking
|
|
||||||
-
|
|
||||||
name: FEATURE
|
|
||||||
labels:
|
|
||||||
- kind/feature
|
|
||||||
-
|
|
||||||
name: BUGFIXES
|
|
||||||
labels:
|
|
||||||
- kind/bug
|
|
||||||
-
|
|
||||||
name: ENHANCEMENT
|
|
||||||
labels:
|
|
||||||
- kind/enhancement
|
|
||||||
- kind/refactor
|
|
||||||
-
|
|
||||||
name: SECURITY
|
|
||||||
labels:
|
|
||||||
- kind/security
|
|
||||||
-
|
|
||||||
name: TESTING
|
|
||||||
labels:
|
|
||||||
- kind/testing
|
|
||||||
-
|
|
||||||
name: TRANSLATION
|
|
||||||
labels:
|
|
||||||
- kind/translation
|
|
||||||
-
|
|
||||||
name: BUILD
|
|
||||||
labels:
|
|
||||||
- kind/build
|
|
||||||
- kind/lint
|
|
||||||
-
|
|
||||||
name: DOCS
|
|
||||||
labels:
|
|
||||||
- kind/docs
|
|
||||||
-
|
|
||||||
name: MISC
|
|
||||||
default: true`)
|
|
||||||
)
|
|
||||||
|
|
||||||
func runGenerate(cmd *cli.Context) {
|
|
||||||
milestone := cmd.String("milestone")
|
|
||||||
if milestone == "" {
|
|
||||||
fmt.Println("Please specify a milestone")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
var configContent []byte
|
|
||||||
if cmd.String("config") == "" {
|
|
||||||
configContent = defaultConfig
|
|
||||||
} else {
|
|
||||||
configContent, err = ioutil.ReadFile(cmd.String("config"))
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("Load config from file %s failed: %v\n", cmd.String("config"), err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var config Config
|
|
||||||
err = yaml.Unmarshal(configContent, &config)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("Unmarshal config content failed: %v\n", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
client := github.NewClient(nil)
|
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
var labels = make(map[string]string)
|
|
||||||
var changelogs = make(map[string][]github.Issue)
|
|
||||||
var defaultGroup string
|
|
||||||
for _, g := range config.Groups {
|
|
||||||
changelogs[g.Name] = []github.Issue{}
|
|
||||||
for _, l := range g.Labels {
|
|
||||||
labels[l] = g.Name
|
|
||||||
}
|
|
||||||
if g.Default {
|
|
||||||
defaultGroup = g.Name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if defaultGroup == "" {
|
|
||||||
defaultGroup = config.Groups[len(config.Groups)-1].Name
|
|
||||||
}
|
|
||||||
|
|
||||||
var query = fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Repo, milestone)
|
|
||||||
var p = 1
|
|
||||||
var perPage = 100
|
|
||||||
for {
|
|
||||||
result, _, err := client.Search.Issues(ctx, query, &github.SearchOptions{
|
|
||||||
ListOptions: github.ListOptions{
|
|
||||||
Page: p,
|
|
||||||
PerPage: perPage,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
p++
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, pr := range result.Issues {
|
|
||||||
var found bool
|
|
||||||
for _, lb := range pr.Labels {
|
|
||||||
if g, ok := labels[lb.GetName()]; ok {
|
|
||||||
changelogs[g] = append(changelogs[g], pr)
|
|
||||||
found = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !found {
|
|
||||||
changelogs[defaultGroup] = append(changelogs[defaultGroup], pr)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(result.Issues) != perPage {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("## [%s](https://github.com/%s/releases/tag/v%s) - %s\n", milestone, config.Repo, milestone, time.Now().Format("2006-01-02"))
|
|
||||||
for _, g := range config.Groups {
|
|
||||||
if len(changelogs[g.Name]) == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("* " + g.Name)
|
|
||||||
for _, pr := range changelogs[g.Name] {
|
|
||||||
fmt.Printf(" * %s (#%d)\n", *pr.Title, *pr.Number)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
13
vendor/github.com/go-yaml/yaml/LICENSE
generated
vendored
13
vendor/github.com/go-yaml/yaml/LICENSE
generated
vendored
@ -1,13 +0,0 @@
|
|||||||
Copyright 2011-2016 Canonical Ltd.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
31
vendor/github.com/go-yaml/yaml/LICENSE.libyaml
generated
vendored
31
vendor/github.com/go-yaml/yaml/LICENSE.libyaml
generated
vendored
@ -1,31 +0,0 @@
|
|||||||
The following files were ported to Go from C files of libyaml, and thus
|
|
||||||
are still covered by their original copyright and license:
|
|
||||||
|
|
||||||
apic.go
|
|
||||||
emitterc.go
|
|
||||||
parserc.go
|
|
||||||
readerc.go
|
|
||||||
scannerc.go
|
|
||||||
writerc.go
|
|
||||||
yamlh.go
|
|
||||||
yamlprivateh.go
|
|
||||||
|
|
||||||
Copyright (c) 2006 Kirill Simonov
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
131
vendor/github.com/go-yaml/yaml/README.md
generated
vendored
131
vendor/github.com/go-yaml/yaml/README.md
generated
vendored
@ -1,131 +0,0 @@
|
|||||||
# YAML support for the Go language
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
------------
|
|
||||||
|
|
||||||
The yaml package enables Go programs to comfortably encode and decode YAML
|
|
||||||
values. It was developed within [Canonical](https://www.canonical.com) as
|
|
||||||
part of the [juju](https://juju.ubuntu.com) project, and is based on a
|
|
||||||
pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML)
|
|
||||||
C library to parse and generate YAML data quickly and reliably.
|
|
||||||
|
|
||||||
Compatibility
|
|
||||||
-------------
|
|
||||||
|
|
||||||
The yaml package supports most of YAML 1.1 and 1.2, including support for
|
|
||||||
anchors, tags, map merging, etc. Multi-document unmarshalling is not yet
|
|
||||||
implemented, and base-60 floats from YAML 1.1 are purposefully not
|
|
||||||
supported since they're a poor design and are gone in YAML 1.2.
|
|
||||||
|
|
||||||
Installation and usage
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
The import path for the package is *gopkg.in/yaml.v2*.
|
|
||||||
|
|
||||||
To install it, run:
|
|
||||||
|
|
||||||
go get gopkg.in/yaml.v2
|
|
||||||
|
|
||||||
API documentation
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
If opened in a browser, the import path itself leads to the API documentation:
|
|
||||||
|
|
||||||
* [https://gopkg.in/yaml.v2](https://gopkg.in/yaml.v2)
|
|
||||||
|
|
||||||
API stability
|
|
||||||
-------------
|
|
||||||
|
|
||||||
The package API for yaml v2 will remain stable as described in [gopkg.in](https://gopkg.in).
|
|
||||||
|
|
||||||
|
|
||||||
License
|
|
||||||
-------
|
|
||||||
|
|
||||||
The yaml package is licensed under the Apache License 2.0. Please see the LICENSE file for details.
|
|
||||||
|
|
||||||
|
|
||||||
Example
|
|
||||||
-------
|
|
||||||
|
|
||||||
```Go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"gopkg.in/yaml.v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
var data = `
|
|
||||||
a: Easy!
|
|
||||||
b:
|
|
||||||
c: 2
|
|
||||||
d: [3, 4]
|
|
||||||
`
|
|
||||||
|
|
||||||
type T struct {
|
|
||||||
A string
|
|
||||||
B struct {
|
|
||||||
RenamedC int `yaml:"c"`
|
|
||||||
D []int `yaml:",flow"`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
t := T{}
|
|
||||||
|
|
||||||
err := yaml.Unmarshal([]byte(data), &t)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("error: %v", err)
|
|
||||||
}
|
|
||||||
fmt.Printf("--- t:\n%v\n\n", t)
|
|
||||||
|
|
||||||
d, err := yaml.Marshal(&t)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("error: %v", err)
|
|
||||||
}
|
|
||||||
fmt.Printf("--- t dump:\n%s\n\n", string(d))
|
|
||||||
|
|
||||||
m := make(map[interface{}]interface{})
|
|
||||||
|
|
||||||
err = yaml.Unmarshal([]byte(data), &m)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("error: %v", err)
|
|
||||||
}
|
|
||||||
fmt.Printf("--- m:\n%v\n\n", m)
|
|
||||||
|
|
||||||
d, err = yaml.Marshal(&m)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("error: %v", err)
|
|
||||||
}
|
|
||||||
fmt.Printf("--- m dump:\n%s\n\n", string(d))
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
This example will generate the following output:
|
|
||||||
|
|
||||||
```
|
|
||||||
--- t:
|
|
||||||
{Easy! {2 [3 4]}}
|
|
||||||
|
|
||||||
--- t dump:
|
|
||||||
a: Easy!
|
|
||||||
b:
|
|
||||||
c: 2
|
|
||||||
d: [3, 4]
|
|
||||||
|
|
||||||
|
|
||||||
--- m:
|
|
||||||
map[a:Easy! b:map[c:2 d:[3 4]]]
|
|
||||||
|
|
||||||
--- m dump:
|
|
||||||
a: Easy!
|
|
||||||
b:
|
|
||||||
c: 2
|
|
||||||
d:
|
|
||||||
- 3
|
|
||||||
- 4
|
|
||||||
```
|
|
||||||
|
|
742
vendor/github.com/go-yaml/yaml/apic.go
generated
vendored
742
vendor/github.com/go-yaml/yaml/apic.go
generated
vendored
@ -1,742 +0,0 @@
|
|||||||
package yaml
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) {
|
|
||||||
//fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens))
|
|
||||||
|
|
||||||
// Check if we can move the queue at the beginning of the buffer.
|
|
||||||
if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) {
|
|
||||||
if parser.tokens_head != len(parser.tokens) {
|
|
||||||
copy(parser.tokens, parser.tokens[parser.tokens_head:])
|
|
||||||
}
|
|
||||||
parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head]
|
|
||||||
parser.tokens_head = 0
|
|
||||||
}
|
|
||||||
parser.tokens = append(parser.tokens, *token)
|
|
||||||
if pos < 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:])
|
|
||||||
parser.tokens[parser.tokens_head+pos] = *token
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new parser object.
|
|
||||||
func yaml_parser_initialize(parser *yaml_parser_t) bool {
|
|
||||||
*parser = yaml_parser_t{
|
|
||||||
raw_buffer: make([]byte, 0, input_raw_buffer_size),
|
|
||||||
buffer: make([]byte, 0, input_buffer_size),
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Destroy a parser object.
|
|
||||||
func yaml_parser_delete(parser *yaml_parser_t) {
|
|
||||||
*parser = yaml_parser_t{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// String read handler.
|
|
||||||
func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
|
|
||||||
if parser.input_pos == len(parser.input) {
|
|
||||||
return 0, io.EOF
|
|
||||||
}
|
|
||||||
n = copy(buffer, parser.input[parser.input_pos:])
|
|
||||||
parser.input_pos += n
|
|
||||||
return n, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// File read handler.
|
|
||||||
func yaml_file_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
|
|
||||||
return parser.input_file.Read(buffer)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set a string input.
|
|
||||||
func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) {
|
|
||||||
if parser.read_handler != nil {
|
|
||||||
panic("must set the input source only once")
|
|
||||||
}
|
|
||||||
parser.read_handler = yaml_string_read_handler
|
|
||||||
parser.input = input
|
|
||||||
parser.input_pos = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set a file input.
|
|
||||||
func yaml_parser_set_input_file(parser *yaml_parser_t, file *os.File) {
|
|
||||||
if parser.read_handler != nil {
|
|
||||||
panic("must set the input source only once")
|
|
||||||
}
|
|
||||||
parser.read_handler = yaml_file_read_handler
|
|
||||||
parser.input_file = file
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the source encoding.
|
|
||||||
func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) {
|
|
||||||
if parser.encoding != yaml_ANY_ENCODING {
|
|
||||||
panic("must set the encoding only once")
|
|
||||||
}
|
|
||||||
parser.encoding = encoding
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new emitter object.
|
|
||||||
func yaml_emitter_initialize(emitter *yaml_emitter_t) bool {
|
|
||||||
*emitter = yaml_emitter_t{
|
|
||||||
buffer: make([]byte, output_buffer_size),
|
|
||||||
raw_buffer: make([]byte, 0, output_raw_buffer_size),
|
|
||||||
states: make([]yaml_emitter_state_t, 0, initial_stack_size),
|
|
||||||
events: make([]yaml_event_t, 0, initial_queue_size),
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Destroy an emitter object.
|
|
||||||
func yaml_emitter_delete(emitter *yaml_emitter_t) {
|
|
||||||
*emitter = yaml_emitter_t{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// String write handler.
|
|
||||||
func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
|
|
||||||
*emitter.output_buffer = append(*emitter.output_buffer, buffer...)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// File write handler.
|
|
||||||
func yaml_file_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
|
|
||||||
_, err := emitter.output_file.Write(buffer)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set a string output.
|
|
||||||
func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) {
|
|
||||||
if emitter.write_handler != nil {
|
|
||||||
panic("must set the output target only once")
|
|
||||||
}
|
|
||||||
emitter.write_handler = yaml_string_write_handler
|
|
||||||
emitter.output_buffer = output_buffer
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set a file output.
|
|
||||||
func yaml_emitter_set_output_file(emitter *yaml_emitter_t, file io.Writer) {
|
|
||||||
if emitter.write_handler != nil {
|
|
||||||
panic("must set the output target only once")
|
|
||||||
}
|
|
||||||
emitter.write_handler = yaml_file_write_handler
|
|
||||||
emitter.output_file = file
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the output encoding.
|
|
||||||
func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) {
|
|
||||||
if emitter.encoding != yaml_ANY_ENCODING {
|
|
||||||
panic("must set the output encoding only once")
|
|
||||||
}
|
|
||||||
emitter.encoding = encoding
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the canonical output style.
|
|
||||||
func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) {
|
|
||||||
emitter.canonical = canonical
|
|
||||||
}
|
|
||||||
|
|
||||||
//// Set the indentation increment.
|
|
||||||
func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) {
|
|
||||||
if indent < 2 || indent > 9 {
|
|
||||||
indent = 2
|
|
||||||
}
|
|
||||||
emitter.best_indent = indent
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the preferred line width.
|
|
||||||
func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) {
|
|
||||||
if width < 0 {
|
|
||||||
width = -1
|
|
||||||
}
|
|
||||||
emitter.best_width = width
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set if unescaped non-ASCII characters are allowed.
|
|
||||||
func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) {
|
|
||||||
emitter.unicode = unicode
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the preferred line break character.
|
|
||||||
func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) {
|
|
||||||
emitter.line_break = line_break
|
|
||||||
}
|
|
||||||
|
|
||||||
///*
|
|
||||||
// * Destroy a token object.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(void)
|
|
||||||
//yaml_token_delete(yaml_token_t *token)
|
|
||||||
//{
|
|
||||||
// assert(token); // Non-NULL token object expected.
|
|
||||||
//
|
|
||||||
// switch (token.type)
|
|
||||||
// {
|
|
||||||
// case YAML_TAG_DIRECTIVE_TOKEN:
|
|
||||||
// yaml_free(token.data.tag_directive.handle);
|
|
||||||
// yaml_free(token.data.tag_directive.prefix);
|
|
||||||
// break;
|
|
||||||
//
|
|
||||||
// case YAML_ALIAS_TOKEN:
|
|
||||||
// yaml_free(token.data.alias.value);
|
|
||||||
// break;
|
|
||||||
//
|
|
||||||
// case YAML_ANCHOR_TOKEN:
|
|
||||||
// yaml_free(token.data.anchor.value);
|
|
||||||
// break;
|
|
||||||
//
|
|
||||||
// case YAML_TAG_TOKEN:
|
|
||||||
// yaml_free(token.data.tag.handle);
|
|
||||||
// yaml_free(token.data.tag.suffix);
|
|
||||||
// break;
|
|
||||||
//
|
|
||||||
// case YAML_SCALAR_TOKEN:
|
|
||||||
// yaml_free(token.data.scalar.value);
|
|
||||||
// break;
|
|
||||||
//
|
|
||||||
// default:
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// memset(token, 0, sizeof(yaml_token_t));
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///*
|
|
||||||
// * Check if a string is a valid UTF-8 sequence.
|
|
||||||
// *
|
|
||||||
// * Check 'reader.c' for more details on UTF-8 encoding.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//static int
|
|
||||||
//yaml_check_utf8(yaml_char_t *start, size_t length)
|
|
||||||
//{
|
|
||||||
// yaml_char_t *end = start+length;
|
|
||||||
// yaml_char_t *pointer = start;
|
|
||||||
//
|
|
||||||
// while (pointer < end) {
|
|
||||||
// unsigned char octet;
|
|
||||||
// unsigned int width;
|
|
||||||
// unsigned int value;
|
|
||||||
// size_t k;
|
|
||||||
//
|
|
||||||
// octet = pointer[0];
|
|
||||||
// width = (octet & 0x80) == 0x00 ? 1 :
|
|
||||||
// (octet & 0xE0) == 0xC0 ? 2 :
|
|
||||||
// (octet & 0xF0) == 0xE0 ? 3 :
|
|
||||||
// (octet & 0xF8) == 0xF0 ? 4 : 0;
|
|
||||||
// value = (octet & 0x80) == 0x00 ? octet & 0x7F :
|
|
||||||
// (octet & 0xE0) == 0xC0 ? octet & 0x1F :
|
|
||||||
// (octet & 0xF0) == 0xE0 ? octet & 0x0F :
|
|
||||||
// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
|
|
||||||
// if (!width) return 0;
|
|
||||||
// if (pointer+width > end) return 0;
|
|
||||||
// for (k = 1; k < width; k ++) {
|
|
||||||
// octet = pointer[k];
|
|
||||||
// if ((octet & 0xC0) != 0x80) return 0;
|
|
||||||
// value = (value << 6) + (octet & 0x3F);
|
|
||||||
// }
|
|
||||||
// if (!((width == 1) ||
|
|
||||||
// (width == 2 && value >= 0x80) ||
|
|
||||||
// (width == 3 && value >= 0x800) ||
|
|
||||||
// (width == 4 && value >= 0x10000))) return 0;
|
|
||||||
//
|
|
||||||
// pointer += width;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return 1;
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
|
|
||||||
// Create STREAM-START.
|
|
||||||
func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) bool {
|
|
||||||
*event = yaml_event_t{
|
|
||||||
typ: yaml_STREAM_START_EVENT,
|
|
||||||
encoding: encoding,
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create STREAM-END.
|
|
||||||
func yaml_stream_end_event_initialize(event *yaml_event_t) bool {
|
|
||||||
*event = yaml_event_t{
|
|
||||||
typ: yaml_STREAM_END_EVENT,
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create DOCUMENT-START.
|
|
||||||
func yaml_document_start_event_initialize(event *yaml_event_t, version_directive *yaml_version_directive_t,
|
|
||||||
tag_directives []yaml_tag_directive_t, implicit bool) bool {
|
|
||||||
*event = yaml_event_t{
|
|
||||||
typ: yaml_DOCUMENT_START_EVENT,
|
|
||||||
version_directive: version_directive,
|
|
||||||
tag_directives: tag_directives,
|
|
||||||
implicit: implicit,
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create DOCUMENT-END.
|
|
||||||
func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) bool {
|
|
||||||
*event = yaml_event_t{
|
|
||||||
typ: yaml_DOCUMENT_END_EVENT,
|
|
||||||
implicit: implicit,
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
///*
|
|
||||||
// * Create ALIAS.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(int)
|
|
||||||
//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t)
|
|
||||||
//{
|
|
||||||
// mark yaml_mark_t = { 0, 0, 0 }
|
|
||||||
// anchor_copy *yaml_char_t = NULL
|
|
||||||
//
|
|
||||||
// assert(event) // Non-NULL event object is expected.
|
|
||||||
// assert(anchor) // Non-NULL anchor is expected.
|
|
||||||
//
|
|
||||||
// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0
|
|
||||||
//
|
|
||||||
// anchor_copy = yaml_strdup(anchor)
|
|
||||||
// if (!anchor_copy)
|
|
||||||
// return 0
|
|
||||||
//
|
|
||||||
// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark)
|
|
||||||
//
|
|
||||||
// return 1
|
|
||||||
//}
|
|
||||||
|
|
||||||
// Create SCALAR.
|
|
||||||
func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool {
|
|
||||||
*event = yaml_event_t{
|
|
||||||
typ: yaml_SCALAR_EVENT,
|
|
||||||
anchor: anchor,
|
|
||||||
tag: tag,
|
|
||||||
value: value,
|
|
||||||
implicit: plain_implicit,
|
|
||||||
quoted_implicit: quoted_implicit,
|
|
||||||
style: yaml_style_t(style),
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create SEQUENCE-START.
|
|
||||||
func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool {
|
|
||||||
*event = yaml_event_t{
|
|
||||||
typ: yaml_SEQUENCE_START_EVENT,
|
|
||||||
anchor: anchor,
|
|
||||||
tag: tag,
|
|
||||||
implicit: implicit,
|
|
||||||
style: yaml_style_t(style),
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create SEQUENCE-END.
|
|
||||||
func yaml_sequence_end_event_initialize(event *yaml_event_t) bool {
|
|
||||||
*event = yaml_event_t{
|
|
||||||
typ: yaml_SEQUENCE_END_EVENT,
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create MAPPING-START.
|
|
||||||
func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) bool {
|
|
||||||
*event = yaml_event_t{
|
|
||||||
typ: yaml_MAPPING_START_EVENT,
|
|
||||||
anchor: anchor,
|
|
||||||
tag: tag,
|
|
||||||
implicit: implicit,
|
|
||||||
style: yaml_style_t(style),
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create MAPPING-END.
|
|
||||||
func yaml_mapping_end_event_initialize(event *yaml_event_t) bool {
|
|
||||||
*event = yaml_event_t{
|
|
||||||
typ: yaml_MAPPING_END_EVENT,
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Destroy an event object.
|
|
||||||
func yaml_event_delete(event *yaml_event_t) {
|
|
||||||
*event = yaml_event_t{}
|
|
||||||
}
|
|
||||||
|
|
||||||
///*
|
|
||||||
// * Create a document object.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(int)
|
|
||||||
//yaml_document_initialize(document *yaml_document_t,
|
|
||||||
// version_directive *yaml_version_directive_t,
|
|
||||||
// tag_directives_start *yaml_tag_directive_t,
|
|
||||||
// tag_directives_end *yaml_tag_directive_t,
|
|
||||||
// start_implicit int, end_implicit int)
|
|
||||||
//{
|
|
||||||
// struct {
|
|
||||||
// error yaml_error_type_t
|
|
||||||
// } context
|
|
||||||
// struct {
|
|
||||||
// start *yaml_node_t
|
|
||||||
// end *yaml_node_t
|
|
||||||
// top *yaml_node_t
|
|
||||||
// } nodes = { NULL, NULL, NULL }
|
|
||||||
// version_directive_copy *yaml_version_directive_t = NULL
|
|
||||||
// struct {
|
|
||||||
// start *yaml_tag_directive_t
|
|
||||||
// end *yaml_tag_directive_t
|
|
||||||
// top *yaml_tag_directive_t
|
|
||||||
// } tag_directives_copy = { NULL, NULL, NULL }
|
|
||||||
// value yaml_tag_directive_t = { NULL, NULL }
|
|
||||||
// mark yaml_mark_t = { 0, 0, 0 }
|
|
||||||
//
|
|
||||||
// assert(document) // Non-NULL document object is expected.
|
|
||||||
// assert((tag_directives_start && tag_directives_end) ||
|
|
||||||
// (tag_directives_start == tag_directives_end))
|
|
||||||
// // Valid tag directives are expected.
|
|
||||||
//
|
|
||||||
// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error
|
|
||||||
//
|
|
||||||
// if (version_directive) {
|
|
||||||
// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t))
|
|
||||||
// if (!version_directive_copy) goto error
|
|
||||||
// version_directive_copy.major = version_directive.major
|
|
||||||
// version_directive_copy.minor = version_directive.minor
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (tag_directives_start != tag_directives_end) {
|
|
||||||
// tag_directive *yaml_tag_directive_t
|
|
||||||
// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE))
|
|
||||||
// goto error
|
|
||||||
// for (tag_directive = tag_directives_start
|
|
||||||
// tag_directive != tag_directives_end; tag_directive ++) {
|
|
||||||
// assert(tag_directive.handle)
|
|
||||||
// assert(tag_directive.prefix)
|
|
||||||
// if (!yaml_check_utf8(tag_directive.handle,
|
|
||||||
// strlen((char *)tag_directive.handle)))
|
|
||||||
// goto error
|
|
||||||
// if (!yaml_check_utf8(tag_directive.prefix,
|
|
||||||
// strlen((char *)tag_directive.prefix)))
|
|
||||||
// goto error
|
|
||||||
// value.handle = yaml_strdup(tag_directive.handle)
|
|
||||||
// value.prefix = yaml_strdup(tag_directive.prefix)
|
|
||||||
// if (!value.handle || !value.prefix) goto error
|
|
||||||
// if (!PUSH(&context, tag_directives_copy, value))
|
|
||||||
// goto error
|
|
||||||
// value.handle = NULL
|
|
||||||
// value.prefix = NULL
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy,
|
|
||||||
// tag_directives_copy.start, tag_directives_copy.top,
|
|
||||||
// start_implicit, end_implicit, mark, mark)
|
|
||||||
//
|
|
||||||
// return 1
|
|
||||||
//
|
|
||||||
//error:
|
|
||||||
// STACK_DEL(&context, nodes)
|
|
||||||
// yaml_free(version_directive_copy)
|
|
||||||
// while (!STACK_EMPTY(&context, tag_directives_copy)) {
|
|
||||||
// value yaml_tag_directive_t = POP(&context, tag_directives_copy)
|
|
||||||
// yaml_free(value.handle)
|
|
||||||
// yaml_free(value.prefix)
|
|
||||||
// }
|
|
||||||
// STACK_DEL(&context, tag_directives_copy)
|
|
||||||
// yaml_free(value.handle)
|
|
||||||
// yaml_free(value.prefix)
|
|
||||||
//
|
|
||||||
// return 0
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///*
|
|
||||||
// * Destroy a document object.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(void)
|
|
||||||
//yaml_document_delete(document *yaml_document_t)
|
|
||||||
//{
|
|
||||||
// struct {
|
|
||||||
// error yaml_error_type_t
|
|
||||||
// } context
|
|
||||||
// tag_directive *yaml_tag_directive_t
|
|
||||||
//
|
|
||||||
// context.error = YAML_NO_ERROR // Eliminate a compliler warning.
|
|
||||||
//
|
|
||||||
// assert(document) // Non-NULL document object is expected.
|
|
||||||
//
|
|
||||||
// while (!STACK_EMPTY(&context, document.nodes)) {
|
|
||||||
// node yaml_node_t = POP(&context, document.nodes)
|
|
||||||
// yaml_free(node.tag)
|
|
||||||
// switch (node.type) {
|
|
||||||
// case YAML_SCALAR_NODE:
|
|
||||||
// yaml_free(node.data.scalar.value)
|
|
||||||
// break
|
|
||||||
// case YAML_SEQUENCE_NODE:
|
|
||||||
// STACK_DEL(&context, node.data.sequence.items)
|
|
||||||
// break
|
|
||||||
// case YAML_MAPPING_NODE:
|
|
||||||
// STACK_DEL(&context, node.data.mapping.pairs)
|
|
||||||
// break
|
|
||||||
// default:
|
|
||||||
// assert(0) // Should not happen.
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// STACK_DEL(&context, document.nodes)
|
|
||||||
//
|
|
||||||
// yaml_free(document.version_directive)
|
|
||||||
// for (tag_directive = document.tag_directives.start
|
|
||||||
// tag_directive != document.tag_directives.end
|
|
||||||
// tag_directive++) {
|
|
||||||
// yaml_free(tag_directive.handle)
|
|
||||||
// yaml_free(tag_directive.prefix)
|
|
||||||
// }
|
|
||||||
// yaml_free(document.tag_directives.start)
|
|
||||||
//
|
|
||||||
// memset(document, 0, sizeof(yaml_document_t))
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * Get a document node.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(yaml_node_t *)
|
|
||||||
//yaml_document_get_node(document *yaml_document_t, index int)
|
|
||||||
//{
|
|
||||||
// assert(document) // Non-NULL document object is expected.
|
|
||||||
//
|
|
||||||
// if (index > 0 && document.nodes.start + index <= document.nodes.top) {
|
|
||||||
// return document.nodes.start + index - 1
|
|
||||||
// }
|
|
||||||
// return NULL
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * Get the root object.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(yaml_node_t *)
|
|
||||||
//yaml_document_get_root_node(document *yaml_document_t)
|
|
||||||
//{
|
|
||||||
// assert(document) // Non-NULL document object is expected.
|
|
||||||
//
|
|
||||||
// if (document.nodes.top != document.nodes.start) {
|
|
||||||
// return document.nodes.start
|
|
||||||
// }
|
|
||||||
// return NULL
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///*
|
|
||||||
// * Add a scalar node to a document.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(int)
|
|
||||||
//yaml_document_add_scalar(document *yaml_document_t,
|
|
||||||
// tag *yaml_char_t, value *yaml_char_t, length int,
|
|
||||||
// style yaml_scalar_style_t)
|
|
||||||
//{
|
|
||||||
// struct {
|
|
||||||
// error yaml_error_type_t
|
|
||||||
// } context
|
|
||||||
// mark yaml_mark_t = { 0, 0, 0 }
|
|
||||||
// tag_copy *yaml_char_t = NULL
|
|
||||||
// value_copy *yaml_char_t = NULL
|
|
||||||
// node yaml_node_t
|
|
||||||
//
|
|
||||||
// assert(document) // Non-NULL document object is expected.
|
|
||||||
// assert(value) // Non-NULL value is expected.
|
|
||||||
//
|
|
||||||
// if (!tag) {
|
|
||||||
// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
|
|
||||||
// tag_copy = yaml_strdup(tag)
|
|
||||||
// if (!tag_copy) goto error
|
|
||||||
//
|
|
||||||
// if (length < 0) {
|
|
||||||
// length = strlen((char *)value)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (!yaml_check_utf8(value, length)) goto error
|
|
||||||
// value_copy = yaml_malloc(length+1)
|
|
||||||
// if (!value_copy) goto error
|
|
||||||
// memcpy(value_copy, value, length)
|
|
||||||
// value_copy[length] = '\0'
|
|
||||||
//
|
|
||||||
// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark)
|
|
||||||
// if (!PUSH(&context, document.nodes, node)) goto error
|
|
||||||
//
|
|
||||||
// return document.nodes.top - document.nodes.start
|
|
||||||
//
|
|
||||||
//error:
|
|
||||||
// yaml_free(tag_copy)
|
|
||||||
// yaml_free(value_copy)
|
|
||||||
//
|
|
||||||
// return 0
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///*
|
|
||||||
// * Add a sequence node to a document.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(int)
|
|
||||||
//yaml_document_add_sequence(document *yaml_document_t,
|
|
||||||
// tag *yaml_char_t, style yaml_sequence_style_t)
|
|
||||||
//{
|
|
||||||
// struct {
|
|
||||||
// error yaml_error_type_t
|
|
||||||
// } context
|
|
||||||
// mark yaml_mark_t = { 0, 0, 0 }
|
|
||||||
// tag_copy *yaml_char_t = NULL
|
|
||||||
// struct {
|
|
||||||
// start *yaml_node_item_t
|
|
||||||
// end *yaml_node_item_t
|
|
||||||
// top *yaml_node_item_t
|
|
||||||
// } items = { NULL, NULL, NULL }
|
|
||||||
// node yaml_node_t
|
|
||||||
//
|
|
||||||
// assert(document) // Non-NULL document object is expected.
|
|
||||||
//
|
|
||||||
// if (!tag) {
|
|
||||||
// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
|
|
||||||
// tag_copy = yaml_strdup(tag)
|
|
||||||
// if (!tag_copy) goto error
|
|
||||||
//
|
|
||||||
// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error
|
|
||||||
//
|
|
||||||
// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end,
|
|
||||||
// style, mark, mark)
|
|
||||||
// if (!PUSH(&context, document.nodes, node)) goto error
|
|
||||||
//
|
|
||||||
// return document.nodes.top - document.nodes.start
|
|
||||||
//
|
|
||||||
//error:
|
|
||||||
// STACK_DEL(&context, items)
|
|
||||||
// yaml_free(tag_copy)
|
|
||||||
//
|
|
||||||
// return 0
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///*
|
|
||||||
// * Add a mapping node to a document.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(int)
|
|
||||||
//yaml_document_add_mapping(document *yaml_document_t,
|
|
||||||
// tag *yaml_char_t, style yaml_mapping_style_t)
|
|
||||||
//{
|
|
||||||
// struct {
|
|
||||||
// error yaml_error_type_t
|
|
||||||
// } context
|
|
||||||
// mark yaml_mark_t = { 0, 0, 0 }
|
|
||||||
// tag_copy *yaml_char_t = NULL
|
|
||||||
// struct {
|
|
||||||
// start *yaml_node_pair_t
|
|
||||||
// end *yaml_node_pair_t
|
|
||||||
// top *yaml_node_pair_t
|
|
||||||
// } pairs = { NULL, NULL, NULL }
|
|
||||||
// node yaml_node_t
|
|
||||||
//
|
|
||||||
// assert(document) // Non-NULL document object is expected.
|
|
||||||
//
|
|
||||||
// if (!tag) {
|
|
||||||
// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
|
|
||||||
// tag_copy = yaml_strdup(tag)
|
|
||||||
// if (!tag_copy) goto error
|
|
||||||
//
|
|
||||||
// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error
|
|
||||||
//
|
|
||||||
// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end,
|
|
||||||
// style, mark, mark)
|
|
||||||
// if (!PUSH(&context, document.nodes, node)) goto error
|
|
||||||
//
|
|
||||||
// return document.nodes.top - document.nodes.start
|
|
||||||
//
|
|
||||||
//error:
|
|
||||||
// STACK_DEL(&context, pairs)
|
|
||||||
// yaml_free(tag_copy)
|
|
||||||
//
|
|
||||||
// return 0
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///*
|
|
||||||
// * Append an item to a sequence node.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(int)
|
|
||||||
//yaml_document_append_sequence_item(document *yaml_document_t,
|
|
||||||
// sequence int, item int)
|
|
||||||
//{
|
|
||||||
// struct {
|
|
||||||
// error yaml_error_type_t
|
|
||||||
// } context
|
|
||||||
//
|
|
||||||
// assert(document) // Non-NULL document is required.
|
|
||||||
// assert(sequence > 0
|
|
||||||
// && document.nodes.start + sequence <= document.nodes.top)
|
|
||||||
// // Valid sequence id is required.
|
|
||||||
// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE)
|
|
||||||
// // A sequence node is required.
|
|
||||||
// assert(item > 0 && document.nodes.start + item <= document.nodes.top)
|
|
||||||
// // Valid item id is required.
|
|
||||||
//
|
|
||||||
// if (!PUSH(&context,
|
|
||||||
// document.nodes.start[sequence-1].data.sequence.items, item))
|
|
||||||
// return 0
|
|
||||||
//
|
|
||||||
// return 1
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///*
|
|
||||||
// * Append a pair of a key and a value to a mapping node.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
//YAML_DECLARE(int)
|
|
||||||
//yaml_document_append_mapping_pair(document *yaml_document_t,
|
|
||||||
// mapping int, key int, value int)
|
|
||||||
//{
|
|
||||||
// struct {
|
|
||||||
// error yaml_error_type_t
|
|
||||||
// } context
|
|
||||||
//
|
|
||||||
// pair yaml_node_pair_t
|
|
||||||
//
|
|
||||||
// assert(document) // Non-NULL document is required.
|
|
||||||
// assert(mapping > 0
|
|
||||||
// && document.nodes.start + mapping <= document.nodes.top)
|
|
||||||
// // Valid mapping id is required.
|
|
||||||
// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE)
|
|
||||||
// // A mapping node is required.
|
|
||||||
// assert(key > 0 && document.nodes.start + key <= document.nodes.top)
|
|
||||||
// // Valid key id is required.
|
|
||||||
// assert(value > 0 && document.nodes.start + value <= document.nodes.top)
|
|
||||||
// // Valid value id is required.
|
|
||||||
//
|
|
||||||
// pair.key = key
|
|
||||||
// pair.value = value
|
|
||||||
//
|
|
||||||
// if (!PUSH(&context,
|
|
||||||
// document.nodes.start[mapping-1].data.mapping.pairs, pair))
|
|
||||||
// return 0
|
|
||||||
//
|
|
||||||
// return 1
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//
|
|
682
vendor/github.com/go-yaml/yaml/decode.go
generated
vendored
682
vendor/github.com/go-yaml/yaml/decode.go
generated
vendored
@ -1,682 +0,0 @@
|
|||||||
package yaml
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding"
|
|
||||||
"encoding/base64"
|
|
||||||
"fmt"
|
|
||||||
"math"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
documentNode = 1 << iota
|
|
||||||
mappingNode
|
|
||||||
sequenceNode
|
|
||||||
scalarNode
|
|
||||||
aliasNode
|
|
||||||
)
|
|
||||||
|
|
||||||
type node struct {
|
|
||||||
kind int
|
|
||||||
line, column int
|
|
||||||
tag string
|
|
||||||
value string
|
|
||||||
implicit bool
|
|
||||||
children []*node
|
|
||||||
anchors map[string]*node
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// Parser, produces a node tree out of a libyaml event stream.
|
|
||||||
|
|
||||||
type parser struct {
|
|
||||||
parser yaml_parser_t
|
|
||||||
event yaml_event_t
|
|
||||||
doc *node
|
|
||||||
}
|
|
||||||
|
|
||||||
func newParser(b []byte) *parser {
|
|
||||||
p := parser{}
|
|
||||||
if !yaml_parser_initialize(&p.parser) {
|
|
||||||
panic("failed to initialize YAML emitter")
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(b) == 0 {
|
|
||||||
b = []byte{'\n'}
|
|
||||||
}
|
|
||||||
|
|
||||||
yaml_parser_set_input_string(&p.parser, b)
|
|
||||||
|
|
||||||
p.skip()
|
|
||||||
if p.event.typ != yaml_STREAM_START_EVENT {
|
|
||||||
panic("expected stream start event, got " + strconv.Itoa(int(p.event.typ)))
|
|
||||||
}
|
|
||||||
p.skip()
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) destroy() {
|
|
||||||
if p.event.typ != yaml_NO_EVENT {
|
|
||||||
yaml_event_delete(&p.event)
|
|
||||||
}
|
|
||||||
yaml_parser_delete(&p.parser)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) skip() {
|
|
||||||
if p.event.typ != yaml_NO_EVENT {
|
|
||||||
if p.event.typ == yaml_STREAM_END_EVENT {
|
|
||||||
failf("attempted to go past the end of stream; corrupted value?")
|
|
||||||
}
|
|
||||||
yaml_event_delete(&p.event)
|
|
||||||
}
|
|
||||||
if !yaml_parser_parse(&p.parser, &p.event) {
|
|
||||||
p.fail()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) fail() {
|
|
||||||
var where string
|
|
||||||
var line int
|
|
||||||
if p.parser.problem_mark.line != 0 {
|
|
||||||
line = p.parser.problem_mark.line
|
|
||||||
} else if p.parser.context_mark.line != 0 {
|
|
||||||
line = p.parser.context_mark.line
|
|
||||||
}
|
|
||||||
if line != 0 {
|
|
||||||
where = "line " + strconv.Itoa(line) + ": "
|
|
||||||
}
|
|
||||||
var msg string
|
|
||||||
if len(p.parser.problem) > 0 {
|
|
||||||
msg = p.parser.problem
|
|
||||||
} else {
|
|
||||||
msg = "unknown problem parsing YAML content"
|
|
||||||
}
|
|
||||||
failf("%s%s", where, msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) anchor(n *node, anchor []byte) {
|
|
||||||
if anchor != nil {
|
|
||||||
p.doc.anchors[string(anchor)] = n
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) parse() *node {
|
|
||||||
switch p.event.typ {
|
|
||||||
case yaml_SCALAR_EVENT:
|
|
||||||
return p.scalar()
|
|
||||||
case yaml_ALIAS_EVENT:
|
|
||||||
return p.alias()
|
|
||||||
case yaml_MAPPING_START_EVENT:
|
|
||||||
return p.mapping()
|
|
||||||
case yaml_SEQUENCE_START_EVENT:
|
|
||||||
return p.sequence()
|
|
||||||
case yaml_DOCUMENT_START_EVENT:
|
|
||||||
return p.document()
|
|
||||||
case yaml_STREAM_END_EVENT:
|
|
||||||
// Happens when attempting to decode an empty buffer.
|
|
||||||
return nil
|
|
||||||
default:
|
|
||||||
panic("attempted to parse unknown event: " + strconv.Itoa(int(p.event.typ)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) node(kind int) *node {
|
|
||||||
return &node{
|
|
||||||
kind: kind,
|
|
||||||
line: p.event.start_mark.line,
|
|
||||||
column: p.event.start_mark.column,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) document() *node {
|
|
||||||
n := p.node(documentNode)
|
|
||||||
n.anchors = make(map[string]*node)
|
|
||||||
p.doc = n
|
|
||||||
p.skip()
|
|
||||||
n.children = append(n.children, p.parse())
|
|
||||||
if p.event.typ != yaml_DOCUMENT_END_EVENT {
|
|
||||||
panic("expected end of document event but got " + strconv.Itoa(int(p.event.typ)))
|
|
||||||
}
|
|
||||||
p.skip()
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) alias() *node {
|
|
||||||
n := p.node(aliasNode)
|
|
||||||
n.value = string(p.event.anchor)
|
|
||||||
p.skip()
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) scalar() *node {
|
|
||||||
n := p.node(scalarNode)
|
|
||||||
n.value = string(p.event.value)
|
|
||||||
n.tag = string(p.event.tag)
|
|
||||||
n.implicit = p.event.implicit
|
|
||||||
p.anchor(n, p.event.anchor)
|
|
||||||
p.skip()
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) sequence() *node {
|
|
||||||
n := p.node(sequenceNode)
|
|
||||||
p.anchor(n, p.event.anchor)
|
|
||||||
p.skip()
|
|
||||||
for p.event.typ != yaml_SEQUENCE_END_EVENT {
|
|
||||||
n.children = append(n.children, p.parse())
|
|
||||||
}
|
|
||||||
p.skip()
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *parser) mapping() *node {
|
|
||||||
n := p.node(mappingNode)
|
|
||||||
p.anchor(n, p.event.anchor)
|
|
||||||
p.skip()
|
|
||||||
for p.event.typ != yaml_MAPPING_END_EVENT {
|
|
||||||
n.children = append(n.children, p.parse(), p.parse())
|
|
||||||
}
|
|
||||||
p.skip()
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// Decoder, unmarshals a node into a provided value.
|
|
||||||
|
|
||||||
type decoder struct {
|
|
||||||
doc *node
|
|
||||||
aliases map[string]bool
|
|
||||||
mapType reflect.Type
|
|
||||||
terrors []string
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
mapItemType = reflect.TypeOf(MapItem{})
|
|
||||||
durationType = reflect.TypeOf(time.Duration(0))
|
|
||||||
defaultMapType = reflect.TypeOf(map[interface{}]interface{}{})
|
|
||||||
ifaceType = defaultMapType.Elem()
|
|
||||||
)
|
|
||||||
|
|
||||||
func newDecoder() *decoder {
|
|
||||||
d := &decoder{mapType: defaultMapType}
|
|
||||||
d.aliases = make(map[string]bool)
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) terror(n *node, tag string, out reflect.Value) {
|
|
||||||
if n.tag != "" {
|
|
||||||
tag = n.tag
|
|
||||||
}
|
|
||||||
value := n.value
|
|
||||||
if tag != yaml_SEQ_TAG && tag != yaml_MAP_TAG {
|
|
||||||
if len(value) > 10 {
|
|
||||||
value = " `" + value[:7] + "...`"
|
|
||||||
} else {
|
|
||||||
value = " `" + value + "`"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.line+1, shortTag(tag), value, out.Type()))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) {
|
|
||||||
terrlen := len(d.terrors)
|
|
||||||
err := u.UnmarshalYAML(func(v interface{}) (err error) {
|
|
||||||
defer handleErr(&err)
|
|
||||||
d.unmarshal(n, reflect.ValueOf(v))
|
|
||||||
if len(d.terrors) > terrlen {
|
|
||||||
issues := d.terrors[terrlen:]
|
|
||||||
d.terrors = d.terrors[:terrlen]
|
|
||||||
return &TypeError{issues}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if e, ok := err.(*TypeError); ok {
|
|
||||||
d.terrors = append(d.terrors, e.Errors...)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
fail(err)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// d.prepare initializes and dereferences pointers and calls UnmarshalYAML
|
|
||||||
// if a value is found to implement it.
|
|
||||||
// It returns the initialized and dereferenced out value, whether
|
|
||||||
// unmarshalling was already done by UnmarshalYAML, and if so whether
|
|
||||||
// its types unmarshalled appropriately.
|
|
||||||
//
|
|
||||||
// If n holds a null value, prepare returns before doing anything.
|
|
||||||
func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) {
|
|
||||||
if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "" && n.implicit) {
|
|
||||||
return out, false, false
|
|
||||||
}
|
|
||||||
again := true
|
|
||||||
for again {
|
|
||||||
again = false
|
|
||||||
if out.Kind() == reflect.Ptr {
|
|
||||||
if out.IsNil() {
|
|
||||||
out.Set(reflect.New(out.Type().Elem()))
|
|
||||||
}
|
|
||||||
out = out.Elem()
|
|
||||||
again = true
|
|
||||||
}
|
|
||||||
if out.CanAddr() {
|
|
||||||
if u, ok := out.Addr().Interface().(Unmarshaler); ok {
|
|
||||||
good = d.callUnmarshaler(n, u)
|
|
||||||
return out, true, good
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out, false, false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) {
|
|
||||||
switch n.kind {
|
|
||||||
case documentNode:
|
|
||||||
return d.document(n, out)
|
|
||||||
case aliasNode:
|
|
||||||
return d.alias(n, out)
|
|
||||||
}
|
|
||||||
out, unmarshaled, good := d.prepare(n, out)
|
|
||||||
if unmarshaled {
|
|
||||||
return good
|
|
||||||
}
|
|
||||||
switch n.kind {
|
|
||||||
case scalarNode:
|
|
||||||
good = d.scalar(n, out)
|
|
||||||
case mappingNode:
|
|
||||||
good = d.mapping(n, out)
|
|
||||||
case sequenceNode:
|
|
||||||
good = d.sequence(n, out)
|
|
||||||
default:
|
|
||||||
panic("internal error: unknown node kind: " + strconv.Itoa(n.kind))
|
|
||||||
}
|
|
||||||
return good
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) document(n *node, out reflect.Value) (good bool) {
|
|
||||||
if len(n.children) == 1 {
|
|
||||||
d.doc = n
|
|
||||||
d.unmarshal(n.children[0], out)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) alias(n *node, out reflect.Value) (good bool) {
|
|
||||||
an, ok := d.doc.anchors[n.value]
|
|
||||||
if !ok {
|
|
||||||
failf("unknown anchor '%s' referenced", n.value)
|
|
||||||
}
|
|
||||||
if d.aliases[n.value] {
|
|
||||||
failf("anchor '%s' value contains itself", n.value)
|
|
||||||
}
|
|
||||||
d.aliases[n.value] = true
|
|
||||||
good = d.unmarshal(an, out)
|
|
||||||
delete(d.aliases, n.value)
|
|
||||||
return good
|
|
||||||
}
|
|
||||||
|
|
||||||
var zeroValue reflect.Value
|
|
||||||
|
|
||||||
func resetMap(out reflect.Value) {
|
|
||||||
for _, k := range out.MapKeys() {
|
|
||||||
out.SetMapIndex(k, zeroValue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) scalar(n *node, out reflect.Value) (good bool) {
|
|
||||||
var tag string
|
|
||||||
var resolved interface{}
|
|
||||||
if n.tag == "" && !n.implicit {
|
|
||||||
tag = yaml_STR_TAG
|
|
||||||
resolved = n.value
|
|
||||||
} else {
|
|
||||||
tag, resolved = resolve(n.tag, n.value)
|
|
||||||
if tag == yaml_BINARY_TAG {
|
|
||||||
data, err := base64.StdEncoding.DecodeString(resolved.(string))
|
|
||||||
if err != nil {
|
|
||||||
failf("!!binary value contains invalid base64 data")
|
|
||||||
}
|
|
||||||
resolved = string(data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if resolved == nil {
|
|
||||||
if out.Kind() == reflect.Map && !out.CanAddr() {
|
|
||||||
resetMap(out)
|
|
||||||
} else {
|
|
||||||
out.Set(reflect.Zero(out.Type()))
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if s, ok := resolved.(string); ok && out.CanAddr() {
|
|
||||||
if u, ok := out.Addr().Interface().(encoding.TextUnmarshaler); ok {
|
|
||||||
err := u.UnmarshalText([]byte(s))
|
|
||||||
if err != nil {
|
|
||||||
fail(err)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch out.Kind() {
|
|
||||||
case reflect.String:
|
|
||||||
if tag == yaml_BINARY_TAG {
|
|
||||||
out.SetString(resolved.(string))
|
|
||||||
good = true
|
|
||||||
} else if resolved != nil {
|
|
||||||
out.SetString(n.value)
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
case reflect.Interface:
|
|
||||||
if resolved == nil {
|
|
||||||
out.Set(reflect.Zero(out.Type()))
|
|
||||||
} else {
|
|
||||||
out.Set(reflect.ValueOf(resolved))
|
|
||||||
}
|
|
||||||
good = true
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
switch resolved := resolved.(type) {
|
|
||||||
case int:
|
|
||||||
if !out.OverflowInt(int64(resolved)) {
|
|
||||||
out.SetInt(int64(resolved))
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
case int64:
|
|
||||||
if !out.OverflowInt(resolved) {
|
|
||||||
out.SetInt(resolved)
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
case uint64:
|
|
||||||
if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
|
|
||||||
out.SetInt(int64(resolved))
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
case float64:
|
|
||||||
if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
|
|
||||||
out.SetInt(int64(resolved))
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
case string:
|
|
||||||
if out.Type() == durationType {
|
|
||||||
d, err := time.ParseDuration(resolved)
|
|
||||||
if err == nil {
|
|
||||||
out.SetInt(int64(d))
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
||||||
switch resolved := resolved.(type) {
|
|
||||||
case int:
|
|
||||||
if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
|
|
||||||
out.SetUint(uint64(resolved))
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
case int64:
|
|
||||||
if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
|
|
||||||
out.SetUint(uint64(resolved))
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
case uint64:
|
|
||||||
if !out.OverflowUint(uint64(resolved)) {
|
|
||||||
out.SetUint(uint64(resolved))
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
case float64:
|
|
||||||
if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) {
|
|
||||||
out.SetUint(uint64(resolved))
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case reflect.Bool:
|
|
||||||
switch resolved := resolved.(type) {
|
|
||||||
case bool:
|
|
||||||
out.SetBool(resolved)
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
switch resolved := resolved.(type) {
|
|
||||||
case int:
|
|
||||||
out.SetFloat(float64(resolved))
|
|
||||||
good = true
|
|
||||||
case int64:
|
|
||||||
out.SetFloat(float64(resolved))
|
|
||||||
good = true
|
|
||||||
case uint64:
|
|
||||||
out.SetFloat(float64(resolved))
|
|
||||||
good = true
|
|
||||||
case float64:
|
|
||||||
out.SetFloat(resolved)
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
case reflect.Ptr:
|
|
||||||
if out.Type().Elem() == reflect.TypeOf(resolved) {
|
|
||||||
// TODO DOes this make sense? When is out a Ptr except when decoding a nil value?
|
|
||||||
elem := reflect.New(out.Type().Elem())
|
|
||||||
elem.Elem().Set(reflect.ValueOf(resolved))
|
|
||||||
out.Set(elem)
|
|
||||||
good = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !good {
|
|
||||||
d.terror(n, tag, out)
|
|
||||||
}
|
|
||||||
return good
|
|
||||||
}
|
|
||||||
|
|
||||||
func settableValueOf(i interface{}) reflect.Value {
|
|
||||||
v := reflect.ValueOf(i)
|
|
||||||
sv := reflect.New(v.Type()).Elem()
|
|
||||||
sv.Set(v)
|
|
||||||
return sv
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) sequence(n *node, out reflect.Value) (good bool) {
|
|
||||||
l := len(n.children)
|
|
||||||
|
|
||||||
var iface reflect.Value
|
|
||||||
switch out.Kind() {
|
|
||||||
case reflect.Slice:
|
|
||||||
out.Set(reflect.MakeSlice(out.Type(), l, l))
|
|
||||||
case reflect.Interface:
|
|
||||||
// No type hints. Will have to use a generic sequence.
|
|
||||||
iface = out
|
|
||||||
out = settableValueOf(make([]interface{}, l))
|
|
||||||
default:
|
|
||||||
d.terror(n, yaml_SEQ_TAG, out)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
et := out.Type().Elem()
|
|
||||||
|
|
||||||
j := 0
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
e := reflect.New(et).Elem()
|
|
||||||
if ok := d.unmarshal(n.children[i], e); ok {
|
|
||||||
out.Index(j).Set(e)
|
|
||||||
j++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out.Set(out.Slice(0, j))
|
|
||||||
if iface.IsValid() {
|
|
||||||
iface.Set(out)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) mapping(n *node, out reflect.Value) (good bool) {
|
|
||||||
switch out.Kind() {
|
|
||||||
case reflect.Struct:
|
|
||||||
return d.mappingStruct(n, out)
|
|
||||||
case reflect.Slice:
|
|
||||||
return d.mappingSlice(n, out)
|
|
||||||
case reflect.Map:
|
|
||||||
// okay
|
|
||||||
case reflect.Interface:
|
|
||||||
if d.mapType.Kind() == reflect.Map {
|
|
||||||
iface := out
|
|
||||||
out = reflect.MakeMap(d.mapType)
|
|
||||||
iface.Set(out)
|
|
||||||
} else {
|
|
||||||
slicev := reflect.New(d.mapType).Elem()
|
|
||||||
if !d.mappingSlice(n, slicev) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
out.Set(slicev)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
d.terror(n, yaml_MAP_TAG, out)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
outt := out.Type()
|
|
||||||
kt := outt.Key()
|
|
||||||
et := outt.Elem()
|
|
||||||
|
|
||||||
mapType := d.mapType
|
|
||||||
if outt.Key() == ifaceType && outt.Elem() == ifaceType {
|
|
||||||
d.mapType = outt
|
|
||||||
}
|
|
||||||
|
|
||||||
if out.IsNil() {
|
|
||||||
out.Set(reflect.MakeMap(outt))
|
|
||||||
}
|
|
||||||
l := len(n.children)
|
|
||||||
for i := 0; i < l; i += 2 {
|
|
||||||
if isMerge(n.children[i]) {
|
|
||||||
d.merge(n.children[i+1], out)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
k := reflect.New(kt).Elem()
|
|
||||||
if d.unmarshal(n.children[i], k) {
|
|
||||||
kkind := k.Kind()
|
|
||||||
if kkind == reflect.Interface {
|
|
||||||
kkind = k.Elem().Kind()
|
|
||||||
}
|
|
||||||
if kkind == reflect.Map || kkind == reflect.Slice {
|
|
||||||
failf("invalid map key: %#v", k.Interface())
|
|
||||||
}
|
|
||||||
e := reflect.New(et).Elem()
|
|
||||||
if d.unmarshal(n.children[i+1], e) {
|
|
||||||
out.SetMapIndex(k, e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
d.mapType = mapType
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) {
|
|
||||||
outt := out.Type()
|
|
||||||
if outt.Elem() != mapItemType {
|
|
||||||
d.terror(n, yaml_MAP_TAG, out)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
mapType := d.mapType
|
|
||||||
d.mapType = outt
|
|
||||||
|
|
||||||
var slice []MapItem
|
|
||||||
var l = len(n.children)
|
|
||||||
for i := 0; i < l; i += 2 {
|
|
||||||
if isMerge(n.children[i]) {
|
|
||||||
d.merge(n.children[i+1], out)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
item := MapItem{}
|
|
||||||
k := reflect.ValueOf(&item.Key).Elem()
|
|
||||||
if d.unmarshal(n.children[i], k) {
|
|
||||||
v := reflect.ValueOf(&item.Value).Elem()
|
|
||||||
if d.unmarshal(n.children[i+1], v) {
|
|
||||||
slice = append(slice, item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out.Set(reflect.ValueOf(slice))
|
|
||||||
d.mapType = mapType
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) {
|
|
||||||
sinfo, err := getStructInfo(out.Type())
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
name := settableValueOf("")
|
|
||||||
l := len(n.children)
|
|
||||||
|
|
||||||
var inlineMap reflect.Value
|
|
||||||
var elemType reflect.Type
|
|
||||||
if sinfo.InlineMap != -1 {
|
|
||||||
inlineMap = out.Field(sinfo.InlineMap)
|
|
||||||
inlineMap.Set(reflect.New(inlineMap.Type()).Elem())
|
|
||||||
elemType = inlineMap.Type().Elem()
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < l; i += 2 {
|
|
||||||
ni := n.children[i]
|
|
||||||
if isMerge(ni) {
|
|
||||||
d.merge(n.children[i+1], out)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if !d.unmarshal(ni, name) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if info, ok := sinfo.FieldsMap[name.String()]; ok {
|
|
||||||
var field reflect.Value
|
|
||||||
if info.Inline == nil {
|
|
||||||
field = out.Field(info.Num)
|
|
||||||
} else {
|
|
||||||
field = out.FieldByIndex(info.Inline)
|
|
||||||
}
|
|
||||||
d.unmarshal(n.children[i+1], field)
|
|
||||||
} else if sinfo.InlineMap != -1 {
|
|
||||||
if inlineMap.IsNil() {
|
|
||||||
inlineMap.Set(reflect.MakeMap(inlineMap.Type()))
|
|
||||||
}
|
|
||||||
value := reflect.New(elemType).Elem()
|
|
||||||
d.unmarshal(n.children[i+1], value)
|
|
||||||
inlineMap.SetMapIndex(name, value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func failWantMap() {
|
|
||||||
failf("map merge requires map or sequence of maps as the value")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *decoder) merge(n *node, out reflect.Value) {
|
|
||||||
switch n.kind {
|
|
||||||
case mappingNode:
|
|
||||||
d.unmarshal(n, out)
|
|
||||||
case aliasNode:
|
|
||||||
an, ok := d.doc.anchors[n.value]
|
|
||||||
if ok && an.kind != mappingNode {
|
|
||||||
failWantMap()
|
|
||||||
}
|
|
||||||
d.unmarshal(n, out)
|
|
||||||
case sequenceNode:
|
|
||||||
// Step backwards as earlier nodes take precedence.
|
|
||||||
for i := len(n.children) - 1; i >= 0; i-- {
|
|
||||||
ni := n.children[i]
|
|
||||||
if ni.kind == aliasNode {
|
|
||||||
an, ok := d.doc.anchors[ni.value]
|
|
||||||
if ok && an.kind != mappingNode {
|
|
||||||
failWantMap()
|
|
||||||
}
|
|
||||||
} else if ni.kind != mappingNode {
|
|
||||||
failWantMap()
|
|
||||||
}
|
|
||||||
d.unmarshal(ni, out)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
failWantMap()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func isMerge(n *node) bool {
|
|
||||||
return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == yaml_MERGE_TAG)
|
|
||||||
}
|
|
1684
vendor/github.com/go-yaml/yaml/emitterc.go
generated
vendored
1684
vendor/github.com/go-yaml/yaml/emitterc.go
generated
vendored
File diff suppressed because it is too large
Load Diff
306
vendor/github.com/go-yaml/yaml/encode.go
generated
vendored
306
vendor/github.com/go-yaml/yaml/encode.go
generated
vendored
@ -1,306 +0,0 @@
|
|||||||
package yaml
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"regexp"
|
|
||||||
"sort"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type encoder struct {
|
|
||||||
emitter yaml_emitter_t
|
|
||||||
event yaml_event_t
|
|
||||||
out []byte
|
|
||||||
flow bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func newEncoder() (e *encoder) {
|
|
||||||
e = &encoder{}
|
|
||||||
e.must(yaml_emitter_initialize(&e.emitter))
|
|
||||||
yaml_emitter_set_output_string(&e.emitter, &e.out)
|
|
||||||
yaml_emitter_set_unicode(&e.emitter, true)
|
|
||||||
e.must(yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING))
|
|
||||||
e.emit()
|
|
||||||
e.must(yaml_document_start_event_initialize(&e.event, nil, nil, true))
|
|
||||||
e.emit()
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) finish() {
|
|
||||||
e.must(yaml_document_end_event_initialize(&e.event, true))
|
|
||||||
e.emit()
|
|
||||||
e.emitter.open_ended = false
|
|
||||||
e.must(yaml_stream_end_event_initialize(&e.event))
|
|
||||||
e.emit()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) destroy() {
|
|
||||||
yaml_emitter_delete(&e.emitter)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) emit() {
|
|
||||||
// This will internally delete the e.event value.
|
|
||||||
if !yaml_emitter_emit(&e.emitter, &e.event) && e.event.typ != yaml_DOCUMENT_END_EVENT && e.event.typ != yaml_STREAM_END_EVENT {
|
|
||||||
e.must(false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) must(ok bool) {
|
|
||||||
if !ok {
|
|
||||||
msg := e.emitter.problem
|
|
||||||
if msg == "" {
|
|
||||||
msg = "unknown problem generating YAML content"
|
|
||||||
}
|
|
||||||
failf("%s", msg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) marshal(tag string, in reflect.Value) {
|
|
||||||
if !in.IsValid() {
|
|
||||||
e.nilv()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
iface := in.Interface()
|
|
||||||
if m, ok := iface.(Marshaler); ok {
|
|
||||||
v, err := m.MarshalYAML()
|
|
||||||
if err != nil {
|
|
||||||
fail(err)
|
|
||||||
}
|
|
||||||
if v == nil {
|
|
||||||
e.nilv()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
in = reflect.ValueOf(v)
|
|
||||||
} else if m, ok := iface.(encoding.TextMarshaler); ok {
|
|
||||||
text, err := m.MarshalText()
|
|
||||||
if err != nil {
|
|
||||||
fail(err)
|
|
||||||
}
|
|
||||||
in = reflect.ValueOf(string(text))
|
|
||||||
}
|
|
||||||
switch in.Kind() {
|
|
||||||
case reflect.Interface:
|
|
||||||
if in.IsNil() {
|
|
||||||
e.nilv()
|
|
||||||
} else {
|
|
||||||
e.marshal(tag, in.Elem())
|
|
||||||
}
|
|
||||||
case reflect.Map:
|
|
||||||
e.mapv(tag, in)
|
|
||||||
case reflect.Ptr:
|
|
||||||
if in.IsNil() {
|
|
||||||
e.nilv()
|
|
||||||
} else {
|
|
||||||
e.marshal(tag, in.Elem())
|
|
||||||
}
|
|
||||||
case reflect.Struct:
|
|
||||||
e.structv(tag, in)
|
|
||||||
case reflect.Slice:
|
|
||||||
if in.Type().Elem() == mapItemType {
|
|
||||||
e.itemsv(tag, in)
|
|
||||||
} else {
|
|
||||||
e.slicev(tag, in)
|
|
||||||
}
|
|
||||||
case reflect.String:
|
|
||||||
e.stringv(tag, in)
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
if in.Type() == durationType {
|
|
||||||
e.stringv(tag, reflect.ValueOf(iface.(time.Duration).String()))
|
|
||||||
} else {
|
|
||||||
e.intv(tag, in)
|
|
||||||
}
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
||||||
e.uintv(tag, in)
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
e.floatv(tag, in)
|
|
||||||
case reflect.Bool:
|
|
||||||
e.boolv(tag, in)
|
|
||||||
default:
|
|
||||||
panic("cannot marshal type: " + in.Type().String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) mapv(tag string, in reflect.Value) {
|
|
||||||
e.mappingv(tag, func() {
|
|
||||||
keys := keyList(in.MapKeys())
|
|
||||||
sort.Sort(keys)
|
|
||||||
for _, k := range keys {
|
|
||||||
e.marshal("", k)
|
|
||||||
e.marshal("", in.MapIndex(k))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) itemsv(tag string, in reflect.Value) {
|
|
||||||
e.mappingv(tag, func() {
|
|
||||||
slice := in.Convert(reflect.TypeOf([]MapItem{})).Interface().([]MapItem)
|
|
||||||
for _, item := range slice {
|
|
||||||
e.marshal("", reflect.ValueOf(item.Key))
|
|
||||||
e.marshal("", reflect.ValueOf(item.Value))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) structv(tag string, in reflect.Value) {
|
|
||||||
sinfo, err := getStructInfo(in.Type())
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
e.mappingv(tag, func() {
|
|
||||||
for _, info := range sinfo.FieldsList {
|
|
||||||
var value reflect.Value
|
|
||||||
if info.Inline == nil {
|
|
||||||
value = in.Field(info.Num)
|
|
||||||
} else {
|
|
||||||
value = in.FieldByIndex(info.Inline)
|
|
||||||
}
|
|
||||||
if info.OmitEmpty && isZero(value) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
e.marshal("", reflect.ValueOf(info.Key))
|
|
||||||
e.flow = info.Flow
|
|
||||||
e.marshal("", value)
|
|
||||||
}
|
|
||||||
if sinfo.InlineMap >= 0 {
|
|
||||||
m := in.Field(sinfo.InlineMap)
|
|
||||||
if m.Len() > 0 {
|
|
||||||
e.flow = false
|
|
||||||
keys := keyList(m.MapKeys())
|
|
||||||
sort.Sort(keys)
|
|
||||||
for _, k := range keys {
|
|
||||||
if _, found := sinfo.FieldsMap[k.String()]; found {
|
|
||||||
panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", k.String()))
|
|
||||||
}
|
|
||||||
e.marshal("", k)
|
|
||||||
e.flow = false
|
|
||||||
e.marshal("", m.MapIndex(k))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) mappingv(tag string, f func()) {
|
|
||||||
implicit := tag == ""
|
|
||||||
style := yaml_BLOCK_MAPPING_STYLE
|
|
||||||
if e.flow {
|
|
||||||
e.flow = false
|
|
||||||
style = yaml_FLOW_MAPPING_STYLE
|
|
||||||
}
|
|
||||||
e.must(yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style))
|
|
||||||
e.emit()
|
|
||||||
f()
|
|
||||||
e.must(yaml_mapping_end_event_initialize(&e.event))
|
|
||||||
e.emit()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) slicev(tag string, in reflect.Value) {
|
|
||||||
implicit := tag == ""
|
|
||||||
style := yaml_BLOCK_SEQUENCE_STYLE
|
|
||||||
if e.flow {
|
|
||||||
e.flow = false
|
|
||||||
style = yaml_FLOW_SEQUENCE_STYLE
|
|
||||||
}
|
|
||||||
e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style))
|
|
||||||
e.emit()
|
|
||||||
n := in.Len()
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
e.marshal("", in.Index(i))
|
|
||||||
}
|
|
||||||
e.must(yaml_sequence_end_event_initialize(&e.event))
|
|
||||||
e.emit()
|
|
||||||
}
|
|
||||||
|
|
||||||
// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1.
|
|
||||||
//
|
|
||||||
// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported
|
|
||||||
// in YAML 1.2 and by this package, but these should be marshalled quoted for
|
|
||||||
// the time being for compatibility with other parsers.
|
|
||||||
func isBase60Float(s string) (result bool) {
|
|
||||||
// Fast path.
|
|
||||||
if s == "" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
c := s[0]
|
|
||||||
if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
// Do the full match.
|
|
||||||
return base60float.MatchString(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// From http://yaml.org/type/float.html, except the regular expression there
|
|
||||||
// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix.
|
|
||||||
var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`)
|
|
||||||
|
|
||||||
func (e *encoder) stringv(tag string, in reflect.Value) {
|
|
||||||
var style yaml_scalar_style_t
|
|
||||||
s := in.String()
|
|
||||||
rtag, rs := resolve("", s)
|
|
||||||
if rtag == yaml_BINARY_TAG {
|
|
||||||
if tag == "" || tag == yaml_STR_TAG {
|
|
||||||
tag = rtag
|
|
||||||
s = rs.(string)
|
|
||||||
} else if tag == yaml_BINARY_TAG {
|
|
||||||
failf("explicitly tagged !!binary data must be base64-encoded")
|
|
||||||
} else {
|
|
||||||
failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if tag == "" && (rtag != yaml_STR_TAG || isBase60Float(s)) {
|
|
||||||
style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
|
|
||||||
} else if strings.Contains(s, "\n") {
|
|
||||||
style = yaml_LITERAL_SCALAR_STYLE
|
|
||||||
} else {
|
|
||||||
style = yaml_PLAIN_SCALAR_STYLE
|
|
||||||
}
|
|
||||||
e.emitScalar(s, "", tag, style)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) boolv(tag string, in reflect.Value) {
|
|
||||||
var s string
|
|
||||||
if in.Bool() {
|
|
||||||
s = "true"
|
|
||||||
} else {
|
|
||||||
s = "false"
|
|
||||||
}
|
|
||||||
e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) intv(tag string, in reflect.Value) {
|
|
||||||
s := strconv.FormatInt(in.Int(), 10)
|
|
||||||
e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) uintv(tag string, in reflect.Value) {
|
|
||||||
s := strconv.FormatUint(in.Uint(), 10)
|
|
||||||
e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) floatv(tag string, in reflect.Value) {
|
|
||||||
// FIXME: Handle 64 bits here.
|
|
||||||
s := strconv.FormatFloat(float64(in.Float()), 'g', -1, 32)
|
|
||||||
switch s {
|
|
||||||
case "+Inf":
|
|
||||||
s = ".inf"
|
|
||||||
case "-Inf":
|
|
||||||
s = "-.inf"
|
|
||||||
case "NaN":
|
|
||||||
s = ".nan"
|
|
||||||
}
|
|
||||||
e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) nilv() {
|
|
||||||
e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) {
|
|
||||||
implicit := tag == ""
|
|
||||||
e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style))
|
|
||||||
e.emit()
|
|
||||||
}
|
|
1095
vendor/github.com/go-yaml/yaml/parserc.go
generated
vendored
1095
vendor/github.com/go-yaml/yaml/parserc.go
generated
vendored
File diff suppressed because it is too large
Load Diff
394
vendor/github.com/go-yaml/yaml/readerc.go
generated
vendored
394
vendor/github.com/go-yaml/yaml/readerc.go
generated
vendored
@ -1,394 +0,0 @@
|
|||||||
package yaml
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Set the reader error and return 0.
|
|
||||||
func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool {
|
|
||||||
parser.error = yaml_READER_ERROR
|
|
||||||
parser.problem = problem
|
|
||||||
parser.problem_offset = offset
|
|
||||||
parser.problem_value = value
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Byte order marks.
|
|
||||||
const (
|
|
||||||
bom_UTF8 = "\xef\xbb\xbf"
|
|
||||||
bom_UTF16LE = "\xff\xfe"
|
|
||||||
bom_UTF16BE = "\xfe\xff"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Determine the input stream encoding by checking the BOM symbol. If no BOM is
|
|
||||||
// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure.
|
|
||||||
func yaml_parser_determine_encoding(parser *yaml_parser_t) bool {
|
|
||||||
// Ensure that we had enough bytes in the raw buffer.
|
|
||||||
for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 {
|
|
||||||
if !yaml_parser_update_raw_buffer(parser) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine the encoding.
|
|
||||||
buf := parser.raw_buffer
|
|
||||||
pos := parser.raw_buffer_pos
|
|
||||||
avail := len(buf) - pos
|
|
||||||
if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] {
|
|
||||||
parser.encoding = yaml_UTF16LE_ENCODING
|
|
||||||
parser.raw_buffer_pos += 2
|
|
||||||
parser.offset += 2
|
|
||||||
} else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] {
|
|
||||||
parser.encoding = yaml_UTF16BE_ENCODING
|
|
||||||
parser.raw_buffer_pos += 2
|
|
||||||
parser.offset += 2
|
|
||||||
} else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] {
|
|
||||||
parser.encoding = yaml_UTF8_ENCODING
|
|
||||||
parser.raw_buffer_pos += 3
|
|
||||||
parser.offset += 3
|
|
||||||
} else {
|
|
||||||
parser.encoding = yaml_UTF8_ENCODING
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the raw buffer.
|
|
||||||
func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool {
|
|
||||||
size_read := 0
|
|
||||||
|
|
||||||
// Return if the raw buffer is full.
|
|
||||||
if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return on EOF.
|
|
||||||
if parser.eof {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move the remaining bytes in the raw buffer to the beginning.
|
|
||||||
if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) {
|
|
||||||
copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:])
|
|
||||||
}
|
|
||||||
parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos]
|
|
||||||
parser.raw_buffer_pos = 0
|
|
||||||
|
|
||||||
// Call the read handler to fill the buffer.
|
|
||||||
size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)])
|
|
||||||
parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read]
|
|
||||||
if err == io.EOF {
|
|
||||||
parser.eof = true
|
|
||||||
} else if err != nil {
|
|
||||||
return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure that the buffer contains at least `length` characters.
|
|
||||||
// Return true on success, false on failure.
|
|
||||||
//
|
|
||||||
// The length is supposed to be significantly less that the buffer size.
|
|
||||||
func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool {
|
|
||||||
if parser.read_handler == nil {
|
|
||||||
panic("read handler must be set")
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the EOF flag is set and the raw buffer is empty, do nothing.
|
|
||||||
if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return if the buffer contains enough characters.
|
|
||||||
if parser.unread >= length {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine the input encoding if it is not known yet.
|
|
||||||
if parser.encoding == yaml_ANY_ENCODING {
|
|
||||||
if !yaml_parser_determine_encoding(parser) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move the unread characters to the beginning of the buffer.
|
|
||||||
buffer_len := len(parser.buffer)
|
|
||||||
if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len {
|
|
||||||
copy(parser.buffer, parser.buffer[parser.buffer_pos:])
|
|
||||||
buffer_len -= parser.buffer_pos
|
|
||||||
parser.buffer_pos = 0
|
|
||||||
} else if parser.buffer_pos == buffer_len {
|
|
||||||
buffer_len = 0
|
|
||||||
parser.buffer_pos = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open the whole buffer for writing, and cut it before returning.
|
|
||||||
parser.buffer = parser.buffer[:cap(parser.buffer)]
|
|
||||||
|
|
||||||
// Fill the buffer until it has enough characters.
|
|
||||||
first := true
|
|
||||||
for parser.unread < length {
|
|
||||||
|
|
||||||
// Fill the raw buffer if necessary.
|
|
||||||
if !first || parser.raw_buffer_pos == len(parser.raw_buffer) {
|
|
||||||
if !yaml_parser_update_raw_buffer(parser) {
|
|
||||||
parser.buffer = parser.buffer[:buffer_len]
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
first = false
|
|
||||||
|
|
||||||
// Decode the raw buffer.
|
|
||||||
inner:
|
|
||||||
for parser.raw_buffer_pos != len(parser.raw_buffer) {
|
|
||||||
var value rune
|
|
||||||
var width int
|
|
||||||
|
|
||||||
raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos
|
|
||||||
|
|
||||||
// Decode the next character.
|
|
||||||
switch parser.encoding {
|
|
||||||
case yaml_UTF8_ENCODING:
|
|
||||||
// Decode a UTF-8 character. Check RFC 3629
|
|
||||||
// (http://www.ietf.org/rfc/rfc3629.txt) for more details.
|
|
||||||
//
|
|
||||||
// The following table (taken from the RFC) is used for
|
|
||||||
// decoding.
|
|
||||||
//
|
|
||||||
// Char. number range | UTF-8 octet sequence
|
|
||||||
// (hexadecimal) | (binary)
|
|
||||||
// --------------------+------------------------------------
|
|
||||||
// 0000 0000-0000 007F | 0xxxxxxx
|
|
||||||
// 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
|
|
||||||
// 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
|
|
||||||
// 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
||||||
//
|
|
||||||
// Additionally, the characters in the range 0xD800-0xDFFF
|
|
||||||
// are prohibited as they are reserved for use with UTF-16
|
|
||||||
// surrogate pairs.
|
|
||||||
|
|
||||||
// Determine the length of the UTF-8 sequence.
|
|
||||||
octet := parser.raw_buffer[parser.raw_buffer_pos]
|
|
||||||
switch {
|
|
||||||
case octet&0x80 == 0x00:
|
|
||||||
width = 1
|
|
||||||
case octet&0xE0 == 0xC0:
|
|
||||||
width = 2
|
|
||||||
case octet&0xF0 == 0xE0:
|
|
||||||
width = 3
|
|
||||||
case octet&0xF8 == 0xF0:
|
|
||||||
width = 4
|
|
||||||
default:
|
|
||||||
// The leading octet is invalid.
|
|
||||||
return yaml_parser_set_reader_error(parser,
|
|
||||||
"invalid leading UTF-8 octet",
|
|
||||||
parser.offset, int(octet))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the raw buffer contains an incomplete character.
|
|
||||||
if width > raw_unread {
|
|
||||||
if parser.eof {
|
|
||||||
return yaml_parser_set_reader_error(parser,
|
|
||||||
"incomplete UTF-8 octet sequence",
|
|
||||||
parser.offset, -1)
|
|
||||||
}
|
|
||||||
break inner
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decode the leading octet.
|
|
||||||
switch {
|
|
||||||
case octet&0x80 == 0x00:
|
|
||||||
value = rune(octet & 0x7F)
|
|
||||||
case octet&0xE0 == 0xC0:
|
|
||||||
value = rune(octet & 0x1F)
|
|
||||||
case octet&0xF0 == 0xE0:
|
|
||||||
value = rune(octet & 0x0F)
|
|
||||||
case octet&0xF8 == 0xF0:
|
|
||||||
value = rune(octet & 0x07)
|
|
||||||
default:
|
|
||||||
value = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check and decode the trailing octets.
|
|
||||||
for k := 1; k < width; k++ {
|
|
||||||
octet = parser.raw_buffer[parser.raw_buffer_pos+k]
|
|
||||||
|
|
||||||
// Check if the octet is valid.
|
|
||||||
if (octet & 0xC0) != 0x80 {
|
|
||||||
return yaml_parser_set_reader_error(parser,
|
|
||||||
"invalid trailing UTF-8 octet",
|
|
||||||
parser.offset+k, int(octet))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decode the octet.
|
|
||||||
value = (value << 6) + rune(octet&0x3F)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check the length of the sequence against the value.
|
|
||||||
switch {
|
|
||||||
case width == 1:
|
|
||||||
case width == 2 && value >= 0x80:
|
|
||||||
case width == 3 && value >= 0x800:
|
|
||||||
case width == 4 && value >= 0x10000:
|
|
||||||
default:
|
|
||||||
return yaml_parser_set_reader_error(parser,
|
|
||||||
"invalid length of a UTF-8 sequence",
|
|
||||||
parser.offset, -1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check the range of the value.
|
|
||||||
if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF {
|
|
||||||
return yaml_parser_set_reader_error(parser,
|
|
||||||
"invalid Unicode character",
|
|
||||||
parser.offset, int(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING:
|
|
||||||
var low, high int
|
|
||||||
if parser.encoding == yaml_UTF16LE_ENCODING {
|
|
||||||
low, high = 0, 1
|
|
||||||
} else {
|
|
||||||
low, high = 1, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// The UTF-16 encoding is not as simple as one might
|
|
||||||
// naively think. Check RFC 2781
|
|
||||||
// (http://www.ietf.org/rfc/rfc2781.txt).
|
|
||||||
//
|
|
||||||
// Normally, two subsequent bytes describe a Unicode
|
|
||||||
// character. However a special technique (called a
|
|
||||||
// surrogate pair) is used for specifying character
|
|
||||||
// values larger than 0xFFFF.
|
|
||||||
//
|
|
||||||
// A surrogate pair consists of two pseudo-characters:
|
|
||||||
// high surrogate area (0xD800-0xDBFF)
|
|
||||||
// low surrogate area (0xDC00-0xDFFF)
|
|
||||||
//
|
|
||||||
// The following formulas are used for decoding
|
|
||||||
// and encoding characters using surrogate pairs:
|
|
||||||
//
|
|
||||||
// U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF)
|
|
||||||
// U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF)
|
|
||||||
// W1 = 110110yyyyyyyyyy
|
|
||||||
// W2 = 110111xxxxxxxxxx
|
|
||||||
//
|
|
||||||
// where U is the character value, W1 is the high surrogate
|
|
||||||
// area, W2 is the low surrogate area.
|
|
||||||
|
|
||||||
// Check for incomplete UTF-16 character.
|
|
||||||
if raw_unread < 2 {
|
|
||||||
if parser.eof {
|
|
||||||
return yaml_parser_set_reader_error(parser,
|
|
||||||
"incomplete UTF-16 character",
|
|
||||||
parser.offset, -1)
|
|
||||||
}
|
|
||||||
break inner
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the character.
|
|
||||||
value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) +
|
|
||||||
(rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8)
|
|
||||||
|
|
||||||
// Check for unexpected low surrogate area.
|
|
||||||
if value&0xFC00 == 0xDC00 {
|
|
||||||
return yaml_parser_set_reader_error(parser,
|
|
||||||
"unexpected low surrogate area",
|
|
||||||
parser.offset, int(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for a high surrogate area.
|
|
||||||
if value&0xFC00 == 0xD800 {
|
|
||||||
width = 4
|
|
||||||
|
|
||||||
// Check for incomplete surrogate pair.
|
|
||||||
if raw_unread < 4 {
|
|
||||||
if parser.eof {
|
|
||||||
return yaml_parser_set_reader_error(parser,
|
|
||||||
"incomplete UTF-16 surrogate pair",
|
|
||||||
parser.offset, -1)
|
|
||||||
}
|
|
||||||
break inner
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the next character.
|
|
||||||
value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) +
|
|
||||||
(rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8)
|
|
||||||
|
|
||||||
// Check for a low surrogate area.
|
|
||||||
if value2&0xFC00 != 0xDC00 {
|
|
||||||
return yaml_parser_set_reader_error(parser,
|
|
||||||
"expected low surrogate area",
|
|
||||||
parser.offset+2, int(value2))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate the value of the surrogate pair.
|
|
||||||
value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF)
|
|
||||||
} else {
|
|
||||||
width = 2
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
panic("impossible")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character is in the allowed range:
|
|
||||||
// #x9 | #xA | #xD | [#x20-#x7E] (8 bit)
|
|
||||||
// | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit)
|
|
||||||
// | [#x10000-#x10FFFF] (32 bit)
|
|
||||||
switch {
|
|
||||||
case value == 0x09:
|
|
||||||
case value == 0x0A:
|
|
||||||
case value == 0x0D:
|
|
||||||
case value >= 0x20 && value <= 0x7E:
|
|
||||||
case value == 0x85:
|
|
||||||
case value >= 0xA0 && value <= 0xD7FF:
|
|
||||||
case value >= 0xE000 && value <= 0xFFFD:
|
|
||||||
case value >= 0x10000 && value <= 0x10FFFF:
|
|
||||||
default:
|
|
||||||
return yaml_parser_set_reader_error(parser,
|
|
||||||
"control characters are not allowed",
|
|
||||||
parser.offset, int(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move the raw pointers.
|
|
||||||
parser.raw_buffer_pos += width
|
|
||||||
parser.offset += width
|
|
||||||
|
|
||||||
// Finally put the character into the buffer.
|
|
||||||
if value <= 0x7F {
|
|
||||||
// 0000 0000-0000 007F . 0xxxxxxx
|
|
||||||
parser.buffer[buffer_len+0] = byte(value)
|
|
||||||
buffer_len += 1
|
|
||||||
} else if value <= 0x7FF {
|
|
||||||
// 0000 0080-0000 07FF . 110xxxxx 10xxxxxx
|
|
||||||
parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6))
|
|
||||||
parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F))
|
|
||||||
buffer_len += 2
|
|
||||||
} else if value <= 0xFFFF {
|
|
||||||
// 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx
|
|
||||||
parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12))
|
|
||||||
parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F))
|
|
||||||
parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F))
|
|
||||||
buffer_len += 3
|
|
||||||
} else {
|
|
||||||
// 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
|
||||||
parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18))
|
|
||||||
parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F))
|
|
||||||
parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F))
|
|
||||||
parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F))
|
|
||||||
buffer_len += 4
|
|
||||||
}
|
|
||||||
|
|
||||||
parser.unread++
|
|
||||||
}
|
|
||||||
|
|
||||||
// On EOF, put NUL into the buffer and return.
|
|
||||||
if parser.eof {
|
|
||||||
parser.buffer[buffer_len] = 0
|
|
||||||
buffer_len++
|
|
||||||
parser.unread++
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parser.buffer = parser.buffer[:buffer_len]
|
|
||||||
return true
|
|
||||||
}
|
|
208
vendor/github.com/go-yaml/yaml/resolve.go
generated
vendored
208
vendor/github.com/go-yaml/yaml/resolve.go
generated
vendored
@ -1,208 +0,0 @@
|
|||||||
package yaml
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/base64"
|
|
||||||
"math"
|
|
||||||
"regexp"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"unicode/utf8"
|
|
||||||
)
|
|
||||||
|
|
||||||
type resolveMapItem struct {
|
|
||||||
value interface{}
|
|
||||||
tag string
|
|
||||||
}
|
|
||||||
|
|
||||||
var resolveTable = make([]byte, 256)
|
|
||||||
var resolveMap = make(map[string]resolveMapItem)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
t := resolveTable
|
|
||||||
t[int('+')] = 'S' // Sign
|
|
||||||
t[int('-')] = 'S'
|
|
||||||
for _, c := range "0123456789" {
|
|
||||||
t[int(c)] = 'D' // Digit
|
|
||||||
}
|
|
||||||
for _, c := range "yYnNtTfFoO~" {
|
|
||||||
t[int(c)] = 'M' // In map
|
|
||||||
}
|
|
||||||
t[int('.')] = '.' // Float (potentially in map)
|
|
||||||
|
|
||||||
var resolveMapList = []struct {
|
|
||||||
v interface{}
|
|
||||||
tag string
|
|
||||||
l []string
|
|
||||||
}{
|
|
||||||
{true, yaml_BOOL_TAG, []string{"y", "Y", "yes", "Yes", "YES"}},
|
|
||||||
{true, yaml_BOOL_TAG, []string{"true", "True", "TRUE"}},
|
|
||||||
{true, yaml_BOOL_TAG, []string{"on", "On", "ON"}},
|
|
||||||
{false, yaml_BOOL_TAG, []string{"n", "N", "no", "No", "NO"}},
|
|
||||||
{false, yaml_BOOL_TAG, []string{"false", "False", "FALSE"}},
|
|
||||||
{false, yaml_BOOL_TAG, []string{"off", "Off", "OFF"}},
|
|
||||||
{nil, yaml_NULL_TAG, []string{"", "~", "null", "Null", "NULL"}},
|
|
||||||
{math.NaN(), yaml_FLOAT_TAG, []string{".nan", ".NaN", ".NAN"}},
|
|
||||||
{math.Inf(+1), yaml_FLOAT_TAG, []string{".inf", ".Inf", ".INF"}},
|
|
||||||
{math.Inf(+1), yaml_FLOAT_TAG, []string{"+.inf", "+.Inf", "+.INF"}},
|
|
||||||
{math.Inf(-1), yaml_FLOAT_TAG, []string{"-.inf", "-.Inf", "-.INF"}},
|
|
||||||
{"<<", yaml_MERGE_TAG, []string{"<<"}},
|
|
||||||
}
|
|
||||||
|
|
||||||
m := resolveMap
|
|
||||||
for _, item := range resolveMapList {
|
|
||||||
for _, s := range item.l {
|
|
||||||
m[s] = resolveMapItem{item.v, item.tag}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const longTagPrefix = "tag:yaml.org,2002:"
|
|
||||||
|
|
||||||
func shortTag(tag string) string {
|
|
||||||
// TODO This can easily be made faster and produce less garbage.
|
|
||||||
if strings.HasPrefix(tag, longTagPrefix) {
|
|
||||||
return "!!" + tag[len(longTagPrefix):]
|
|
||||||
}
|
|
||||||
return tag
|
|
||||||
}
|
|
||||||
|
|
||||||
func longTag(tag string) string {
|
|
||||||
if strings.HasPrefix(tag, "!!") {
|
|
||||||
return longTagPrefix + tag[2:]
|
|
||||||
}
|
|
||||||
return tag
|
|
||||||
}
|
|
||||||
|
|
||||||
func resolvableTag(tag string) bool {
|
|
||||||
switch tag {
|
|
||||||
case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG:
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`)
|
|
||||||
|
|
||||||
func resolve(tag string, in string) (rtag string, out interface{}) {
|
|
||||||
if !resolvableTag(tag) {
|
|
||||||
return tag, in
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
switch tag {
|
|
||||||
case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG:
|
|
||||||
return
|
|
||||||
}
|
|
||||||
failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag))
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Any data is accepted as a !!str or !!binary.
|
|
||||||
// Otherwise, the prefix is enough of a hint about what it might be.
|
|
||||||
hint := byte('N')
|
|
||||||
if in != "" {
|
|
||||||
hint = resolveTable[in[0]]
|
|
||||||
}
|
|
||||||
if hint != 0 && tag != yaml_STR_TAG && tag != yaml_BINARY_TAG {
|
|
||||||
// Handle things we can lookup in a map.
|
|
||||||
if item, ok := resolveMap[in]; ok {
|
|
||||||
return item.tag, item.value
|
|
||||||
}
|
|
||||||
|
|
||||||
// Base 60 floats are a bad idea, were dropped in YAML 1.2, and
|
|
||||||
// are purposefully unsupported here. They're still quoted on
|
|
||||||
// the way out for compatibility with other parser, though.
|
|
||||||
|
|
||||||
switch hint {
|
|
||||||
case 'M':
|
|
||||||
// We've already checked the map above.
|
|
||||||
|
|
||||||
case '.':
|
|
||||||
// Not in the map, so maybe a normal float.
|
|
||||||
floatv, err := strconv.ParseFloat(in, 64)
|
|
||||||
if err == nil {
|
|
||||||
return yaml_FLOAT_TAG, floatv
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'D', 'S':
|
|
||||||
// Int, float, or timestamp.
|
|
||||||
plain := strings.Replace(in, "_", "", -1)
|
|
||||||
intv, err := strconv.ParseInt(plain, 0, 64)
|
|
||||||
if err == nil {
|
|
||||||
if intv == int64(int(intv)) {
|
|
||||||
return yaml_INT_TAG, int(intv)
|
|
||||||
} else {
|
|
||||||
return yaml_INT_TAG, intv
|
|
||||||
}
|
|
||||||
}
|
|
||||||
uintv, err := strconv.ParseUint(plain, 0, 64)
|
|
||||||
if err == nil {
|
|
||||||
return yaml_INT_TAG, uintv
|
|
||||||
}
|
|
||||||
if yamlStyleFloat.MatchString(plain) {
|
|
||||||
floatv, err := strconv.ParseFloat(plain, 64)
|
|
||||||
if err == nil {
|
|
||||||
return yaml_FLOAT_TAG, floatv
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if strings.HasPrefix(plain, "0b") {
|
|
||||||
intv, err := strconv.ParseInt(plain[2:], 2, 64)
|
|
||||||
if err == nil {
|
|
||||||
if intv == int64(int(intv)) {
|
|
||||||
return yaml_INT_TAG, int(intv)
|
|
||||||
} else {
|
|
||||||
return yaml_INT_TAG, intv
|
|
||||||
}
|
|
||||||
}
|
|
||||||
uintv, err := strconv.ParseUint(plain[2:], 2, 64)
|
|
||||||
if err == nil {
|
|
||||||
return yaml_INT_TAG, uintv
|
|
||||||
}
|
|
||||||
} else if strings.HasPrefix(plain, "-0b") {
|
|
||||||
intv, err := strconv.ParseInt(plain[3:], 2, 64)
|
|
||||||
if err == nil {
|
|
||||||
if intv == int64(int(intv)) {
|
|
||||||
return yaml_INT_TAG, -int(intv)
|
|
||||||
} else {
|
|
||||||
return yaml_INT_TAG, -intv
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// XXX Handle timestamps here.
|
|
||||||
|
|
||||||
default:
|
|
||||||
panic("resolveTable item not yet handled: " + string(rune(hint)) + " (with " + in + ")")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if tag == yaml_BINARY_TAG {
|
|
||||||
return yaml_BINARY_TAG, in
|
|
||||||
}
|
|
||||||
if utf8.ValidString(in) {
|
|
||||||
return yaml_STR_TAG, in
|
|
||||||
}
|
|
||||||
return yaml_BINARY_TAG, encodeBase64(in)
|
|
||||||
}
|
|
||||||
|
|
||||||
// encodeBase64 encodes s as base64 that is broken up into multiple lines
|
|
||||||
// as appropriate for the resulting length.
|
|
||||||
func encodeBase64(s string) string {
|
|
||||||
const lineLen = 70
|
|
||||||
encLen := base64.StdEncoding.EncodedLen(len(s))
|
|
||||||
lines := encLen/lineLen + 1
|
|
||||||
buf := make([]byte, encLen*2+lines)
|
|
||||||
in := buf[0:encLen]
|
|
||||||
out := buf[encLen:]
|
|
||||||
base64.StdEncoding.Encode(in, []byte(s))
|
|
||||||
k := 0
|
|
||||||
for i := 0; i < len(in); i += lineLen {
|
|
||||||
j := i + lineLen
|
|
||||||
if j > len(in) {
|
|
||||||
j = len(in)
|
|
||||||
}
|
|
||||||
k += copy(out[k:], in[i:j])
|
|
||||||
if lines > 1 {
|
|
||||||
out[k] = '\n'
|
|
||||||
k++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return string(out[:k])
|
|
||||||
}
|
|
2710
vendor/github.com/go-yaml/yaml/scannerc.go
generated
vendored
2710
vendor/github.com/go-yaml/yaml/scannerc.go
generated
vendored
File diff suppressed because it is too large
Load Diff
104
vendor/github.com/go-yaml/yaml/sorter.go
generated
vendored
104
vendor/github.com/go-yaml/yaml/sorter.go
generated
vendored
@ -1,104 +0,0 @@
|
|||||||
package yaml
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
"unicode"
|
|
||||||
)
|
|
||||||
|
|
||||||
type keyList []reflect.Value
|
|
||||||
|
|
||||||
func (l keyList) Len() int { return len(l) }
|
|
||||||
func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
|
|
||||||
func (l keyList) Less(i, j int) bool {
|
|
||||||
a := l[i]
|
|
||||||
b := l[j]
|
|
||||||
ak := a.Kind()
|
|
||||||
bk := b.Kind()
|
|
||||||
for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() {
|
|
||||||
a = a.Elem()
|
|
||||||
ak = a.Kind()
|
|
||||||
}
|
|
||||||
for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() {
|
|
||||||
b = b.Elem()
|
|
||||||
bk = b.Kind()
|
|
||||||
}
|
|
||||||
af, aok := keyFloat(a)
|
|
||||||
bf, bok := keyFloat(b)
|
|
||||||
if aok && bok {
|
|
||||||
if af != bf {
|
|
||||||
return af < bf
|
|
||||||
}
|
|
||||||
if ak != bk {
|
|
||||||
return ak < bk
|
|
||||||
}
|
|
||||||
return numLess(a, b)
|
|
||||||
}
|
|
||||||
if ak != reflect.String || bk != reflect.String {
|
|
||||||
return ak < bk
|
|
||||||
}
|
|
||||||
ar, br := []rune(a.String()), []rune(b.String())
|
|
||||||
for i := 0; i < len(ar) && i < len(br); i++ {
|
|
||||||
if ar[i] == br[i] {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
al := unicode.IsLetter(ar[i])
|
|
||||||
bl := unicode.IsLetter(br[i])
|
|
||||||
if al && bl {
|
|
||||||
return ar[i] < br[i]
|
|
||||||
}
|
|
||||||
if al || bl {
|
|
||||||
return bl
|
|
||||||
}
|
|
||||||
var ai, bi int
|
|
||||||
var an, bn int64
|
|
||||||
for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
|
|
||||||
an = an*10 + int64(ar[ai]-'0')
|
|
||||||
}
|
|
||||||
for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
|
|
||||||
bn = bn*10 + int64(br[bi]-'0')
|
|
||||||
}
|
|
||||||
if an != bn {
|
|
||||||
return an < bn
|
|
||||||
}
|
|
||||||
if ai != bi {
|
|
||||||
return ai < bi
|
|
||||||
}
|
|
||||||
return ar[i] < br[i]
|
|
||||||
}
|
|
||||||
return len(ar) < len(br)
|
|
||||||
}
|
|
||||||
|
|
||||||
// keyFloat returns a float value for v if it is a number/bool
|
|
||||||
// and whether it is a number/bool or not.
|
|
||||||
func keyFloat(v reflect.Value) (f float64, ok bool) {
|
|
||||||
switch v.Kind() {
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
return float64(v.Int()), true
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
return v.Float(), true
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
||||||
return float64(v.Uint()), true
|
|
||||||
case reflect.Bool:
|
|
||||||
if v.Bool() {
|
|
||||||
return 1, true
|
|
||||||
}
|
|
||||||
return 0, true
|
|
||||||
}
|
|
||||||
return 0, false
|
|
||||||
}
|
|
||||||
|
|
||||||
// numLess returns whether a < b.
|
|
||||||
// a and b must necessarily have the same kind.
|
|
||||||
func numLess(a, b reflect.Value) bool {
|
|
||||||
switch a.Kind() {
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
return a.Int() < b.Int()
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
return a.Float() < b.Float()
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
||||||
return a.Uint() < b.Uint()
|
|
||||||
case reflect.Bool:
|
|
||||||
return !a.Bool() && b.Bool()
|
|
||||||
}
|
|
||||||
panic("not a number")
|
|
||||||
}
|
|
89
vendor/github.com/go-yaml/yaml/writerc.go
generated
vendored
89
vendor/github.com/go-yaml/yaml/writerc.go
generated
vendored
@ -1,89 +0,0 @@
|
|||||||
package yaml
|
|
||||||
|
|
||||||
// Set the writer error and return false.
|
|
||||||
func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool {
|
|
||||||
emitter.error = yaml_WRITER_ERROR
|
|
||||||
emitter.problem = problem
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Flush the output buffer.
|
|
||||||
func yaml_emitter_flush(emitter *yaml_emitter_t) bool {
|
|
||||||
if emitter.write_handler == nil {
|
|
||||||
panic("write handler not set")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the buffer is empty.
|
|
||||||
if emitter.buffer_pos == 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the output encoding is UTF-8, we don't need to recode the buffer.
|
|
||||||
if emitter.encoding == yaml_UTF8_ENCODING {
|
|
||||||
if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil {
|
|
||||||
return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
|
|
||||||
}
|
|
||||||
emitter.buffer_pos = 0
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Recode the buffer into the raw buffer.
|
|
||||||
var low, high int
|
|
||||||
if emitter.encoding == yaml_UTF16LE_ENCODING {
|
|
||||||
low, high = 0, 1
|
|
||||||
} else {
|
|
||||||
high, low = 1, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
pos := 0
|
|
||||||
for pos < emitter.buffer_pos {
|
|
||||||
// See the "reader.c" code for more details on UTF-8 encoding. Note
|
|
||||||
// that we assume that the buffer contains a valid UTF-8 sequence.
|
|
||||||
|
|
||||||
// Read the next UTF-8 character.
|
|
||||||
octet := emitter.buffer[pos]
|
|
||||||
|
|
||||||
var w int
|
|
||||||
var value rune
|
|
||||||
switch {
|
|
||||||
case octet&0x80 == 0x00:
|
|
||||||
w, value = 1, rune(octet&0x7F)
|
|
||||||
case octet&0xE0 == 0xC0:
|
|
||||||
w, value = 2, rune(octet&0x1F)
|
|
||||||
case octet&0xF0 == 0xE0:
|
|
||||||
w, value = 3, rune(octet&0x0F)
|
|
||||||
case octet&0xF8 == 0xF0:
|
|
||||||
w, value = 4, rune(octet&0x07)
|
|
||||||
}
|
|
||||||
for k := 1; k < w; k++ {
|
|
||||||
octet = emitter.buffer[pos+k]
|
|
||||||
value = (value << 6) + (rune(octet) & 0x3F)
|
|
||||||
}
|
|
||||||
pos += w
|
|
||||||
|
|
||||||
// Write the character.
|
|
||||||
if value < 0x10000 {
|
|
||||||
var b [2]byte
|
|
||||||
b[high] = byte(value >> 8)
|
|
||||||
b[low] = byte(value & 0xFF)
|
|
||||||
emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1])
|
|
||||||
} else {
|
|
||||||
// Write the character using a surrogate pair (check "reader.c").
|
|
||||||
var b [4]byte
|
|
||||||
value -= 0x10000
|
|
||||||
b[high] = byte(0xD8 + (value >> 18))
|
|
||||||
b[low] = byte((value >> 10) & 0xFF)
|
|
||||||
b[high+2] = byte(0xDC + ((value >> 8) & 0xFF))
|
|
||||||
b[low+2] = byte(value & 0xFF)
|
|
||||||
emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1], b[2], b[3])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the raw buffer.
|
|
||||||
if err := emitter.write_handler(emitter, emitter.raw_buffer); err != nil {
|
|
||||||
return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
|
|
||||||
}
|
|
||||||
emitter.buffer_pos = 0
|
|
||||||
emitter.raw_buffer = emitter.raw_buffer[:0]
|
|
||||||
return true
|
|
||||||
}
|
|
346
vendor/github.com/go-yaml/yaml/yaml.go
generated
vendored
346
vendor/github.com/go-yaml/yaml/yaml.go
generated
vendored
@ -1,346 +0,0 @@
|
|||||||
// Package yaml implements YAML support for the Go language.
|
|
||||||
//
|
|
||||||
// Source code and other details for the project are available at GitHub:
|
|
||||||
//
|
|
||||||
// https://github.com/go-yaml/yaml
|
|
||||||
//
|
|
||||||
package yaml
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MapSlice encodes and decodes as a YAML map.
|
|
||||||
// The order of keys is preserved when encoding and decoding.
|
|
||||||
type MapSlice []MapItem
|
|
||||||
|
|
||||||
// MapItem is an item in a MapSlice.
|
|
||||||
type MapItem struct {
|
|
||||||
Key, Value interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The Unmarshaler interface may be implemented by types to customize their
|
|
||||||
// behavior when being unmarshaled from a YAML document. The UnmarshalYAML
|
|
||||||
// method receives a function that may be called to unmarshal the original
|
|
||||||
// YAML value into a field or variable. It is safe to call the unmarshal
|
|
||||||
// function parameter more than once if necessary.
|
|
||||||
type Unmarshaler interface {
|
|
||||||
UnmarshalYAML(unmarshal func(interface{}) error) error
|
|
||||||
}
|
|
||||||
|
|
||||||
// The Marshaler interface may be implemented by types to customize their
|
|
||||||
// behavior when being marshaled into a YAML document. The returned value
|
|
||||||
// is marshaled in place of the original value implementing Marshaler.
|
|
||||||
//
|
|
||||||
// If an error is returned by MarshalYAML, the marshaling procedure stops
|
|
||||||
// and returns with the provided error.
|
|
||||||
type Marshaler interface {
|
|
||||||
MarshalYAML() (interface{}, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshal decodes the first document found within the in byte slice
|
|
||||||
// and assigns decoded values into the out value.
|
|
||||||
//
|
|
||||||
// Maps and pointers (to a struct, string, int, etc) are accepted as out
|
|
||||||
// values. If an internal pointer within a struct is not initialized,
|
|
||||||
// the yaml package will initialize it if necessary for unmarshalling
|
|
||||||
// the provided data. The out parameter must not be nil.
|
|
||||||
//
|
|
||||||
// The type of the decoded values should be compatible with the respective
|
|
||||||
// values in out. If one or more values cannot be decoded due to a type
|
|
||||||
// mismatches, decoding continues partially until the end of the YAML
|
|
||||||
// content, and a *yaml.TypeError is returned with details for all
|
|
||||||
// missed values.
|
|
||||||
//
|
|
||||||
// Struct fields are only unmarshalled if they are exported (have an
|
|
||||||
// upper case first letter), and are unmarshalled using the field name
|
|
||||||
// lowercased as the default key. Custom keys may be defined via the
|
|
||||||
// "yaml" name in the field tag: the content preceding the first comma
|
|
||||||
// is used as the key, and the following comma-separated options are
|
|
||||||
// used to tweak the marshalling process (see Marshal).
|
|
||||||
// Conflicting names result in a runtime error.
|
|
||||||
//
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// type T struct {
|
|
||||||
// F int `yaml:"a,omitempty"`
|
|
||||||
// B int
|
|
||||||
// }
|
|
||||||
// var t T
|
|
||||||
// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
|
|
||||||
//
|
|
||||||
// See the documentation of Marshal for the format of tags and a list of
|
|
||||||
// supported tag options.
|
|
||||||
//
|
|
||||||
func Unmarshal(in []byte, out interface{}) (err error) {
|
|
||||||
defer handleErr(&err)
|
|
||||||
d := newDecoder()
|
|
||||||
p := newParser(in)
|
|
||||||
defer p.destroy()
|
|
||||||
node := p.parse()
|
|
||||||
if node != nil {
|
|
||||||
v := reflect.ValueOf(out)
|
|
||||||
if v.Kind() == reflect.Ptr && !v.IsNil() {
|
|
||||||
v = v.Elem()
|
|
||||||
}
|
|
||||||
d.unmarshal(node, v)
|
|
||||||
}
|
|
||||||
if len(d.terrors) > 0 {
|
|
||||||
return &TypeError{d.terrors}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Marshal serializes the value provided into a YAML document. The structure
|
|
||||||
// of the generated document will reflect the structure of the value itself.
|
|
||||||
// Maps and pointers (to struct, string, int, etc) are accepted as the in value.
|
|
||||||
//
|
|
||||||
// Struct fields are only unmarshalled if they are exported (have an upper case
|
|
||||||
// first letter), and are unmarshalled using the field name lowercased as the
|
|
||||||
// default key. Custom keys may be defined via the "yaml" name in the field
|
|
||||||
// tag: the content preceding the first comma is used as the key, and the
|
|
||||||
// following comma-separated options are used to tweak the marshalling process.
|
|
||||||
// Conflicting names result in a runtime error.
|
|
||||||
//
|
|
||||||
// The field tag format accepted is:
|
|
||||||
//
|
|
||||||
// `(...) yaml:"[<key>][,<flag1>[,<flag2>]]" (...)`
|
|
||||||
//
|
|
||||||
// The following flags are currently supported:
|
|
||||||
//
|
|
||||||
// omitempty Only include the field if it's not set to the zero
|
|
||||||
// value for the type or to empty slices or maps.
|
|
||||||
// Does not apply to zero valued structs.
|
|
||||||
//
|
|
||||||
// flow Marshal using a flow style (useful for structs,
|
|
||||||
// sequences and maps).
|
|
||||||
//
|
|
||||||
// inline Inline the field, which must be a struct or a map,
|
|
||||||
// causing all of its fields or keys to be processed as if
|
|
||||||
// they were part of the outer struct. For maps, keys must
|
|
||||||
// not conflict with the yaml keys of other struct fields.
|
|
||||||
//
|
|
||||||
// In addition, if the key is "-", the field is ignored.
|
|
||||||
//
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// type T struct {
|
|
||||||
// F int "a,omitempty"
|
|
||||||
// B int
|
|
||||||
// }
|
|
||||||
// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n"
|
|
||||||
// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
|
|
||||||
//
|
|
||||||
func Marshal(in interface{}) (out []byte, err error) {
|
|
||||||
defer handleErr(&err)
|
|
||||||
e := newEncoder()
|
|
||||||
defer e.destroy()
|
|
||||||
e.marshal("", reflect.ValueOf(in))
|
|
||||||
e.finish()
|
|
||||||
out = e.out
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleErr(err *error) {
|
|
||||||
if v := recover(); v != nil {
|
|
||||||
if e, ok := v.(yamlError); ok {
|
|
||||||
*err = e.err
|
|
||||||
} else {
|
|
||||||
panic(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type yamlError struct {
|
|
||||||
err error
|
|
||||||
}
|
|
||||||
|
|
||||||
func fail(err error) {
|
|
||||||
panic(yamlError{err})
|
|
||||||
}
|
|
||||||
|
|
||||||
func failf(format string, args ...interface{}) {
|
|
||||||
panic(yamlError{fmt.Errorf("yaml: "+format, args...)})
|
|
||||||
}
|
|
||||||
|
|
||||||
// A TypeError is returned by Unmarshal when one or more fields in
|
|
||||||
// the YAML document cannot be properly decoded into the requested
|
|
||||||
// types. When this error is returned, the value is still
|
|
||||||
// unmarshaled partially.
|
|
||||||
type TypeError struct {
|
|
||||||
Errors []string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *TypeError) Error() string {
|
|
||||||
return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n "))
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
// Maintain a mapping of keys to structure field indexes
|
|
||||||
|
|
||||||
// The code in this section was copied from mgo/bson.
|
|
||||||
|
|
||||||
// structInfo holds details for the serialization of fields of
|
|
||||||
// a given struct.
|
|
||||||
type structInfo struct {
|
|
||||||
FieldsMap map[string]fieldInfo
|
|
||||||
FieldsList []fieldInfo
|
|
||||||
|
|
||||||
// InlineMap is the number of the field in the struct that
|
|
||||||
// contains an ,inline map, or -1 if there's none.
|
|
||||||
InlineMap int
|
|
||||||
}
|
|
||||||
|
|
||||||
type fieldInfo struct {
|
|
||||||
Key string
|
|
||||||
Num int
|
|
||||||
OmitEmpty bool
|
|
||||||
Flow bool
|
|
||||||
|
|
||||||
// Inline holds the field index if the field is part of an inlined struct.
|
|
||||||
Inline []int
|
|
||||||
}
|
|
||||||
|
|
||||||
var structMap = make(map[reflect.Type]*structInfo)
|
|
||||||
var fieldMapMutex sync.RWMutex
|
|
||||||
|
|
||||||
func getStructInfo(st reflect.Type) (*structInfo, error) {
|
|
||||||
fieldMapMutex.RLock()
|
|
||||||
sinfo, found := structMap[st]
|
|
||||||
fieldMapMutex.RUnlock()
|
|
||||||
if found {
|
|
||||||
return sinfo, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
n := st.NumField()
|
|
||||||
fieldsMap := make(map[string]fieldInfo)
|
|
||||||
fieldsList := make([]fieldInfo, 0, n)
|
|
||||||
inlineMap := -1
|
|
||||||
for i := 0; i != n; i++ {
|
|
||||||
field := st.Field(i)
|
|
||||||
if field.PkgPath != "" && !field.Anonymous {
|
|
||||||
continue // Private field
|
|
||||||
}
|
|
||||||
|
|
||||||
info := fieldInfo{Num: i}
|
|
||||||
|
|
||||||
tag := field.Tag.Get("yaml")
|
|
||||||
if tag == "" && strings.Index(string(field.Tag), ":") < 0 {
|
|
||||||
tag = string(field.Tag)
|
|
||||||
}
|
|
||||||
if tag == "-" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
inline := false
|
|
||||||
fields := strings.Split(tag, ",")
|
|
||||||
if len(fields) > 1 {
|
|
||||||
for _, flag := range fields[1:] {
|
|
||||||
switch flag {
|
|
||||||
case "omitempty":
|
|
||||||
info.OmitEmpty = true
|
|
||||||
case "flow":
|
|
||||||
info.Flow = true
|
|
||||||
case "inline":
|
|
||||||
inline = true
|
|
||||||
default:
|
|
||||||
return nil, errors.New(fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tag = fields[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
if inline {
|
|
||||||
switch field.Type.Kind() {
|
|
||||||
case reflect.Map:
|
|
||||||
if inlineMap >= 0 {
|
|
||||||
return nil, errors.New("Multiple ,inline maps in struct " + st.String())
|
|
||||||
}
|
|
||||||
if field.Type.Key() != reflect.TypeOf("") {
|
|
||||||
return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String())
|
|
||||||
}
|
|
||||||
inlineMap = info.Num
|
|
||||||
case reflect.Struct:
|
|
||||||
sinfo, err := getStructInfo(field.Type)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, finfo := range sinfo.FieldsList {
|
|
||||||
if _, found := fieldsMap[finfo.Key]; found {
|
|
||||||
msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String()
|
|
||||||
return nil, errors.New(msg)
|
|
||||||
}
|
|
||||||
if finfo.Inline == nil {
|
|
||||||
finfo.Inline = []int{i, finfo.Num}
|
|
||||||
} else {
|
|
||||||
finfo.Inline = append([]int{i}, finfo.Inline...)
|
|
||||||
}
|
|
||||||
fieldsMap[finfo.Key] = finfo
|
|
||||||
fieldsList = append(fieldsList, finfo)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
//return nil, errors.New("Option ,inline needs a struct value or map field")
|
|
||||||
return nil, errors.New("Option ,inline needs a struct value field")
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if tag != "" {
|
|
||||||
info.Key = tag
|
|
||||||
} else {
|
|
||||||
info.Key = strings.ToLower(field.Name)
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, found = fieldsMap[info.Key]; found {
|
|
||||||
msg := "Duplicated key '" + info.Key + "' in struct " + st.String()
|
|
||||||
return nil, errors.New(msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldsList = append(fieldsList, info)
|
|
||||||
fieldsMap[info.Key] = info
|
|
||||||
}
|
|
||||||
|
|
||||||
sinfo = &structInfo{fieldsMap, fieldsList, inlineMap}
|
|
||||||
|
|
||||||
fieldMapMutex.Lock()
|
|
||||||
structMap[st] = sinfo
|
|
||||||
fieldMapMutex.Unlock()
|
|
||||||
return sinfo, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func isZero(v reflect.Value) bool {
|
|
||||||
switch v.Kind() {
|
|
||||||
case reflect.String:
|
|
||||||
return len(v.String()) == 0
|
|
||||||
case reflect.Interface, reflect.Ptr:
|
|
||||||
return v.IsNil()
|
|
||||||
case reflect.Slice:
|
|
||||||
return v.Len() == 0
|
|
||||||
case reflect.Map:
|
|
||||||
return v.Len() == 0
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
return v.Int() == 0
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
return v.Float() == 0
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
||||||
return v.Uint() == 0
|
|
||||||
case reflect.Bool:
|
|
||||||
return !v.Bool()
|
|
||||||
case reflect.Struct:
|
|
||||||
vt := v.Type()
|
|
||||||
for i := v.NumField() - 1; i >= 0; i-- {
|
|
||||||
if vt.Field(i).PkgPath != "" {
|
|
||||||
continue // Private field
|
|
||||||
}
|
|
||||||
if !isZero(v.Field(i)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
716
vendor/github.com/go-yaml/yaml/yamlh.go
generated
vendored
716
vendor/github.com/go-yaml/yaml/yamlh.go
generated
vendored
@ -1,716 +0,0 @@
|
|||||||
package yaml
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
// The version directive data.
|
|
||||||
type yaml_version_directive_t struct {
|
|
||||||
major int8 // The major version number.
|
|
||||||
minor int8 // The minor version number.
|
|
||||||
}
|
|
||||||
|
|
||||||
// The tag directive data.
|
|
||||||
type yaml_tag_directive_t struct {
|
|
||||||
handle []byte // The tag handle.
|
|
||||||
prefix []byte // The tag prefix.
|
|
||||||
}
|
|
||||||
|
|
||||||
type yaml_encoding_t int
|
|
||||||
|
|
||||||
// The stream encoding.
|
|
||||||
const (
|
|
||||||
// Let the parser choose the encoding.
|
|
||||||
yaml_ANY_ENCODING yaml_encoding_t = iota
|
|
||||||
|
|
||||||
yaml_UTF8_ENCODING // The default UTF-8 encoding.
|
|
||||||
yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM.
|
|
||||||
yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM.
|
|
||||||
)
|
|
||||||
|
|
||||||
type yaml_break_t int
|
|
||||||
|
|
||||||
// Line break types.
|
|
||||||
const (
|
|
||||||
// Let the parser choose the break type.
|
|
||||||
yaml_ANY_BREAK yaml_break_t = iota
|
|
||||||
|
|
||||||
yaml_CR_BREAK // Use CR for line breaks (Mac style).
|
|
||||||
yaml_LN_BREAK // Use LN for line breaks (Unix style).
|
|
||||||
yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style).
|
|
||||||
)
|
|
||||||
|
|
||||||
type yaml_error_type_t int
|
|
||||||
|
|
||||||
// Many bad things could happen with the parser and emitter.
|
|
||||||
const (
|
|
||||||
// No error is produced.
|
|
||||||
yaml_NO_ERROR yaml_error_type_t = iota
|
|
||||||
|
|
||||||
yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory.
|
|
||||||
yaml_READER_ERROR // Cannot read or decode the input stream.
|
|
||||||
yaml_SCANNER_ERROR // Cannot scan the input stream.
|
|
||||||
yaml_PARSER_ERROR // Cannot parse the input stream.
|
|
||||||
yaml_COMPOSER_ERROR // Cannot compose a YAML document.
|
|
||||||
yaml_WRITER_ERROR // Cannot write to the output stream.
|
|
||||||
yaml_EMITTER_ERROR // Cannot emit a YAML stream.
|
|
||||||
)
|
|
||||||
|
|
||||||
// The pointer position.
|
|
||||||
type yaml_mark_t struct {
|
|
||||||
index int // The position index.
|
|
||||||
line int // The position line.
|
|
||||||
column int // The position column.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Node Styles
|
|
||||||
|
|
||||||
type yaml_style_t int8
|
|
||||||
|
|
||||||
type yaml_scalar_style_t yaml_style_t
|
|
||||||
|
|
||||||
// Scalar styles.
|
|
||||||
const (
|
|
||||||
// Let the emitter choose the style.
|
|
||||||
yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota
|
|
||||||
|
|
||||||
yaml_PLAIN_SCALAR_STYLE // The plain scalar style.
|
|
||||||
yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style.
|
|
||||||
yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style.
|
|
||||||
yaml_LITERAL_SCALAR_STYLE // The literal scalar style.
|
|
||||||
yaml_FOLDED_SCALAR_STYLE // The folded scalar style.
|
|
||||||
)
|
|
||||||
|
|
||||||
type yaml_sequence_style_t yaml_style_t
|
|
||||||
|
|
||||||
// Sequence styles.
|
|
||||||
const (
|
|
||||||
// Let the emitter choose the style.
|
|
||||||
yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota
|
|
||||||
|
|
||||||
yaml_BLOCK_SEQUENCE_STYLE // The block sequence style.
|
|
||||||
yaml_FLOW_SEQUENCE_STYLE // The flow sequence style.
|
|
||||||
)
|
|
||||||
|
|
||||||
type yaml_mapping_style_t yaml_style_t
|
|
||||||
|
|
||||||
// Mapping styles.
|
|
||||||
const (
|
|
||||||
// Let the emitter choose the style.
|
|
||||||
yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota
|
|
||||||
|
|
||||||
yaml_BLOCK_MAPPING_STYLE // The block mapping style.
|
|
||||||
yaml_FLOW_MAPPING_STYLE // The flow mapping style.
|
|
||||||
)
|
|
||||||
|
|
||||||
// Tokens
|
|
||||||
|
|
||||||
type yaml_token_type_t int
|
|
||||||
|
|
||||||
// Token types.
|
|
||||||
const (
|
|
||||||
// An empty token.
|
|
||||||
yaml_NO_TOKEN yaml_token_type_t = iota
|
|
||||||
|
|
||||||
yaml_STREAM_START_TOKEN // A STREAM-START token.
|
|
||||||
yaml_STREAM_END_TOKEN // A STREAM-END token.
|
|
||||||
|
|
||||||
yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token.
|
|
||||||
yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token.
|
|
||||||
yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token.
|
|
||||||
yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token.
|
|
||||||
|
|
||||||
yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token.
|
|
||||||
yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token.
|
|
||||||
yaml_BLOCK_END_TOKEN // A BLOCK-END token.
|
|
||||||
|
|
||||||
yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token.
|
|
||||||
yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token.
|
|
||||||
yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token.
|
|
||||||
yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token.
|
|
||||||
|
|
||||||
yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token.
|
|
||||||
yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token.
|
|
||||||
yaml_KEY_TOKEN // A KEY token.
|
|
||||||
yaml_VALUE_TOKEN // A VALUE token.
|
|
||||||
|
|
||||||
yaml_ALIAS_TOKEN // An ALIAS token.
|
|
||||||
yaml_ANCHOR_TOKEN // An ANCHOR token.
|
|
||||||
yaml_TAG_TOKEN // A TAG token.
|
|
||||||
yaml_SCALAR_TOKEN // A SCALAR token.
|
|
||||||
)
|
|
||||||
|
|
||||||
func (tt yaml_token_type_t) String() string {
|
|
||||||
switch tt {
|
|
||||||
case yaml_NO_TOKEN:
|
|
||||||
return "yaml_NO_TOKEN"
|
|
||||||
case yaml_STREAM_START_TOKEN:
|
|
||||||
return "yaml_STREAM_START_TOKEN"
|
|
||||||
case yaml_STREAM_END_TOKEN:
|
|
||||||
return "yaml_STREAM_END_TOKEN"
|
|
||||||
case yaml_VERSION_DIRECTIVE_TOKEN:
|
|
||||||
return "yaml_VERSION_DIRECTIVE_TOKEN"
|
|
||||||
case yaml_TAG_DIRECTIVE_TOKEN:
|
|
||||||
return "yaml_TAG_DIRECTIVE_TOKEN"
|
|
||||||
case yaml_DOCUMENT_START_TOKEN:
|
|
||||||
return "yaml_DOCUMENT_START_TOKEN"
|
|
||||||
case yaml_DOCUMENT_END_TOKEN:
|
|
||||||
return "yaml_DOCUMENT_END_TOKEN"
|
|
||||||
case yaml_BLOCK_SEQUENCE_START_TOKEN:
|
|
||||||
return "yaml_BLOCK_SEQUENCE_START_TOKEN"
|
|
||||||
case yaml_BLOCK_MAPPING_START_TOKEN:
|
|
||||||
return "yaml_BLOCK_MAPPING_START_TOKEN"
|
|
||||||
case yaml_BLOCK_END_TOKEN:
|
|
||||||
return "yaml_BLOCK_END_TOKEN"
|
|
||||||
case yaml_FLOW_SEQUENCE_START_TOKEN:
|
|
||||||
return "yaml_FLOW_SEQUENCE_START_TOKEN"
|
|
||||||
case yaml_FLOW_SEQUENCE_END_TOKEN:
|
|
||||||
return "yaml_FLOW_SEQUENCE_END_TOKEN"
|
|
||||||
case yaml_FLOW_MAPPING_START_TOKEN:
|
|
||||||
return "yaml_FLOW_MAPPING_START_TOKEN"
|
|
||||||
case yaml_FLOW_MAPPING_END_TOKEN:
|
|
||||||
return "yaml_FLOW_MAPPING_END_TOKEN"
|
|
||||||
case yaml_BLOCK_ENTRY_TOKEN:
|
|
||||||
return "yaml_BLOCK_ENTRY_TOKEN"
|
|
||||||
case yaml_FLOW_ENTRY_TOKEN:
|
|
||||||
return "yaml_FLOW_ENTRY_TOKEN"
|
|
||||||
case yaml_KEY_TOKEN:
|
|
||||||
return "yaml_KEY_TOKEN"
|
|
||||||
case yaml_VALUE_TOKEN:
|
|
||||||
return "yaml_VALUE_TOKEN"
|
|
||||||
case yaml_ALIAS_TOKEN:
|
|
||||||
return "yaml_ALIAS_TOKEN"
|
|
||||||
case yaml_ANCHOR_TOKEN:
|
|
||||||
return "yaml_ANCHOR_TOKEN"
|
|
||||||
case yaml_TAG_TOKEN:
|
|
||||||
return "yaml_TAG_TOKEN"
|
|
||||||
case yaml_SCALAR_TOKEN:
|
|
||||||
return "yaml_SCALAR_TOKEN"
|
|
||||||
}
|
|
||||||
return "<unknown token>"
|
|
||||||
}
|
|
||||||
|
|
||||||
// The token structure.
|
|
||||||
type yaml_token_t struct {
|
|
||||||
// The token type.
|
|
||||||
typ yaml_token_type_t
|
|
||||||
|
|
||||||
// The start/end of the token.
|
|
||||||
start_mark, end_mark yaml_mark_t
|
|
||||||
|
|
||||||
// The stream encoding (for yaml_STREAM_START_TOKEN).
|
|
||||||
encoding yaml_encoding_t
|
|
||||||
|
|
||||||
// The alias/anchor/scalar value or tag/tag directive handle
|
|
||||||
// (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN).
|
|
||||||
value []byte
|
|
||||||
|
|
||||||
// The tag suffix (for yaml_TAG_TOKEN).
|
|
||||||
suffix []byte
|
|
||||||
|
|
||||||
// The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN).
|
|
||||||
prefix []byte
|
|
||||||
|
|
||||||
// The scalar style (for yaml_SCALAR_TOKEN).
|
|
||||||
style yaml_scalar_style_t
|
|
||||||
|
|
||||||
// The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN).
|
|
||||||
major, minor int8
|
|
||||||
}
|
|
||||||
|
|
||||||
// Events
|
|
||||||
|
|
||||||
type yaml_event_type_t int8
|
|
||||||
|
|
||||||
// Event types.
|
|
||||||
const (
|
|
||||||
// An empty event.
|
|
||||||
yaml_NO_EVENT yaml_event_type_t = iota
|
|
||||||
|
|
||||||
yaml_STREAM_START_EVENT // A STREAM-START event.
|
|
||||||
yaml_STREAM_END_EVENT // A STREAM-END event.
|
|
||||||
yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event.
|
|
||||||
yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event.
|
|
||||||
yaml_ALIAS_EVENT // An ALIAS event.
|
|
||||||
yaml_SCALAR_EVENT // A SCALAR event.
|
|
||||||
yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event.
|
|
||||||
yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event.
|
|
||||||
yaml_MAPPING_START_EVENT // A MAPPING-START event.
|
|
||||||
yaml_MAPPING_END_EVENT // A MAPPING-END event.
|
|
||||||
)
|
|
||||||
|
|
||||||
// The event structure.
|
|
||||||
type yaml_event_t struct {
|
|
||||||
|
|
||||||
// The event type.
|
|
||||||
typ yaml_event_type_t
|
|
||||||
|
|
||||||
// The start and end of the event.
|
|
||||||
start_mark, end_mark yaml_mark_t
|
|
||||||
|
|
||||||
// The document encoding (for yaml_STREAM_START_EVENT).
|
|
||||||
encoding yaml_encoding_t
|
|
||||||
|
|
||||||
// The version directive (for yaml_DOCUMENT_START_EVENT).
|
|
||||||
version_directive *yaml_version_directive_t
|
|
||||||
|
|
||||||
// The list of tag directives (for yaml_DOCUMENT_START_EVENT).
|
|
||||||
tag_directives []yaml_tag_directive_t
|
|
||||||
|
|
||||||
// The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT).
|
|
||||||
anchor []byte
|
|
||||||
|
|
||||||
// The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
|
|
||||||
tag []byte
|
|
||||||
|
|
||||||
// The scalar value (for yaml_SCALAR_EVENT).
|
|
||||||
value []byte
|
|
||||||
|
|
||||||
// Is the document start/end indicator implicit, or the tag optional?
|
|
||||||
// (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT).
|
|
||||||
implicit bool
|
|
||||||
|
|
||||||
// Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT).
|
|
||||||
quoted_implicit bool
|
|
||||||
|
|
||||||
// The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
|
|
||||||
style yaml_style_t
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) }
|
|
||||||
func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) }
|
|
||||||
func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) }
|
|
||||||
|
|
||||||
// Nodes
|
|
||||||
|
|
||||||
const (
|
|
||||||
yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null.
|
|
||||||
yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false.
|
|
||||||
yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values.
|
|
||||||
yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values.
|
|
||||||
yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values.
|
|
||||||
yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values.
|
|
||||||
|
|
||||||
yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences.
|
|
||||||
yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping.
|
|
||||||
|
|
||||||
// Not in original libyaml.
|
|
||||||
yaml_BINARY_TAG = "tag:yaml.org,2002:binary"
|
|
||||||
yaml_MERGE_TAG = "tag:yaml.org,2002:merge"
|
|
||||||
|
|
||||||
yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str.
|
|
||||||
yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq.
|
|
||||||
yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map.
|
|
||||||
)
|
|
||||||
|
|
||||||
type yaml_node_type_t int
|
|
||||||
|
|
||||||
// Node types.
|
|
||||||
const (
|
|
||||||
// An empty node.
|
|
||||||
yaml_NO_NODE yaml_node_type_t = iota
|
|
||||||
|
|
||||||
yaml_SCALAR_NODE // A scalar node.
|
|
||||||
yaml_SEQUENCE_NODE // A sequence node.
|
|
||||||
yaml_MAPPING_NODE // A mapping node.
|
|
||||||
)
|
|
||||||
|
|
||||||
// An element of a sequence node.
|
|
||||||
type yaml_node_item_t int
|
|
||||||
|
|
||||||
// An element of a mapping node.
|
|
||||||
type yaml_node_pair_t struct {
|
|
||||||
key int // The key of the element.
|
|
||||||
value int // The value of the element.
|
|
||||||
}
|
|
||||||
|
|
||||||
// The node structure.
|
|
||||||
type yaml_node_t struct {
|
|
||||||
typ yaml_node_type_t // The node type.
|
|
||||||
tag []byte // The node tag.
|
|
||||||
|
|
||||||
// The node data.
|
|
||||||
|
|
||||||
// The scalar parameters (for yaml_SCALAR_NODE).
|
|
||||||
scalar struct {
|
|
||||||
value []byte // The scalar value.
|
|
||||||
length int // The length of the scalar value.
|
|
||||||
style yaml_scalar_style_t // The scalar style.
|
|
||||||
}
|
|
||||||
|
|
||||||
// The sequence parameters (for YAML_SEQUENCE_NODE).
|
|
||||||
sequence struct {
|
|
||||||
items_data []yaml_node_item_t // The stack of sequence items.
|
|
||||||
style yaml_sequence_style_t // The sequence style.
|
|
||||||
}
|
|
||||||
|
|
||||||
// The mapping parameters (for yaml_MAPPING_NODE).
|
|
||||||
mapping struct {
|
|
||||||
pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value).
|
|
||||||
pairs_start *yaml_node_pair_t // The beginning of the stack.
|
|
||||||
pairs_end *yaml_node_pair_t // The end of the stack.
|
|
||||||
pairs_top *yaml_node_pair_t // The top of the stack.
|
|
||||||
style yaml_mapping_style_t // The mapping style.
|
|
||||||
}
|
|
||||||
|
|
||||||
start_mark yaml_mark_t // The beginning of the node.
|
|
||||||
end_mark yaml_mark_t // The end of the node.
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// The document structure.
|
|
||||||
type yaml_document_t struct {
|
|
||||||
|
|
||||||
// The document nodes.
|
|
||||||
nodes []yaml_node_t
|
|
||||||
|
|
||||||
// The version directive.
|
|
||||||
version_directive *yaml_version_directive_t
|
|
||||||
|
|
||||||
// The list of tag directives.
|
|
||||||
tag_directives_data []yaml_tag_directive_t
|
|
||||||
tag_directives_start int // The beginning of the tag directives list.
|
|
||||||
tag_directives_end int // The end of the tag directives list.
|
|
||||||
|
|
||||||
start_implicit int // Is the document start indicator implicit?
|
|
||||||
end_implicit int // Is the document end indicator implicit?
|
|
||||||
|
|
||||||
// The start/end of the document.
|
|
||||||
start_mark, end_mark yaml_mark_t
|
|
||||||
}
|
|
||||||
|
|
||||||
// The prototype of a read handler.
|
|
||||||
//
|
|
||||||
// The read handler is called when the parser needs to read more bytes from the
|
|
||||||
// source. The handler should write not more than size bytes to the buffer.
|
|
||||||
// The number of written bytes should be set to the size_read variable.
|
|
||||||
//
|
|
||||||
// [in,out] data A pointer to an application data specified by
|
|
||||||
// yaml_parser_set_input().
|
|
||||||
// [out] buffer The buffer to write the data from the source.
|
|
||||||
// [in] size The size of the buffer.
|
|
||||||
// [out] size_read The actual number of bytes read from the source.
|
|
||||||
//
|
|
||||||
// On success, the handler should return 1. If the handler failed,
|
|
||||||
// the returned value should be 0. On EOF, the handler should set the
|
|
||||||
// size_read to 0 and return 1.
|
|
||||||
type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error)
|
|
||||||
|
|
||||||
// This structure holds information about a potential simple key.
|
|
||||||
type yaml_simple_key_t struct {
|
|
||||||
possible bool // Is a simple key possible?
|
|
||||||
required bool // Is a simple key required?
|
|
||||||
token_number int // The number of the token.
|
|
||||||
mark yaml_mark_t // The position mark.
|
|
||||||
}
|
|
||||||
|
|
||||||
// The states of the parser.
|
|
||||||
type yaml_parser_state_t int
|
|
||||||
|
|
||||||
const (
|
|
||||||
yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota
|
|
||||||
|
|
||||||
yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document.
|
|
||||||
yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START.
|
|
||||||
yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document.
|
|
||||||
yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END.
|
|
||||||
yaml_PARSE_BLOCK_NODE_STATE // Expect a block node.
|
|
||||||
yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence.
|
|
||||||
yaml_PARSE_FLOW_NODE_STATE // Expect a flow node.
|
|
||||||
yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence.
|
|
||||||
yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence.
|
|
||||||
yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence.
|
|
||||||
yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping.
|
|
||||||
yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key.
|
|
||||||
yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value.
|
|
||||||
yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence.
|
|
||||||
yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence.
|
|
||||||
yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping.
|
|
||||||
yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping.
|
|
||||||
yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry.
|
|
||||||
yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping.
|
|
||||||
yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping.
|
|
||||||
yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping.
|
|
||||||
yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping.
|
|
||||||
yaml_PARSE_END_STATE // Expect nothing.
|
|
||||||
)
|
|
||||||
|
|
||||||
func (ps yaml_parser_state_t) String() string {
|
|
||||||
switch ps {
|
|
||||||
case yaml_PARSE_STREAM_START_STATE:
|
|
||||||
return "yaml_PARSE_STREAM_START_STATE"
|
|
||||||
case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
|
|
||||||
return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE"
|
|
||||||
case yaml_PARSE_DOCUMENT_START_STATE:
|
|
||||||
return "yaml_PARSE_DOCUMENT_START_STATE"
|
|
||||||
case yaml_PARSE_DOCUMENT_CONTENT_STATE:
|
|
||||||
return "yaml_PARSE_DOCUMENT_CONTENT_STATE"
|
|
||||||
case yaml_PARSE_DOCUMENT_END_STATE:
|
|
||||||
return "yaml_PARSE_DOCUMENT_END_STATE"
|
|
||||||
case yaml_PARSE_BLOCK_NODE_STATE:
|
|
||||||
return "yaml_PARSE_BLOCK_NODE_STATE"
|
|
||||||
case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
|
|
||||||
return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE"
|
|
||||||
case yaml_PARSE_FLOW_NODE_STATE:
|
|
||||||
return "yaml_PARSE_FLOW_NODE_STATE"
|
|
||||||
case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
|
|
||||||
return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE"
|
|
||||||
case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
|
|
||||||
return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE"
|
|
||||||
case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
|
|
||||||
return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE"
|
|
||||||
case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
|
|
||||||
return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE"
|
|
||||||
case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
|
|
||||||
return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE"
|
|
||||||
case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
|
|
||||||
return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE"
|
|
||||||
case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
|
|
||||||
return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE"
|
|
||||||
case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
|
|
||||||
return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE"
|
|
||||||
case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
|
|
||||||
return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE"
|
|
||||||
case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
|
|
||||||
return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE"
|
|
||||||
case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
|
|
||||||
return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE"
|
|
||||||
case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
|
|
||||||
return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE"
|
|
||||||
case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
|
|
||||||
return "yaml_PARSE_FLOW_MAPPING_KEY_STATE"
|
|
||||||
case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
|
|
||||||
return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE"
|
|
||||||
case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
|
|
||||||
return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE"
|
|
||||||
case yaml_PARSE_END_STATE:
|
|
||||||
return "yaml_PARSE_END_STATE"
|
|
||||||
}
|
|
||||||
return "<unknown parser state>"
|
|
||||||
}
|
|
||||||
|
|
||||||
// This structure holds aliases data.
|
|
||||||
type yaml_alias_data_t struct {
|
|
||||||
anchor []byte // The anchor.
|
|
||||||
index int // The node id.
|
|
||||||
mark yaml_mark_t // The anchor mark.
|
|
||||||
}
|
|
||||||
|
|
||||||
// The parser structure.
|
|
||||||
//
|
|
||||||
// All members are internal. Manage the structure using the
|
|
||||||
// yaml_parser_ family of functions.
|
|
||||||
type yaml_parser_t struct {
|
|
||||||
|
|
||||||
// Error handling
|
|
||||||
|
|
||||||
error yaml_error_type_t // Error type.
|
|
||||||
|
|
||||||
problem string // Error description.
|
|
||||||
|
|
||||||
// The byte about which the problem occured.
|
|
||||||
problem_offset int
|
|
||||||
problem_value int
|
|
||||||
problem_mark yaml_mark_t
|
|
||||||
|
|
||||||
// The error context.
|
|
||||||
context string
|
|
||||||
context_mark yaml_mark_t
|
|
||||||
|
|
||||||
// Reader stuff
|
|
||||||
|
|
||||||
read_handler yaml_read_handler_t // Read handler.
|
|
||||||
|
|
||||||
input_file io.Reader // File input data.
|
|
||||||
input []byte // String input data.
|
|
||||||
input_pos int
|
|
||||||
|
|
||||||
eof bool // EOF flag
|
|
||||||
|
|
||||||
buffer []byte // The working buffer.
|
|
||||||
buffer_pos int // The current position of the buffer.
|
|
||||||
|
|
||||||
unread int // The number of unread characters in the buffer.
|
|
||||||
|
|
||||||
raw_buffer []byte // The raw buffer.
|
|
||||||
raw_buffer_pos int // The current position of the buffer.
|
|
||||||
|
|
||||||
encoding yaml_encoding_t // The input encoding.
|
|
||||||
|
|
||||||
offset int // The offset of the current position (in bytes).
|
|
||||||
mark yaml_mark_t // The mark of the current position.
|
|
||||||
|
|
||||||
// Scanner stuff
|
|
||||||
|
|
||||||
stream_start_produced bool // Have we started to scan the input stream?
|
|
||||||
stream_end_produced bool // Have we reached the end of the input stream?
|
|
||||||
|
|
||||||
flow_level int // The number of unclosed '[' and '{' indicators.
|
|
||||||
|
|
||||||
tokens []yaml_token_t // The tokens queue.
|
|
||||||
tokens_head int // The head of the tokens queue.
|
|
||||||
tokens_parsed int // The number of tokens fetched from the queue.
|
|
||||||
token_available bool // Does the tokens queue contain a token ready for dequeueing.
|
|
||||||
|
|
||||||
indent int // The current indentation level.
|
|
||||||
indents []int // The indentation levels stack.
|
|
||||||
|
|
||||||
simple_key_allowed bool // May a simple key occur at the current position?
|
|
||||||
simple_keys []yaml_simple_key_t // The stack of simple keys.
|
|
||||||
|
|
||||||
// Parser stuff
|
|
||||||
|
|
||||||
state yaml_parser_state_t // The current parser state.
|
|
||||||
states []yaml_parser_state_t // The parser states stack.
|
|
||||||
marks []yaml_mark_t // The stack of marks.
|
|
||||||
tag_directives []yaml_tag_directive_t // The list of TAG directives.
|
|
||||||
|
|
||||||
// Dumper stuff
|
|
||||||
|
|
||||||
aliases []yaml_alias_data_t // The alias data.
|
|
||||||
|
|
||||||
document *yaml_document_t // The currently parsed document.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Emitter Definitions
|
|
||||||
|
|
||||||
// The prototype of a write handler.
|
|
||||||
//
|
|
||||||
// The write handler is called when the emitter needs to flush the accumulated
|
|
||||||
// characters to the output. The handler should write @a size bytes of the
|
|
||||||
// @a buffer to the output.
|
|
||||||
//
|
|
||||||
// @param[in,out] data A pointer to an application data specified by
|
|
||||||
// yaml_emitter_set_output().
|
|
||||||
// @param[in] buffer The buffer with bytes to be written.
|
|
||||||
// @param[in] size The size of the buffer.
|
|
||||||
//
|
|
||||||
// @returns On success, the handler should return @c 1. If the handler failed,
|
|
||||||
// the returned value should be @c 0.
|
|
||||||
//
|
|
||||||
type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error
|
|
||||||
|
|
||||||
type yaml_emitter_state_t int
|
|
||||||
|
|
||||||
// The emitter states.
|
|
||||||
const (
|
|
||||||
// Expect STREAM-START.
|
|
||||||
yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota
|
|
||||||
|
|
||||||
yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END.
|
|
||||||
yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END.
|
|
||||||
yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document.
|
|
||||||
yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END.
|
|
||||||
yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence.
|
|
||||||
yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence.
|
|
||||||
yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping.
|
|
||||||
yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping.
|
|
||||||
yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping.
|
|
||||||
yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping.
|
|
||||||
yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence.
|
|
||||||
yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence.
|
|
||||||
yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping.
|
|
||||||
yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping.
|
|
||||||
yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping.
|
|
||||||
yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping.
|
|
||||||
yaml_EMIT_END_STATE // Expect nothing.
|
|
||||||
)
|
|
||||||
|
|
||||||
// The emitter structure.
|
|
||||||
//
|
|
||||||
// All members are internal. Manage the structure using the @c yaml_emitter_
|
|
||||||
// family of functions.
|
|
||||||
type yaml_emitter_t struct {
|
|
||||||
|
|
||||||
// Error handling
|
|
||||||
|
|
||||||
error yaml_error_type_t // Error type.
|
|
||||||
problem string // Error description.
|
|
||||||
|
|
||||||
// Writer stuff
|
|
||||||
|
|
||||||
write_handler yaml_write_handler_t // Write handler.
|
|
||||||
|
|
||||||
output_buffer *[]byte // String output data.
|
|
||||||
output_file io.Writer // File output data.
|
|
||||||
|
|
||||||
buffer []byte // The working buffer.
|
|
||||||
buffer_pos int // The current position of the buffer.
|
|
||||||
|
|
||||||
raw_buffer []byte // The raw buffer.
|
|
||||||
raw_buffer_pos int // The current position of the buffer.
|
|
||||||
|
|
||||||
encoding yaml_encoding_t // The stream encoding.
|
|
||||||
|
|
||||||
// Emitter stuff
|
|
||||||
|
|
||||||
canonical bool // If the output is in the canonical style?
|
|
||||||
best_indent int // The number of indentation spaces.
|
|
||||||
best_width int // The preferred width of the output lines.
|
|
||||||
unicode bool // Allow unescaped non-ASCII characters?
|
|
||||||
line_break yaml_break_t // The preferred line break.
|
|
||||||
|
|
||||||
state yaml_emitter_state_t // The current emitter state.
|
|
||||||
states []yaml_emitter_state_t // The stack of states.
|
|
||||||
|
|
||||||
events []yaml_event_t // The event queue.
|
|
||||||
events_head int // The head of the event queue.
|
|
||||||
|
|
||||||
indents []int // The stack of indentation levels.
|
|
||||||
|
|
||||||
tag_directives []yaml_tag_directive_t // The list of tag directives.
|
|
||||||
|
|
||||||
indent int // The current indentation level.
|
|
||||||
|
|
||||||
flow_level int // The current flow level.
|
|
||||||
|
|
||||||
root_context bool // Is it the document root context?
|
|
||||||
sequence_context bool // Is it a sequence context?
|
|
||||||
mapping_context bool // Is it a mapping context?
|
|
||||||
simple_key_context bool // Is it a simple mapping key context?
|
|
||||||
|
|
||||||
line int // The current line.
|
|
||||||
column int // The current column.
|
|
||||||
whitespace bool // If the last character was a whitespace?
|
|
||||||
indention bool // If the last character was an indentation character (' ', '-', '?', ':')?
|
|
||||||
open_ended bool // If an explicit document end is required?
|
|
||||||
|
|
||||||
// Anchor analysis.
|
|
||||||
anchor_data struct {
|
|
||||||
anchor []byte // The anchor value.
|
|
||||||
alias bool // Is it an alias?
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tag analysis.
|
|
||||||
tag_data struct {
|
|
||||||
handle []byte // The tag handle.
|
|
||||||
suffix []byte // The tag suffix.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scalar analysis.
|
|
||||||
scalar_data struct {
|
|
||||||
value []byte // The scalar value.
|
|
||||||
multiline bool // Does the scalar contain line breaks?
|
|
||||||
flow_plain_allowed bool // Can the scalar be expessed in the flow plain style?
|
|
||||||
block_plain_allowed bool // Can the scalar be expressed in the block plain style?
|
|
||||||
single_quoted_allowed bool // Can the scalar be expressed in the single quoted style?
|
|
||||||
block_allowed bool // Can the scalar be expressed in the literal or folded styles?
|
|
||||||
style yaml_scalar_style_t // The output style.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dumper stuff
|
|
||||||
|
|
||||||
opened bool // If the stream was already opened?
|
|
||||||
closed bool // If the stream was already closed?
|
|
||||||
|
|
||||||
// The information associated with the document nodes.
|
|
||||||
anchors *struct {
|
|
||||||
references int // The number of references.
|
|
||||||
anchor int // The anchor id.
|
|
||||||
serialized bool // If the node has been emitted?
|
|
||||||
}
|
|
||||||
|
|
||||||
last_anchor_id int // The last assigned anchor id.
|
|
||||||
|
|
||||||
document *yaml_document_t // The currently emitted document.
|
|
||||||
}
|
|
173
vendor/github.com/go-yaml/yaml/yamlprivateh.go
generated
vendored
173
vendor/github.com/go-yaml/yaml/yamlprivateh.go
generated
vendored
@ -1,173 +0,0 @@
|
|||||||
package yaml
|
|
||||||
|
|
||||||
const (
|
|
||||||
// The size of the input raw buffer.
|
|
||||||
input_raw_buffer_size = 512
|
|
||||||
|
|
||||||
// The size of the input buffer.
|
|
||||||
// It should be possible to decode the whole raw buffer.
|
|
||||||
input_buffer_size = input_raw_buffer_size * 3
|
|
||||||
|
|
||||||
// The size of the output buffer.
|
|
||||||
output_buffer_size = 128
|
|
||||||
|
|
||||||
// The size of the output raw buffer.
|
|
||||||
// It should be possible to encode the whole output buffer.
|
|
||||||
output_raw_buffer_size = (output_buffer_size*2 + 2)
|
|
||||||
|
|
||||||
// The size of other stacks and queues.
|
|
||||||
initial_stack_size = 16
|
|
||||||
initial_queue_size = 16
|
|
||||||
initial_string_size = 16
|
|
||||||
)
|
|
||||||
|
|
||||||
// Check if the character at the specified position is an alphabetical
|
|
||||||
// character, a digit, '_', or '-'.
|
|
||||||
func is_alpha(b []byte, i int) bool {
|
|
||||||
return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character at the specified position is a digit.
|
|
||||||
func is_digit(b []byte, i int) bool {
|
|
||||||
return b[i] >= '0' && b[i] <= '9'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the value of a digit.
|
|
||||||
func as_digit(b []byte, i int) int {
|
|
||||||
return int(b[i]) - '0'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character at the specified position is a hex-digit.
|
|
||||||
func is_hex(b []byte, i int) bool {
|
|
||||||
return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the value of a hex-digit.
|
|
||||||
func as_hex(b []byte, i int) int {
|
|
||||||
bi := b[i]
|
|
||||||
if bi >= 'A' && bi <= 'F' {
|
|
||||||
return int(bi) - 'A' + 10
|
|
||||||
}
|
|
||||||
if bi >= 'a' && bi <= 'f' {
|
|
||||||
return int(bi) - 'a' + 10
|
|
||||||
}
|
|
||||||
return int(bi) - '0'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character is ASCII.
|
|
||||||
func is_ascii(b []byte, i int) bool {
|
|
||||||
return b[i] <= 0x7F
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character at the start of the buffer can be printed unescaped.
|
|
||||||
func is_printable(b []byte, i int) bool {
|
|
||||||
return ((b[i] == 0x0A) || // . == #x0A
|
|
||||||
(b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E
|
|
||||||
(b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF
|
|
||||||
(b[i] > 0xC2 && b[i] < 0xED) ||
|
|
||||||
(b[i] == 0xED && b[i+1] < 0xA0) ||
|
|
||||||
(b[i] == 0xEE) ||
|
|
||||||
(b[i] == 0xEF && // #xE000 <= . <= #xFFFD
|
|
||||||
!(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF
|
|
||||||
!(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF))))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character at the specified position is NUL.
|
|
||||||
func is_z(b []byte, i int) bool {
|
|
||||||
return b[i] == 0x00
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the beginning of the buffer is a BOM.
|
|
||||||
func is_bom(b []byte, i int) bool {
|
|
||||||
return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character at the specified position is space.
|
|
||||||
func is_space(b []byte, i int) bool {
|
|
||||||
return b[i] == ' '
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character at the specified position is tab.
|
|
||||||
func is_tab(b []byte, i int) bool {
|
|
||||||
return b[i] == '\t'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character at the specified position is blank (space or tab).
|
|
||||||
func is_blank(b []byte, i int) bool {
|
|
||||||
//return is_space(b, i) || is_tab(b, i)
|
|
||||||
return b[i] == ' ' || b[i] == '\t'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character at the specified position is a line break.
|
|
||||||
func is_break(b []byte, i int) bool {
|
|
||||||
return (b[i] == '\r' || // CR (#xD)
|
|
||||||
b[i] == '\n' || // LF (#xA)
|
|
||||||
b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
|
|
||||||
b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
|
|
||||||
b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029)
|
|
||||||
}
|
|
||||||
|
|
||||||
func is_crlf(b []byte, i int) bool {
|
|
||||||
return b[i] == '\r' && b[i+1] == '\n'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character is a line break or NUL.
|
|
||||||
func is_breakz(b []byte, i int) bool {
|
|
||||||
//return is_break(b, i) || is_z(b, i)
|
|
||||||
return ( // is_break:
|
|
||||||
b[i] == '\r' || // CR (#xD)
|
|
||||||
b[i] == '\n' || // LF (#xA)
|
|
||||||
b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
|
|
||||||
b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
|
|
||||||
b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
|
|
||||||
// is_z:
|
|
||||||
b[i] == 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character is a line break, space, or NUL.
|
|
||||||
func is_spacez(b []byte, i int) bool {
|
|
||||||
//return is_space(b, i) || is_breakz(b, i)
|
|
||||||
return ( // is_space:
|
|
||||||
b[i] == ' ' ||
|
|
||||||
// is_breakz:
|
|
||||||
b[i] == '\r' || // CR (#xD)
|
|
||||||
b[i] == '\n' || // LF (#xA)
|
|
||||||
b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
|
|
||||||
b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
|
|
||||||
b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
|
|
||||||
b[i] == 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the character is a line break, space, tab, or NUL.
|
|
||||||
func is_blankz(b []byte, i int) bool {
|
|
||||||
//return is_blank(b, i) || is_breakz(b, i)
|
|
||||||
return ( // is_blank:
|
|
||||||
b[i] == ' ' || b[i] == '\t' ||
|
|
||||||
// is_breakz:
|
|
||||||
b[i] == '\r' || // CR (#xD)
|
|
||||||
b[i] == '\n' || // LF (#xA)
|
|
||||||
b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
|
|
||||||
b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
|
|
||||||
b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
|
|
||||||
b[i] == 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine the width of the character.
|
|
||||||
func width(b byte) int {
|
|
||||||
// Don't replace these by a switch without first
|
|
||||||
// confirming that it is being inlined.
|
|
||||||
if b&0x80 == 0x00 {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
if b&0xE0 == 0xC0 {
|
|
||||||
return 2
|
|
||||||
}
|
|
||||||
if b&0xF0 == 0xE0 {
|
|
||||||
return 3
|
|
||||||
}
|
|
||||||
if b&0xF8 == 0xF0 {
|
|
||||||
return 4
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
|
|
||||||
}
|
|
341
vendor/github.com/google/go-github/LICENSE
generated
vendored
341
vendor/github.com/google/go-github/LICENSE
generated
vendored
@ -1,341 +0,0 @@
|
|||||||
Copyright (c) 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following disclaimer
|
|
||||||
in the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
* Neither the name of Google Inc. nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
----------
|
|
||||||
|
|
||||||
Some documentation is taken from the GitHub Developer site
|
|
||||||
<https://developer.github.com/>, which is available under the following Creative
|
|
||||||
Commons Attribution 3.0 License. This applies only to the go-github source
|
|
||||||
code and would not apply to any compiled binaries.
|
|
||||||
|
|
||||||
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
|
|
||||||
COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
|
|
||||||
COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
|
|
||||||
AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
|
|
||||||
|
|
||||||
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
|
|
||||||
TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
|
|
||||||
BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
|
|
||||||
CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
|
|
||||||
CONDITIONS.
|
|
||||||
|
|
||||||
1. Definitions
|
|
||||||
|
|
||||||
a. "Adaptation" means a work based upon the Work, or upon the Work and
|
|
||||||
other pre-existing works, such as a translation, adaptation,
|
|
||||||
derivative work, arrangement of music or other alterations of a
|
|
||||||
literary or artistic work, or phonogram or performance and includes
|
|
||||||
cinematographic adaptations or any other form in which the Work may be
|
|
||||||
recast, transformed, or adapted including in any form recognizably
|
|
||||||
derived from the original, except that a work that constitutes a
|
|
||||||
Collection will not be considered an Adaptation for the purpose of
|
|
||||||
this License. For the avoidance of doubt, where the Work is a musical
|
|
||||||
work, performance or phonogram, the synchronization of the Work in
|
|
||||||
timed-relation with a moving image ("synching") will be considered an
|
|
||||||
Adaptation for the purpose of this License.
|
|
||||||
b. "Collection" means a collection of literary or artistic works, such as
|
|
||||||
encyclopedias and anthologies, or performances, phonograms or
|
|
||||||
broadcasts, or other works or subject matter other than works listed
|
|
||||||
in Section 1(f) below, which, by reason of the selection and
|
|
||||||
arrangement of their contents, constitute intellectual creations, in
|
|
||||||
which the Work is included in its entirety in unmodified form along
|
|
||||||
with one or more other contributions, each constituting separate and
|
|
||||||
independent works in themselves, which together are assembled into a
|
|
||||||
collective whole. A work that constitutes a Collection will not be
|
|
||||||
considered an Adaptation (as defined above) for the purposes of this
|
|
||||||
License.
|
|
||||||
c. "Distribute" means to make available to the public the original and
|
|
||||||
copies of the Work or Adaptation, as appropriate, through sale or
|
|
||||||
other transfer of ownership.
|
|
||||||
d. "Licensor" means the individual, individuals, entity or entities that
|
|
||||||
offer(s) the Work under the terms of this License.
|
|
||||||
e. "Original Author" means, in the case of a literary or artistic work,
|
|
||||||
the individual, individuals, entity or entities who created the Work
|
|
||||||
or if no individual or entity can be identified, the publisher; and in
|
|
||||||
addition (i) in the case of a performance the actors, singers,
|
|
||||||
musicians, dancers, and other persons who act, sing, deliver, declaim,
|
|
||||||
play in, interpret or otherwise perform literary or artistic works or
|
|
||||||
expressions of folklore; (ii) in the case of a phonogram the producer
|
|
||||||
being the person or legal entity who first fixes the sounds of a
|
|
||||||
performance or other sounds; and, (iii) in the case of broadcasts, the
|
|
||||||
organization that transmits the broadcast.
|
|
||||||
f. "Work" means the literary and/or artistic work offered under the terms
|
|
||||||
of this License including without limitation any production in the
|
|
||||||
literary, scientific and artistic domain, whatever may be the mode or
|
|
||||||
form of its expression including digital form, such as a book,
|
|
||||||
pamphlet and other writing; a lecture, address, sermon or other work
|
|
||||||
of the same nature; a dramatic or dramatico-musical work; a
|
|
||||||
choreographic work or entertainment in dumb show; a musical
|
|
||||||
composition with or without words; a cinematographic work to which are
|
|
||||||
assimilated works expressed by a process analogous to cinematography;
|
|
||||||
a work of drawing, painting, architecture, sculpture, engraving or
|
|
||||||
lithography; a photographic work to which are assimilated works
|
|
||||||
expressed by a process analogous to photography; a work of applied
|
|
||||||
art; an illustration, map, plan, sketch or three-dimensional work
|
|
||||||
relative to geography, topography, architecture or science; a
|
|
||||||
performance; a broadcast; a phonogram; a compilation of data to the
|
|
||||||
extent it is protected as a copyrightable work; or a work performed by
|
|
||||||
a variety or circus performer to the extent it is not otherwise
|
|
||||||
considered a literary or artistic work.
|
|
||||||
g. "You" means an individual or entity exercising rights under this
|
|
||||||
License who has not previously violated the terms of this License with
|
|
||||||
respect to the Work, or who has received express permission from the
|
|
||||||
Licensor to exercise rights under this License despite a previous
|
|
||||||
violation.
|
|
||||||
h. "Publicly Perform" means to perform public recitations of the Work and
|
|
||||||
to communicate to the public those public recitations, by any means or
|
|
||||||
process, including by wire or wireless means or public digital
|
|
||||||
performances; to make available to the public Works in such a way that
|
|
||||||
members of the public may access these Works from a place and at a
|
|
||||||
place individually chosen by them; to perform the Work to the public
|
|
||||||
by any means or process and the communication to the public of the
|
|
||||||
performances of the Work, including by public digital performance; to
|
|
||||||
broadcast and rebroadcast the Work by any means including signs,
|
|
||||||
sounds or images.
|
|
||||||
i. "Reproduce" means to make copies of the Work by any means including
|
|
||||||
without limitation by sound or visual recordings and the right of
|
|
||||||
fixation and reproducing fixations of the Work, including storage of a
|
|
||||||
protected performance or phonogram in digital form or other electronic
|
|
||||||
medium.
|
|
||||||
|
|
||||||
2. Fair Dealing Rights. Nothing in this License is intended to reduce,
|
|
||||||
limit, or restrict any uses free from copyright or rights arising from
|
|
||||||
limitations or exceptions that are provided for in connection with the
|
|
||||||
copyright protection under copyright law or other applicable laws.
|
|
||||||
|
|
||||||
3. License Grant. Subject to the terms and conditions of this License,
|
|
||||||
Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
|
|
||||||
perpetual (for the duration of the applicable copyright) license to
|
|
||||||
exercise the rights in the Work as stated below:
|
|
||||||
|
|
||||||
a. to Reproduce the Work, to incorporate the Work into one or more
|
|
||||||
Collections, and to Reproduce the Work as incorporated in the
|
|
||||||
Collections;
|
|
||||||
b. to create and Reproduce Adaptations provided that any such Adaptation,
|
|
||||||
including any translation in any medium, takes reasonable steps to
|
|
||||||
clearly label, demarcate or otherwise identify that changes were made
|
|
||||||
to the original Work. For example, a translation could be marked "The
|
|
||||||
original work was translated from English to Spanish," or a
|
|
||||||
modification could indicate "The original work has been modified.";
|
|
||||||
c. to Distribute and Publicly Perform the Work including as incorporated
|
|
||||||
in Collections; and,
|
|
||||||
d. to Distribute and Publicly Perform Adaptations.
|
|
||||||
e. For the avoidance of doubt:
|
|
||||||
|
|
||||||
i. Non-waivable Compulsory License Schemes. In those jurisdictions in
|
|
||||||
which the right to collect royalties through any statutory or
|
|
||||||
compulsory licensing scheme cannot be waived, the Licensor
|
|
||||||
reserves the exclusive right to collect such royalties for any
|
|
||||||
exercise by You of the rights granted under this License;
|
|
||||||
ii. Waivable Compulsory License Schemes. In those jurisdictions in
|
|
||||||
which the right to collect royalties through any statutory or
|
|
||||||
compulsory licensing scheme can be waived, the Licensor waives the
|
|
||||||
exclusive right to collect such royalties for any exercise by You
|
|
||||||
of the rights granted under this License; and,
|
|
||||||
iii. Voluntary License Schemes. The Licensor waives the right to
|
|
||||||
collect royalties, whether individually or, in the event that the
|
|
||||||
Licensor is a member of a collecting society that administers
|
|
||||||
voluntary licensing schemes, via that society, from any exercise
|
|
||||||
by You of the rights granted under this License.
|
|
||||||
|
|
||||||
The above rights may be exercised in all media and formats whether now
|
|
||||||
known or hereafter devised. The above rights include the right to make
|
|
||||||
such modifications as are technically necessary to exercise the rights in
|
|
||||||
other media and formats. Subject to Section 8(f), all rights not expressly
|
|
||||||
granted by Licensor are hereby reserved.
|
|
||||||
|
|
||||||
4. Restrictions. The license granted in Section 3 above is expressly made
|
|
||||||
subject to and limited by the following restrictions:
|
|
||||||
|
|
||||||
a. You may Distribute or Publicly Perform the Work only under the terms
|
|
||||||
of this License. You must include a copy of, or the Uniform Resource
|
|
||||||
Identifier (URI) for, this License with every copy of the Work You
|
|
||||||
Distribute or Publicly Perform. You may not offer or impose any terms
|
|
||||||
on the Work that restrict the terms of this License or the ability of
|
|
||||||
the recipient of the Work to exercise the rights granted to that
|
|
||||||
recipient under the terms of the License. You may not sublicense the
|
|
||||||
Work. You must keep intact all notices that refer to this License and
|
|
||||||
to the disclaimer of warranties with every copy of the Work You
|
|
||||||
Distribute or Publicly Perform. When You Distribute or Publicly
|
|
||||||
Perform the Work, You may not impose any effective technological
|
|
||||||
measures on the Work that restrict the ability of a recipient of the
|
|
||||||
Work from You to exercise the rights granted to that recipient under
|
|
||||||
the terms of the License. This Section 4(a) applies to the Work as
|
|
||||||
incorporated in a Collection, but this does not require the Collection
|
|
||||||
apart from the Work itself to be made subject to the terms of this
|
|
||||||
License. If You create a Collection, upon notice from any Licensor You
|
|
||||||
must, to the extent practicable, remove from the Collection any credit
|
|
||||||
as required by Section 4(b), as requested. If You create an
|
|
||||||
Adaptation, upon notice from any Licensor You must, to the extent
|
|
||||||
practicable, remove from the Adaptation any credit as required by
|
|
||||||
Section 4(b), as requested.
|
|
||||||
b. If You Distribute, or Publicly Perform the Work or any Adaptations or
|
|
||||||
Collections, You must, unless a request has been made pursuant to
|
|
||||||
Section 4(a), keep intact all copyright notices for the Work and
|
|
||||||
provide, reasonable to the medium or means You are utilizing: (i) the
|
|
||||||
name of the Original Author (or pseudonym, if applicable) if supplied,
|
|
||||||
and/or if the Original Author and/or Licensor designate another party
|
|
||||||
or parties (e.g., a sponsor institute, publishing entity, journal) for
|
|
||||||
attribution ("Attribution Parties") in Licensor's copyright notice,
|
|
||||||
terms of service or by other reasonable means, the name of such party
|
|
||||||
or parties; (ii) the title of the Work if supplied; (iii) to the
|
|
||||||
extent reasonably practicable, the URI, if any, that Licensor
|
|
||||||
specifies to be associated with the Work, unless such URI does not
|
|
||||||
refer to the copyright notice or licensing information for the Work;
|
|
||||||
and (iv) , consistent with Section 3(b), in the case of an Adaptation,
|
|
||||||
a credit identifying the use of the Work in the Adaptation (e.g.,
|
|
||||||
"French translation of the Work by Original Author," or "Screenplay
|
|
||||||
based on original Work by Original Author"). The credit required by
|
|
||||||
this Section 4 (b) may be implemented in any reasonable manner;
|
|
||||||
provided, however, that in the case of a Adaptation or Collection, at
|
|
||||||
a minimum such credit will appear, if a credit for all contributing
|
|
||||||
authors of the Adaptation or Collection appears, then as part of these
|
|
||||||
credits and in a manner at least as prominent as the credits for the
|
|
||||||
other contributing authors. For the avoidance of doubt, You may only
|
|
||||||
use the credit required by this Section for the purpose of attribution
|
|
||||||
in the manner set out above and, by exercising Your rights under this
|
|
||||||
License, You may not implicitly or explicitly assert or imply any
|
|
||||||
connection with, sponsorship or endorsement by the Original Author,
|
|
||||||
Licensor and/or Attribution Parties, as appropriate, of You or Your
|
|
||||||
use of the Work, without the separate, express prior written
|
|
||||||
permission of the Original Author, Licensor and/or Attribution
|
|
||||||
Parties.
|
|
||||||
c. Except as otherwise agreed in writing by the Licensor or as may be
|
|
||||||
otherwise permitted by applicable law, if You Reproduce, Distribute or
|
|
||||||
Publicly Perform the Work either by itself or as part of any
|
|
||||||
Adaptations or Collections, You must not distort, mutilate, modify or
|
|
||||||
take other derogatory action in relation to the Work which would be
|
|
||||||
prejudicial to the Original Author's honor or reputation. Licensor
|
|
||||||
agrees that in those jurisdictions (e.g. Japan), in which any exercise
|
|
||||||
of the right granted in Section 3(b) of this License (the right to
|
|
||||||
make Adaptations) would be deemed to be a distortion, mutilation,
|
|
||||||
modification or other derogatory action prejudicial to the Original
|
|
||||||
Author's honor and reputation, the Licensor will waive or not assert,
|
|
||||||
as appropriate, this Section, to the fullest extent permitted by the
|
|
||||||
applicable national law, to enable You to reasonably exercise Your
|
|
||||||
right under Section 3(b) of this License (right to make Adaptations)
|
|
||||||
but not otherwise.
|
|
||||||
|
|
||||||
5. Representations, Warranties and Disclaimer
|
|
||||||
|
|
||||||
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
|
|
||||||
OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
|
|
||||||
KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
|
|
||||||
INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
|
|
||||||
LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
|
|
||||||
WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
|
|
||||||
OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
|
|
||||||
|
|
||||||
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
|
|
||||||
LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR
|
|
||||||
ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
|
|
||||||
ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS
|
|
||||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
7. Termination
|
|
||||||
|
|
||||||
a. This License and the rights granted hereunder will terminate
|
|
||||||
automatically upon any breach by You of the terms of this License.
|
|
||||||
Individuals or entities who have received Adaptations or Collections
|
|
||||||
from You under this License, however, will not have their licenses
|
|
||||||
terminated provided such individuals or entities remain in full
|
|
||||||
compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
|
|
||||||
survive any termination of this License.
|
|
||||||
b. Subject to the above terms and conditions, the license granted here is
|
|
||||||
perpetual (for the duration of the applicable copyright in the Work).
|
|
||||||
Notwithstanding the above, Licensor reserves the right to release the
|
|
||||||
Work under different license terms or to stop distributing the Work at
|
|
||||||
any time; provided, however that any such election will not serve to
|
|
||||||
withdraw this License (or any other license that has been, or is
|
|
||||||
required to be, granted under the terms of this License), and this
|
|
||||||
License will continue in full force and effect unless terminated as
|
|
||||||
stated above.
|
|
||||||
|
|
||||||
8. Miscellaneous
|
|
||||||
|
|
||||||
a. Each time You Distribute or Publicly Perform the Work or a Collection,
|
|
||||||
the Licensor offers to the recipient a license to the Work on the same
|
|
||||||
terms and conditions as the license granted to You under this License.
|
|
||||||
b. Each time You Distribute or Publicly Perform an Adaptation, Licensor
|
|
||||||
offers to the recipient a license to the original Work on the same
|
|
||||||
terms and conditions as the license granted to You under this License.
|
|
||||||
c. If any provision of this License is invalid or unenforceable under
|
|
||||||
applicable law, it shall not affect the validity or enforceability of
|
|
||||||
the remainder of the terms of this License, and without further action
|
|
||||||
by the parties to this agreement, such provision shall be reformed to
|
|
||||||
the minimum extent necessary to make such provision valid and
|
|
||||||
enforceable.
|
|
||||||
d. No term or provision of this License shall be deemed waived and no
|
|
||||||
breach consented to unless such waiver or consent shall be in writing
|
|
||||||
and signed by the party to be charged with such waiver or consent.
|
|
||||||
e. This License constitutes the entire agreement between the parties with
|
|
||||||
respect to the Work licensed here. There are no understandings,
|
|
||||||
agreements or representations with respect to the Work not specified
|
|
||||||
here. Licensor shall not be bound by any additional provisions that
|
|
||||||
may appear in any communication from You. This License may not be
|
|
||||||
modified without the mutual written agreement of the Licensor and You.
|
|
||||||
f. The rights granted under, and the subject matter referenced, in this
|
|
||||||
License were drafted utilizing the terminology of the Berne Convention
|
|
||||||
for the Protection of Literary and Artistic Works (as amended on
|
|
||||||
September 28, 1979), the Rome Convention of 1961, the WIPO Copyright
|
|
||||||
Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996
|
|
||||||
and the Universal Copyright Convention (as revised on July 24, 1971).
|
|
||||||
These rights and subject matter take effect in the relevant
|
|
||||||
jurisdiction in which the License terms are sought to be enforced
|
|
||||||
according to the corresponding provisions of the implementation of
|
|
||||||
those treaty provisions in the applicable national law. If the
|
|
||||||
standard suite of rights granted under applicable copyright law
|
|
||||||
includes additional rights not granted under this License, such
|
|
||||||
additional rights are deemed to be included in the License; this
|
|
||||||
License is not intended to restrict the license of any rights under
|
|
||||||
applicable law.
|
|
||||||
|
|
||||||
|
|
||||||
Creative Commons Notice
|
|
||||||
|
|
||||||
Creative Commons is not a party to this License, and makes no warranty
|
|
||||||
whatsoever in connection with the Work. Creative Commons will not be
|
|
||||||
liable to You or any party on any legal theory for any damages
|
|
||||||
whatsoever, including without limitation any general, special,
|
|
||||||
incidental or consequential damages arising in connection to this
|
|
||||||
license. Notwithstanding the foregoing two (2) sentences, if Creative
|
|
||||||
Commons has expressly identified itself as the Licensor hereunder, it
|
|
||||||
shall have all rights and obligations of Licensor.
|
|
||||||
|
|
||||||
Except for the limited purpose of indicating to the public that the
|
|
||||||
Work is licensed under the CCPL, Creative Commons does not authorize
|
|
||||||
the use by either party of the trademark "Creative Commons" or any
|
|
||||||
related trademark or logo of Creative Commons without the prior
|
|
||||||
written consent of Creative Commons. Any permitted use will be in
|
|
||||||
compliance with Creative Commons' then-current trademark usage
|
|
||||||
guidelines, as may be published on its website or otherwise made
|
|
||||||
available upon request from time to time. For the avoidance of doubt,
|
|
||||||
this trademark restriction does not form part of this License.
|
|
||||||
|
|
||||||
Creative Commons may be contacted at http://creativecommons.org/.
|
|
69
vendor/github.com/google/go-github/github/activity.go
generated
vendored
69
vendor/github.com/google/go-github/github/activity.go
generated
vendored
@ -1,69 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import "context"
|
|
||||||
|
|
||||||
// ActivityService handles communication with the activity related
|
|
||||||
// methods of the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/
|
|
||||||
type ActivityService service
|
|
||||||
|
|
||||||
// FeedLink represents a link to a related resource.
|
|
||||||
type FeedLink struct {
|
|
||||||
HRef *string `json:"href,omitempty"`
|
|
||||||
Type *string `json:"type,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Feeds represents timeline resources in Atom format.
|
|
||||||
type Feeds struct {
|
|
||||||
TimelineURL *string `json:"timeline_url,omitempty"`
|
|
||||||
UserURL *string `json:"user_url,omitempty"`
|
|
||||||
CurrentUserPublicURL *string `json:"current_user_public_url,omitempty"`
|
|
||||||
CurrentUserURL *string `json:"current_user_url,omitempty"`
|
|
||||||
CurrentUserActorURL *string `json:"current_user_actor_url,omitempty"`
|
|
||||||
CurrentUserOrganizationURL *string `json:"current_user_organization_url,omitempty"`
|
|
||||||
CurrentUserOrganizationURLs []string `json:"current_user_organization_urls,omitempty"`
|
|
||||||
Links *struct {
|
|
||||||
Timeline *FeedLink `json:"timeline,omitempty"`
|
|
||||||
User *FeedLink `json:"user,omitempty"`
|
|
||||||
CurrentUserPublic *FeedLink `json:"current_user_public,omitempty"`
|
|
||||||
CurrentUser *FeedLink `json:"current_user,omitempty"`
|
|
||||||
CurrentUserActor *FeedLink `json:"current_user_actor,omitempty"`
|
|
||||||
CurrentUserOrganization *FeedLink `json:"current_user_organization,omitempty"`
|
|
||||||
CurrentUserOrganizations []FeedLink `json:"current_user_organizations,omitempty"`
|
|
||||||
} `json:"_links,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListFeeds lists all the feeds available to the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub provides several timeline resources in Atom format:
|
|
||||||
// Timeline: The GitHub global public timeline
|
|
||||||
// User: The public timeline for any user, using URI template
|
|
||||||
// Current user public: The public timeline for the authenticated user
|
|
||||||
// Current user: The private timeline for the authenticated user
|
|
||||||
// Current user actor: The private timeline for activity created by the
|
|
||||||
// authenticated user
|
|
||||||
// Current user organizations: The private timeline for the organizations
|
|
||||||
// the authenticated user is a member of.
|
|
||||||
//
|
|
||||||
// Note: Private feeds are only returned when authenticating via Basic Auth
|
|
||||||
// since current feed URIs use the older, non revocable auth tokens.
|
|
||||||
func (s *ActivityService) ListFeeds(ctx context.Context) (*Feeds, *Response, error) {
|
|
||||||
req, err := s.client.NewRequest("GET", "feeds", nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
f := &Feeds{}
|
|
||||||
resp, err := s.client.Do(ctx, req, f)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return f, resp, nil
|
|
||||||
}
|
|
322
vendor/github.com/google/go-github/github/activity_events.go
generated
vendored
322
vendor/github.com/google/go-github/github/activity_events.go
generated
vendored
@ -1,322 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Event represents a GitHub event.
|
|
||||||
type Event struct {
|
|
||||||
Type *string `json:"type,omitempty"`
|
|
||||||
Public *bool `json:"public"`
|
|
||||||
RawPayload *json.RawMessage `json:"payload,omitempty"`
|
|
||||||
Repo *Repository `json:"repo,omitempty"`
|
|
||||||
Actor *User `json:"actor,omitempty"`
|
|
||||||
Org *Organization `json:"org,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
ID *string `json:"id,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e Event) String() string {
|
|
||||||
return Stringify(e)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParsePayload parses the event payload. For recognized event types,
|
|
||||||
// a value of the corresponding struct type will be returned.
|
|
||||||
func (e *Event) ParsePayload() (payload interface{}, err error) {
|
|
||||||
switch *e.Type {
|
|
||||||
case "CommitCommentEvent":
|
|
||||||
payload = &CommitCommentEvent{}
|
|
||||||
case "CreateEvent":
|
|
||||||
payload = &CreateEvent{}
|
|
||||||
case "DeleteEvent":
|
|
||||||
payload = &DeleteEvent{}
|
|
||||||
case "DeploymentEvent":
|
|
||||||
payload = &DeploymentEvent{}
|
|
||||||
case "DeploymentStatusEvent":
|
|
||||||
payload = &DeploymentStatusEvent{}
|
|
||||||
case "ForkEvent":
|
|
||||||
payload = &ForkEvent{}
|
|
||||||
case "GollumEvent":
|
|
||||||
payload = &GollumEvent{}
|
|
||||||
case "InstallationEvent":
|
|
||||||
payload = &InstallationEvent{}
|
|
||||||
case "InstallationRepositoriesEvent":
|
|
||||||
payload = &InstallationRepositoriesEvent{}
|
|
||||||
case "IssueCommentEvent":
|
|
||||||
payload = &IssueCommentEvent{}
|
|
||||||
case "IssuesEvent":
|
|
||||||
payload = &IssuesEvent{}
|
|
||||||
case "LabelEvent":
|
|
||||||
payload = &LabelEvent{}
|
|
||||||
case "MemberEvent":
|
|
||||||
payload = &MemberEvent{}
|
|
||||||
case "MembershipEvent":
|
|
||||||
payload = &MembershipEvent{}
|
|
||||||
case "MilestoneEvent":
|
|
||||||
payload = &MilestoneEvent{}
|
|
||||||
case "OrganizationEvent":
|
|
||||||
payload = &OrganizationEvent{}
|
|
||||||
case "OrgBlockEvent":
|
|
||||||
payload = &OrgBlockEvent{}
|
|
||||||
case "PageBuildEvent":
|
|
||||||
payload = &PageBuildEvent{}
|
|
||||||
case "PingEvent":
|
|
||||||
payload = &PingEvent{}
|
|
||||||
case "ProjectEvent":
|
|
||||||
payload = &ProjectEvent{}
|
|
||||||
case "ProjectCardEvent":
|
|
||||||
payload = &ProjectCardEvent{}
|
|
||||||
case "ProjectColumnEvent":
|
|
||||||
payload = &ProjectColumnEvent{}
|
|
||||||
case "PublicEvent":
|
|
||||||
payload = &PublicEvent{}
|
|
||||||
case "PullRequestEvent":
|
|
||||||
payload = &PullRequestEvent{}
|
|
||||||
case "PullRequestReviewEvent":
|
|
||||||
payload = &PullRequestReviewEvent{}
|
|
||||||
case "PullRequestReviewCommentEvent":
|
|
||||||
payload = &PullRequestReviewCommentEvent{}
|
|
||||||
case "PushEvent":
|
|
||||||
payload = &PushEvent{}
|
|
||||||
case "ReleaseEvent":
|
|
||||||
payload = &ReleaseEvent{}
|
|
||||||
case "RepositoryEvent":
|
|
||||||
payload = &RepositoryEvent{}
|
|
||||||
case "StatusEvent":
|
|
||||||
payload = &StatusEvent{}
|
|
||||||
case "TeamEvent":
|
|
||||||
payload = &TeamEvent{}
|
|
||||||
case "TeamAddEvent":
|
|
||||||
payload = &TeamAddEvent{}
|
|
||||||
case "WatchEvent":
|
|
||||||
payload = &WatchEvent{}
|
|
||||||
}
|
|
||||||
err = json.Unmarshal(*e.RawPayload, &payload)
|
|
||||||
return payload, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Payload returns the parsed event payload. For recognized event types,
|
|
||||||
// a value of the corresponding struct type will be returned.
|
|
||||||
//
|
|
||||||
// Deprecated: Use ParsePayload instead, which returns an error
|
|
||||||
// rather than panics if JSON unmarshaling raw payload fails.
|
|
||||||
func (e *Event) Payload() (payload interface{}) {
|
|
||||||
var err error
|
|
||||||
payload, err = e.ParsePayload()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return payload
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEvents drinks from the firehose of all public events across GitHub.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u, err := addOptions("events", opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var events []*Event
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return events, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListRepositoryEvents lists events for a repository.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/events", owner, repo)
|
|
||||||
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 events []*Event
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return events, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListIssueEventsForRepository lists issue events for a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/#list-issue-events-for-a-repository
|
|
||||||
func (s *ActivityService) ListIssueEventsForRepository(ctx context.Context, owner, repo string, opt *ListOptions) ([]*IssueEvent, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/events", owner, repo)
|
|
||||||
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 events []*IssueEvent
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return events, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *ActivityService) ListEventsForRepoNetwork(ctx context.Context, owner, repo string, opt *ListOptions) ([]*Event, *Response, error) {
|
|
||||||
u := fmt.Sprintf("networks/%v/%v/events", owner, repo)
|
|
||||||
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 events []*Event
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return events, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEventsForOrganization lists public events for an organization.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-an-organization
|
|
||||||
func (s *ActivityService) ListEventsForOrganization(ctx context.Context, org string, opt *ListOptions) ([]*Event, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/events", 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
|
|
||||||
}
|
|
||||||
|
|
||||||
var events []*Event
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return events, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEventsPerformedByUser lists the events performed by a user. If publicOnly is
|
|
||||||
// true, only public events will be returned.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/#list-events-performed-by-a-user
|
|
||||||
func (s *ActivityService) ListEventsPerformedByUser(ctx context.Context, user string, publicOnly bool, opt *ListOptions) ([]*Event, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if publicOnly {
|
|
||||||
u = fmt.Sprintf("users/%v/events/public", user)
|
|
||||||
} else {
|
|
||||||
u = fmt.Sprintf("users/%v/events", user)
|
|
||||||
}
|
|
||||||
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 events []*Event
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return events, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEventsReceivedByUser lists the events received by a user. If publicOnly is
|
|
||||||
// true, only public events will be returned.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/#list-events-that-a-user-has-received
|
|
||||||
func (s *ActivityService) ListEventsReceivedByUser(ctx context.Context, user string, publicOnly bool, opt *ListOptions) ([]*Event, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if publicOnly {
|
|
||||||
u = fmt.Sprintf("users/%v/received_events/public", user)
|
|
||||||
} else {
|
|
||||||
u = fmt.Sprintf("users/%v/received_events", user)
|
|
||||||
}
|
|
||||||
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 events []*Event
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return events, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListUserEventsForOrganization provides the user’s organization dashboard. You
|
|
||||||
// must be authenticated as the user to view this.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/#list-events-for-an-organization
|
|
||||||
func (s *ActivityService) ListUserEventsForOrganization(ctx context.Context, org, user string, opt *ListOptions) ([]*Event, *Response, error) {
|
|
||||||
u := fmt.Sprintf("users/%v/events/orgs/%v", user, 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
|
|
||||||
}
|
|
||||||
|
|
||||||
var events []*Event
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return events, resp, nil
|
|
||||||
}
|
|
223
vendor/github.com/google/go-github/github/activity_notifications.go
generated
vendored
223
vendor/github.com/google/go-github/github/activity_notifications.go
generated
vendored
@ -1,223 +0,0 @@
|
|||||||
// Copyright 2014 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Notification identifies a GitHub notification for a user.
|
|
||||||
type Notification struct {
|
|
||||||
ID *string `json:"id,omitempty"`
|
|
||||||
Repository *Repository `json:"repository,omitempty"`
|
|
||||||
Subject *NotificationSubject `json:"subject,omitempty"`
|
|
||||||
|
|
||||||
// Reason identifies the event that triggered the notification.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/notifications/#notification-reasons
|
|
||||||
Reason *string `json:"reason,omitempty"`
|
|
||||||
|
|
||||||
Unread *bool `json:"unread,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
LastReadAt *time.Time `json:"last_read_at,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotificationSubject identifies the subject of a notification.
|
|
||||||
type NotificationSubject struct {
|
|
||||||
Title *string `json:"title,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
LatestCommentURL *string `json:"latest_comment_url,omitempty"`
|
|
||||||
Type *string `json:"type,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NotificationListOptions specifies the optional parameters to the
|
|
||||||
// ActivityService.ListNotifications method.
|
|
||||||
type NotificationListOptions struct {
|
|
||||||
All bool `url:"all,omitempty"`
|
|
||||||
Participating bool `url:"participating,omitempty"`
|
|
||||||
Since time.Time `url:"since,omitempty"`
|
|
||||||
Before time.Time `url:"before,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListNotifications lists all notifications for the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/notifications/#list-your-notifications
|
|
||||||
func (s *ActivityService) ListNotifications(ctx context.Context, opt *NotificationListOptions) ([]*Notification, *Response, error) {
|
|
||||||
u := fmt.Sprintf("notifications")
|
|
||||||
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 notifications []*Notification
|
|
||||||
resp, err := s.client.Do(ctx, req, ¬ifications)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return notifications, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListRepositoryNotifications lists all notifications in a given repository
|
|
||||||
// for the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/notifications/#list-your-notifications-in-a-repository
|
|
||||||
func (s *ActivityService) ListRepositoryNotifications(ctx context.Context, owner, repo string, opt *NotificationListOptions) ([]*Notification, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/notifications", owner, repo)
|
|
||||||
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 notifications []*Notification
|
|
||||||
resp, err := s.client.Do(ctx, req, ¬ifications)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return notifications, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type markReadOptions struct {
|
|
||||||
LastReadAt time.Time `json:"last_read_at,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkNotificationsRead marks all notifications up to lastRead as read.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/notifications/#mark-as-read
|
|
||||||
func (s *ActivityService) MarkNotificationsRead(ctx context.Context, lastRead time.Time) (*Response, error) {
|
|
||||||
opts := &markReadOptions{
|
|
||||||
LastReadAt: lastRead,
|
|
||||||
}
|
|
||||||
req, err := s.client.NewRequest("PUT", "notifications", opts)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkRepositoryNotificationsRead marks all notifications up to lastRead in
|
|
||||||
// the specified repository as read.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/notifications/#mark-notifications-as-read-in-a-repository
|
|
||||||
func (s *ActivityService) MarkRepositoryNotificationsRead(ctx context.Context, owner, repo string, lastRead time.Time) (*Response, error) {
|
|
||||||
opts := &markReadOptions{
|
|
||||||
LastReadAt: lastRead,
|
|
||||||
}
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/notifications", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("PUT", u, opts)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetThread gets the specified notification thread.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/notifications/#view-a-single-thread
|
|
||||||
func (s *ActivityService) GetThread(ctx context.Context, id string) (*Notification, *Response, error) {
|
|
||||||
u := fmt.Sprintf("notifications/threads/%v", id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
notification := new(Notification)
|
|
||||||
resp, err := s.client.Do(ctx, req, notification)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return notification, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarkThreadRead marks the specified thread as read.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/notifications/#mark-a-thread-as-read
|
|
||||||
func (s *ActivityService) MarkThreadRead(ctx context.Context, id string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("notifications/threads/%v", id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetThreadSubscription checks to see if the authenticated user is subscribed
|
|
||||||
// to a thread.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/notifications/#get-a-thread-subscription
|
|
||||||
func (s *ActivityService) GetThreadSubscription(ctx context.Context, id string) (*Subscription, *Response, error) {
|
|
||||||
u := fmt.Sprintf("notifications/threads/%v/subscription", id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
sub := new(Subscription)
|
|
||||||
resp, err := s.client.Do(ctx, req, sub)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sub, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetThreadSubscription sets the subscription for the specified thread for the
|
|
||||||
// authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/notifications/#set-a-thread-subscription
|
|
||||||
func (s *ActivityService) SetThreadSubscription(ctx context.Context, id string, subscription *Subscription) (*Subscription, *Response, error) {
|
|
||||||
u := fmt.Sprintf("notifications/threads/%v/subscription", id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("PUT", u, subscription)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
sub := new(Subscription)
|
|
||||||
resp, err := s.client.Do(ctx, req, sub)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sub, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteThreadSubscription deletes the subscription for the specified thread
|
|
||||||
// for the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/notifications/#delete-a-thread-subscription
|
|
||||||
func (s *ActivityService) DeleteThreadSubscription(ctx context.Context, id string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("notifications/threads/%v/subscription", id)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
135
vendor/github.com/google/go-github/github/activity_star.go
generated
vendored
135
vendor/github.com/google/go-github/github/activity_star.go
generated
vendored
@ -1,135 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// StarredRepository is returned by ListStarred.
|
|
||||||
type StarredRepository struct {
|
|
||||||
StarredAt *Timestamp `json:"starred_at,omitempty"`
|
|
||||||
Repository *Repository `json:"repo,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stargazer represents a user that has starred a repository.
|
|
||||||
type Stargazer struct {
|
|
||||||
StarredAt *Timestamp `json:"starred_at,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListStargazers lists people who have starred the specified repo.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/stargazers", owner, repo)
|
|
||||||
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", mediaTypeStarringPreview)
|
|
||||||
|
|
||||||
var stargazers []*Stargazer
|
|
||||||
resp, err := s.client.Do(ctx, req, &stargazers)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return stargazers, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ActivityListStarredOptions specifies the optional parameters to the
|
|
||||||
// ActivityService.ListStarred method.
|
|
||||||
type ActivityListStarredOptions struct {
|
|
||||||
// How to sort the repository list. Possible values are: created, updated,
|
|
||||||
// pushed, full_name. Default is "full_name".
|
|
||||||
Sort string `url:"sort,omitempty"`
|
|
||||||
|
|
||||||
// Direction in which to sort repositories. Possible values are: asc, desc.
|
|
||||||
// Default is "asc" when sort is "full_name", otherwise default is "desc".
|
|
||||||
Direction string `url:"direction,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListStarred lists all the repos starred by a user. Passing the empty string
|
|
||||||
// will list the starred repositories for the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred
|
|
||||||
func (s *ActivityService) ListStarred(ctx context.Context, user string, opt *ActivityListStarredOptions) ([]*StarredRepository, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if user != "" {
|
|
||||||
u = fmt.Sprintf("users/%v/starred", user)
|
|
||||||
} else {
|
|
||||||
u = "user/starred"
|
|
||||||
}
|
|
||||||
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", mediaTypeStarringPreview)
|
|
||||||
|
|
||||||
var repos []*StarredRepository
|
|
||||||
resp, err := s.client.Do(ctx, req, &repos)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return repos, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *ActivityService) IsStarred(ctx context.Context, owner, repo string) (bool, *Response, error) {
|
|
||||||
u := fmt.Sprintf("user/starred/%v/%v", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return false, nil, err
|
|
||||||
}
|
|
||||||
resp, err := s.client.Do(ctx, req, nil)
|
|
||||||
starred, err := parseBoolResponse(err)
|
|
||||||
return starred, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Star a repository as the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/starring/#star-a-repository
|
|
||||||
func (s *ActivityService) Star(ctx context.Context, owner, repo string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("user/starred/%v/%v", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("PUT", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unstar a repository as the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/starring/#unstar-a-repository
|
|
||||||
func (s *ActivityService) Unstar(ctx context.Context, owner, repo string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("user/starred/%v/%v", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
146
vendor/github.com/google/go-github/github/activity_watching.go
generated
vendored
146
vendor/github.com/google/go-github/github/activity_watching.go
generated
vendored
@ -1,146 +0,0 @@
|
|||||||
// Copyright 2014 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Subscription identifies a repository or thread subscription.
|
|
||||||
type Subscription struct {
|
|
||||||
Subscribed *bool `json:"subscribed,omitempty"`
|
|
||||||
Ignored *bool `json:"ignored,omitempty"`
|
|
||||||
Reason *string `json:"reason,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
|
|
||||||
// only populated for repository subscriptions
|
|
||||||
RepositoryURL *string `json:"repository_url,omitempty"`
|
|
||||||
|
|
||||||
// only populated for thread subscriptions
|
|
||||||
ThreadURL *string `json:"thread_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListWatchers lists watchers of a particular repo.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/subscribers", owner, repo)
|
|
||||||
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 watchers []*User
|
|
||||||
resp, err := s.client.Do(ctx, req, &watchers)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return watchers, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListWatched lists the repositories the specified user is watching. Passing
|
|
||||||
// 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
|
|
||||||
func (s *ActivityService) ListWatched(ctx context.Context, user string, opt *ListOptions) ([]*Repository, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if user != "" {
|
|
||||||
u = fmt.Sprintf("users/%v/subscriptions", user)
|
|
||||||
} else {
|
|
||||||
u = "user/subscriptions"
|
|
||||||
}
|
|
||||||
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 watched []*Repository
|
|
||||||
resp, err := s.client.Do(ctx, req, &watched)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return watched, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRepositorySubscription returns the subscription for the specified
|
|
||||||
// repository for the authenticated user. If the authenticated user is not
|
|
||||||
// watching the repository, a nil Subscription is returned.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/watching/#get-a-repository-subscription
|
|
||||||
func (s *ActivityService) GetRepositorySubscription(ctx context.Context, owner, repo string) (*Subscription, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/subscription", owner, repo)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
sub := new(Subscription)
|
|
||||||
resp, err := s.client.Do(ctx, req, sub)
|
|
||||||
if err != nil {
|
|
||||||
// if it's just a 404, don't return that as an error
|
|
||||||
_, err = parseBoolResponse(err)
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sub, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetRepositorySubscription sets the subscription for the specified repository
|
|
||||||
// for the authenticated user.
|
|
||||||
//
|
|
||||||
// To watch a repository, set subscription.Subscribed to true.
|
|
||||||
// To ignore notifications made within a repository, set subscription.Ignored to true.
|
|
||||||
// To stop watching a repository, use DeleteRepositorySubscription.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/watching/#set-a-repository-subscription
|
|
||||||
func (s *ActivityService) SetRepositorySubscription(ctx context.Context, owner, repo string, subscription *Subscription) (*Subscription, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/subscription", owner, repo)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("PUT", u, subscription)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
sub := new(Subscription)
|
|
||||||
resp, err := s.client.Do(ctx, req, sub)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return sub, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteRepositorySubscription deletes the subscription for the specified
|
|
||||||
// repository for the authenticated user.
|
|
||||||
//
|
|
||||||
// This is used to stop watching a repository. To control whether or not to
|
|
||||||
// receive notifications from a repository, use SetRepositorySubscription.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/watching/#delete-a-repository-subscription
|
|
||||||
func (s *ActivityService) DeleteRepositorySubscription(ctx context.Context, owner, repo string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/subscription", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
101
vendor/github.com/google/go-github/github/admin.go
generated
vendored
101
vendor/github.com/google/go-github/github/admin.go
generated
vendored
@ -1,101 +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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AdminService handles communication with the admin related methods of the
|
|
||||||
// GitHub API. These API routes are normally only accessible for GitHub
|
|
||||||
// Enterprise installations.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/enterprise/
|
|
||||||
type AdminService service
|
|
||||||
|
|
||||||
// TeamLDAPMapping represents the mapping between a GitHub team and an LDAP group.
|
|
||||||
type TeamLDAPMapping struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
LDAPDN *string `json:"ldap_dn,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Slug *string `json:"slug,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
Privacy *string `json:"privacy,omitempty"`
|
|
||||||
Permission *string `json:"permission,omitempty"`
|
|
||||||
|
|
||||||
MembersURL *string `json:"members_url,omitempty"`
|
|
||||||
RepositoriesURL *string `json:"repositories_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m TeamLDAPMapping) String() string {
|
|
||||||
return Stringify(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UserLDAPMapping represents the mapping between a GitHub user and an LDAP user.
|
|
||||||
type UserLDAPMapping struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
LDAPDN *string `json:"ldap_dn,omitempty"`
|
|
||||||
Login *string `json:"login,omitempty"`
|
|
||||||
AvatarURL *string `json:"avatar_url,omitempty"`
|
|
||||||
GravatarID *string `json:"gravatar_id,omitempty"`
|
|
||||||
Type *string `json:"type,omitempty"`
|
|
||||||
SiteAdmin *bool `json:"site_admin,omitempty"`
|
|
||||||
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
EventsURL *string `json:"events_url,omitempty"`
|
|
||||||
FollowingURL *string `json:"following_url,omitempty"`
|
|
||||||
FollowersURL *string `json:"followers_url,omitempty"`
|
|
||||||
GistsURL *string `json:"gists_url,omitempty"`
|
|
||||||
OrganizationsURL *string `json:"organizations_url,omitempty"`
|
|
||||||
ReceivedEventsURL *string `json:"received_events_url,omitempty"`
|
|
||||||
ReposURL *string `json:"repos_url,omitempty"`
|
|
||||||
StarredURL *string `json:"starred_url,omitempty"`
|
|
||||||
SubscriptionsURL *string `json:"subscriptions_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m UserLDAPMapping) String() string {
|
|
||||||
return Stringify(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *AdminService) UpdateUserLDAPMapping(ctx context.Context, user string, mapping *UserLDAPMapping) (*UserLDAPMapping, *Response, error) {
|
|
||||||
u := fmt.Sprintf("admin/ldap/users/%v/mapping", user)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, mapping)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
m := new(UserLDAPMapping)
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateTeamLDAPMapping updates the mapping between a GitHub team and an LDAP group.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/enterprise/ldap/#update-ldap-mapping-for-a-team
|
|
||||||
func (s *AdminService) UpdateTeamLDAPMapping(ctx context.Context, team int, mapping *TeamLDAPMapping) (*TeamLDAPMapping, *Response, error) {
|
|
||||||
u := fmt.Sprintf("admin/ldap/teams/%v/mapping", team)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, mapping)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
m := new(TeamLDAPMapping)
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
40
vendor/github.com/google/go-github/github/apps.go
generated
vendored
40
vendor/github.com/google/go-github/github/apps.go
generated
vendored
@ -1,40 +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"
|
|
||||||
|
|
||||||
// AppsService provides access to the installation related functions
|
|
||||||
// in the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/apps/
|
|
||||||
type AppsService service
|
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
49
vendor/github.com/google/go-github/github/apps_installation.go
generated
vendored
49
vendor/github.com/google/go-github/github/apps_installation.go
generated
vendored
@ -1,49 +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"
|
|
||||||
|
|
||||||
// Installation represents a GitHub Apps installation.
|
|
||||||
type Installation struct {
|
|
||||||
ID *int `json:"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"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i Installation) String() string {
|
|
||||||
return Stringify(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListRepos lists the repositories that are accessible to the authenticated installation.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/apps/installations/#list-repositories
|
|
||||||
func (s *AppsService) ListRepos(ctx context.Context, opt *ListOptions) ([]*Repository, *Response, error) {
|
|
||||||
u, err := addOptions("installation/repositories", 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 r struct {
|
|
||||||
Repositories []*Repository `json:"repositories"`
|
|
||||||
}
|
|
||||||
resp, err := s.client.Do(ctx, req, &r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return r.Repositories, resp, nil
|
|
||||||
}
|
|
435
vendor/github.com/google/go-github/github/authorizations.go
generated
vendored
435
vendor/github.com/google/go-github/github/authorizations.go
generated
vendored
@ -1,435 +0,0 @@
|
|||||||
// Copyright 2015 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Scope models a GitHub authorization scope.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/oauth/#scopes
|
|
||||||
type Scope string
|
|
||||||
|
|
||||||
// This is the set of scopes for GitHub API V3
|
|
||||||
const (
|
|
||||||
ScopeNone Scope = "(no scope)" // REVISIT: is this actually returned, or just a documentation artifact?
|
|
||||||
ScopeUser Scope = "user"
|
|
||||||
ScopeUserEmail Scope = "user:email"
|
|
||||||
ScopeUserFollow Scope = "user:follow"
|
|
||||||
ScopePublicRepo Scope = "public_repo"
|
|
||||||
ScopeRepo Scope = "repo"
|
|
||||||
ScopeRepoDeployment Scope = "repo_deployment"
|
|
||||||
ScopeRepoStatus Scope = "repo:status"
|
|
||||||
ScopeDeleteRepo Scope = "delete_repo"
|
|
||||||
ScopeNotifications Scope = "notifications"
|
|
||||||
ScopeGist Scope = "gist"
|
|
||||||
ScopeReadRepoHook Scope = "read:repo_hook"
|
|
||||||
ScopeWriteRepoHook Scope = "write:repo_hook"
|
|
||||||
ScopeAdminRepoHook Scope = "admin:repo_hook"
|
|
||||||
ScopeAdminOrgHook Scope = "admin:org_hook"
|
|
||||||
ScopeReadOrg Scope = "read:org"
|
|
||||||
ScopeWriteOrg Scope = "write:org"
|
|
||||||
ScopeAdminOrg Scope = "admin:org"
|
|
||||||
ScopeReadPublicKey Scope = "read:public_key"
|
|
||||||
ScopeWritePublicKey Scope = "write:public_key"
|
|
||||||
ScopeAdminPublicKey Scope = "admin:public_key"
|
|
||||||
ScopeReadGPGKey Scope = "read:gpg_key"
|
|
||||||
ScopeWriteGPGKey Scope = "write:gpg_key"
|
|
||||||
ScopeAdminGPGKey Scope = "admin:gpg_key"
|
|
||||||
)
|
|
||||||
|
|
||||||
// AuthorizationsService handles communication with the authorization related
|
|
||||||
// methods of the GitHub API.
|
|
||||||
//
|
|
||||||
// This service requires HTTP Basic Authentication; it cannot be accessed using
|
|
||||||
// an OAuth token.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/oauth_authorizations/
|
|
||||||
type AuthorizationsService service
|
|
||||||
|
|
||||||
// Authorization represents an individual GitHub authorization.
|
|
||||||
type Authorization struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Scopes []Scope `json:"scopes,omitempty"`
|
|
||||||
Token *string `json:"token,omitempty"`
|
|
||||||
TokenLastEight *string `json:"token_last_eight,omitempty"`
|
|
||||||
HashedToken *string `json:"hashed_token,omitempty"`
|
|
||||||
App *AuthorizationApp `json:"app,omitempty"`
|
|
||||||
Note *string `json:"note,omitempty"`
|
|
||||||
NoteURL *string `json:"note_url,omitempty"`
|
|
||||||
UpdateAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
Fingerprint *string `json:"fingerprint,omitempty"`
|
|
||||||
|
|
||||||
// User is only populated by the Check and Reset methods.
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a Authorization) String() string {
|
|
||||||
return Stringify(a)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AuthorizationApp represents an individual GitHub app (in the context of authorization).
|
|
||||||
type AuthorizationApp struct {
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
ClientID *string `json:"client_id,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a AuthorizationApp) String() string {
|
|
||||||
return Stringify(a)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Grant represents an OAuth application that has been granted access to an account.
|
|
||||||
type Grant struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
App *AuthorizationApp `json:"app,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
Scopes []string `json:"scopes,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g Grant) String() string {
|
|
||||||
return Stringify(g)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AuthorizationRequest represents a request to create an authorization.
|
|
||||||
type AuthorizationRequest struct {
|
|
||||||
Scopes []Scope `json:"scopes,omitempty"`
|
|
||||||
Note *string `json:"note,omitempty"`
|
|
||||||
NoteURL *string `json:"note_url,omitempty"`
|
|
||||||
ClientID *string `json:"client_id,omitempty"`
|
|
||||||
ClientSecret *string `json:"client_secret,omitempty"`
|
|
||||||
Fingerprint *string `json:"fingerprint,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a AuthorizationRequest) String() string {
|
|
||||||
return Stringify(a)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AuthorizationUpdateRequest represents a request to update an authorization.
|
|
||||||
//
|
|
||||||
// Note that for any one update, you must only provide one of the "scopes"
|
|
||||||
// fields. That is, you may provide only one of "Scopes", or "AddScopes", or
|
|
||||||
// "RemoveScopes".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#update-an-existing-authorization
|
|
||||||
type AuthorizationUpdateRequest struct {
|
|
||||||
Scopes []string `json:"scopes,omitempty"`
|
|
||||||
AddScopes []string `json:"add_scopes,omitempty"`
|
|
||||||
RemoveScopes []string `json:"remove_scopes,omitempty"`
|
|
||||||
Note *string `json:"note,omitempty"`
|
|
||||||
NoteURL *string `json:"note_url,omitempty"`
|
|
||||||
Fingerprint *string `json:"fingerprint,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a AuthorizationUpdateRequest) String() string {
|
|
||||||
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 int) (*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 int, 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 int) (*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.
|
|
||||||
//
|
|
||||||
// Note that this operation requires the use of BasicAuth, but where the
|
|
||||||
// username is the OAuth application clientID, and the password is its
|
|
||||||
// clientSecret. Invalid tokens will return a 404 Not Found.
|
|
||||||
//
|
|
||||||
// The returned Authorization.User field will be populated.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#check-an-authorization
|
|
||||||
func (s *AuthorizationsService) Check(ctx context.Context, clientID string, token string) (*Authorization, *Response, error) {
|
|
||||||
u := fmt.Sprintf("applications/%v/tokens/%v", clientID, token)
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset is used to reset a valid OAuth token without end user involvement.
|
|
||||||
// Applications must save the "token" property in the response, because changes
|
|
||||||
// take effect immediately.
|
|
||||||
//
|
|
||||||
// Note that this operation requires the use of BasicAuth, but where the
|
|
||||||
// username is the OAuth application clientID, and the password is its
|
|
||||||
// clientSecret. Invalid tokens will return a 404 Not Found.
|
|
||||||
//
|
|
||||||
// The returned Authorization.User field will be populated.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization
|
|
||||||
func (s *AuthorizationsService) Reset(ctx context.Context, clientID string, token string) (*Authorization, *Response, error) {
|
|
||||||
u := fmt.Sprintf("applications/%v/tokens/%v", clientID, token)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", 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
|
|
||||||
}
|
|
||||||
|
|
||||||
// Revoke an authorization for an application.
|
|
||||||
//
|
|
||||||
// Note that this operation requires the use of BasicAuth, but where the
|
|
||||||
// username is the OAuth application clientID, and the password is its
|
|
||||||
// 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
|
|
||||||
func (s *AuthorizationsService) Revoke(ctx context.Context, clientID string, token string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("applications/%v/tokens/%v", clientID, token)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
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 int) (*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
|
|
||||||
// grant will also delete all OAuth tokens associated with the application for
|
|
||||||
// the user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/oauth_authorizations/#delete-a-grant
|
|
||||||
func (s *AuthorizationsService) DeleteGrant(ctx context.Context, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("applications/grants/%d", id)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateImpersonation creates an impersonation OAuth token.
|
|
||||||
//
|
|
||||||
// This requires admin permissions. With the returned Authorization.Token
|
|
||||||
// you can e.g. create or delete a user's public SSH key. NOTE: creating a
|
|
||||||
// new token automatically revokes an existing one.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/enterprise/2.5/v3/users/administration/#create-an-impersonation-oauth-token
|
|
||||||
func (s *AuthorizationsService) CreateImpersonation(ctx context.Context, username string, authReq *AuthorizationRequest) (*Authorization, *Response, error) {
|
|
||||||
u := fmt.Sprintf("admin/users/%v/authorizations", username)
|
|
||||||
req, err := s.client.NewRequest("POST", u, authReq)
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteImpersonation deletes an impersonation OAuth token.
|
|
||||||
//
|
|
||||||
// NOTE: there can be only one at a time.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/enterprise/2.5/v3/users/administration/#delete-an-impersonation-oauth-token
|
|
||||||
func (s *AuthorizationsService) DeleteImpersonation(ctx context.Context, username string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("admin/users/%v/authorizations", username)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
189
vendor/github.com/google/go-github/github/doc.go
generated
vendored
189
vendor/github.com/google/go-github/github/doc.go
generated
vendored
@ -1,189 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
/*
|
|
||||||
Package github provides a client for using the GitHub API.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
import "github.com/google/go-github/github"
|
|
||||||
|
|
||||||
Construct a new GitHub client, then use the various services on the client to
|
|
||||||
access different parts of the GitHub API. For example:
|
|
||||||
|
|
||||||
client := github.NewClient(nil)
|
|
||||||
|
|
||||||
// list all organizations for user "willnorris"
|
|
||||||
orgs, _, err := client.Organizations.List(ctx, "willnorris", nil)
|
|
||||||
|
|
||||||
Some API methods have optional parameters that can be passed. For example:
|
|
||||||
|
|
||||||
client := github.NewClient(nil)
|
|
||||||
|
|
||||||
// list public repositories for org "github"
|
|
||||||
opt := &github.RepositoryListByOrgOptions{Type: "public"}
|
|
||||||
repos, _, err := client.Repositories.ListByOrg(ctx, "github", opt)
|
|
||||||
|
|
||||||
The services of a client divide the API into logical chunks and correspond to
|
|
||||||
the structure of the GitHub API documentation at
|
|
||||||
https://developer.github.com/v3/.
|
|
||||||
|
|
||||||
Authentication
|
|
||||||
|
|
||||||
The go-github library does not directly handle authentication. Instead, when
|
|
||||||
creating a new client, pass an http.Client that can handle authentication for
|
|
||||||
you. The easiest and recommended way to do this is using the golang.org/x/oauth2
|
|
||||||
library, but you can always use any other library that provides an http.Client.
|
|
||||||
If you have an OAuth2 access token (for example, a personal API token), you can
|
|
||||||
use it with the oauth2 library using:
|
|
||||||
|
|
||||||
import "golang.org/x/oauth2"
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
ctx := context.Background()
|
|
||||||
ts := oauth2.StaticTokenSource(
|
|
||||||
&oauth2.Token{AccessToken: "... your access token ..."},
|
|
||||||
)
|
|
||||||
tc := oauth2.NewClient(ctx, ts)
|
|
||||||
|
|
||||||
client := github.NewClient(tc)
|
|
||||||
|
|
||||||
// list all repositories for the authenticated user
|
|
||||||
repos, _, err := client.Repositories.List(ctx, "", nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
Note that when using an authenticated Client, all calls made by the client will
|
|
||||||
include the specified OAuth token. Therefore, authenticated clients should
|
|
||||||
almost never be shared between different users.
|
|
||||||
|
|
||||||
See the oauth2 docs for complete instructions on using that library.
|
|
||||||
|
|
||||||
For API methods that require HTTP Basic Authentication, use the
|
|
||||||
BasicAuthTransport.
|
|
||||||
|
|
||||||
GitHub Apps authentication can be provided by the
|
|
||||||
https://github.com/bradleyfalzon/ghinstallation package.
|
|
||||||
|
|
||||||
import "github.com/bradleyfalzon/ghinstallation"
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// Wrap the shared transport for use with the integration ID 1 authenticating with installation ID 99.
|
|
||||||
itr, err := ghinstallation.NewKeyFromFile(http.DefaultTransport, 1, 99, "2016-10-19.private-key.pem")
|
|
||||||
if err != nil {
|
|
||||||
// Handle error.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use installation transport with client
|
|
||||||
client := github.NewClient(&http.Client{Transport: itr})
|
|
||||||
|
|
||||||
// Use client...
|
|
||||||
}
|
|
||||||
|
|
||||||
Rate Limiting
|
|
||||||
|
|
||||||
GitHub imposes a rate limit on all API clients. Unauthenticated clients are
|
|
||||||
limited to 60 requests per hour, while authenticated clients can make up to
|
|
||||||
5,000 requests per hour. To receive the higher rate limit when making calls
|
|
||||||
that are not issued on behalf of a user, use the
|
|
||||||
UnauthenticatedRateLimitedTransport.
|
|
||||||
|
|
||||||
The returned Response.Rate value contains the rate limit information
|
|
||||||
from the most recent API call. If a recent enough response isn't
|
|
||||||
available, you can use RateLimits to fetch the most up-to-date rate
|
|
||||||
limit data for the client.
|
|
||||||
|
|
||||||
To detect an API rate limit error, you can check if its type is *github.RateLimitError:
|
|
||||||
|
|
||||||
repos, _, err := client.Repositories.List(ctx, "", nil)
|
|
||||||
if _, ok := err.(*github.RateLimitError); ok {
|
|
||||||
log.Println("hit rate limit")
|
|
||||||
}
|
|
||||||
|
|
||||||
Learn more about GitHub rate limiting at
|
|
||||||
https://developer.github.com/v3/#rate-limiting.
|
|
||||||
|
|
||||||
Accepted Status
|
|
||||||
|
|
||||||
Some endpoints may return a 202 Accepted status code, meaning that the
|
|
||||||
information required is not yet ready and was scheduled to be gathered on
|
|
||||||
the GitHub side. Methods known to behave like this are documented specifying
|
|
||||||
this behavior.
|
|
||||||
|
|
||||||
To detect this condition of error, you can check if its type is
|
|
||||||
*github.AcceptedError:
|
|
||||||
|
|
||||||
stats, _, err := client.Repositories.ListContributorsStats(ctx, org, repo)
|
|
||||||
if _, ok := err.(*github.AcceptedError); ok {
|
|
||||||
log.Println("scheduled on GitHub side")
|
|
||||||
}
|
|
||||||
|
|
||||||
Conditional Requests
|
|
||||||
|
|
||||||
The GitHub API has good support for conditional requests which will help
|
|
||||||
prevent you from burning through your rate limit, as well as help speed up your
|
|
||||||
application. go-github does not handle conditional requests directly, but is
|
|
||||||
instead designed to work with a caching http.Transport. We recommend using
|
|
||||||
https://github.com/gregjones/httpcache for that.
|
|
||||||
|
|
||||||
Learn more about GitHub conditional requests at
|
|
||||||
https://developer.github.com/v3/#conditional-requests.
|
|
||||||
|
|
||||||
Creating and Updating Resources
|
|
||||||
|
|
||||||
All structs for GitHub resources use pointer values for all non-repeated fields.
|
|
||||||
This allows distinguishing between unset fields and those set to a zero-value.
|
|
||||||
Helper functions have been provided to easily create these pointers for string,
|
|
||||||
bool, and int values. For example:
|
|
||||||
|
|
||||||
// create a new private repository named "foo"
|
|
||||||
repo := &github.Repository{
|
|
||||||
Name: github.String("foo"),
|
|
||||||
Private: github.Bool(true),
|
|
||||||
}
|
|
||||||
client.Repositories.Create(ctx, "", repo)
|
|
||||||
|
|
||||||
Users who have worked with protocol buffers should find this pattern familiar.
|
|
||||||
|
|
||||||
Pagination
|
|
||||||
|
|
||||||
All requests for resource collections (repos, pull requests, issues, etc.)
|
|
||||||
support pagination. Pagination options are described in the
|
|
||||||
github.ListOptions struct and passed to the list methods directly or as an
|
|
||||||
embedded type of a more specific list options struct (for example
|
|
||||||
github.PullRequestListOptions). Pages information is available via the
|
|
||||||
github.Response struct.
|
|
||||||
|
|
||||||
client := github.NewClient(nil)
|
|
||||||
|
|
||||||
opt := &github.RepositoryListByOrgOptions{
|
|
||||||
ListOptions: github.ListOptions{PerPage: 10},
|
|
||||||
}
|
|
||||||
// get all pages of results
|
|
||||||
var allRepos []*github.Repository
|
|
||||||
for {
|
|
||||||
repos, resp, err := client.Repositories.ListByOrg(ctx, "github", opt)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
allRepos = append(allRepos, repos...)
|
|
||||||
if resp.NextPage == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
opt.Page = resp.NextPage
|
|
||||||
}
|
|
||||||
|
|
||||||
Google App Engine
|
|
||||||
|
|
||||||
Go on App Engine Classic (which as of this writing uses Go 1.6) can not use
|
|
||||||
the "context" import and still relies on "golang.org/x/net/context".
|
|
||||||
As a result, if you wish to continue to use "go-github" on App Engine Classic,
|
|
||||||
you will need to rewrite all the "context" imports using the following command:
|
|
||||||
|
|
||||||
gofmt -w -r '"context" -> "golang.org/x/net/context"' *.go
|
|
||||||
|
|
||||||
See "with_appengine.go" for more details.
|
|
||||||
|
|
||||||
*/
|
|
||||||
package github
|
|
728
vendor/github.com/google/go-github/github/event_types.go
generated
vendored
728
vendor/github.com/google/go-github/github/event_types.go
generated
vendored
@ -1,728 +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.
|
|
||||||
|
|
||||||
// These event types are shared between the Events API and used as Webhook payloads.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
// CommitCommentEvent is triggered when a commit comment is created.
|
|
||||||
// The Webhook event name is "commit_comment".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#commitcommentevent
|
|
||||||
type CommitCommentEvent struct {
|
|
||||||
Comment *RepositoryComment `json:"comment,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateEvent represents a created repository, branch, or tag.
|
|
||||||
// The Webhook event name is "create".
|
|
||||||
//
|
|
||||||
// Note: webhooks will not receive this event for created repositories.
|
|
||||||
// Additionally, webhooks will not receive this event for tags if more
|
|
||||||
// than three tags are pushed at once.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#createevent
|
|
||||||
type CreateEvent struct {
|
|
||||||
Ref *string `json:"ref,omitempty"`
|
|
||||||
// RefType is the object that was created. Possible values are: "repository", "branch", "tag".
|
|
||||||
RefType *string `json:"ref_type,omitempty"`
|
|
||||||
MasterBranch *string `json:"master_branch,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
PusherType *string `json:"pusher_type,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteEvent represents a deleted branch or tag.
|
|
||||||
// The Webhook event name is "delete".
|
|
||||||
//
|
|
||||||
// Note: webhooks will not receive this event for tags if more than three tags
|
|
||||||
// are deleted at once.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#deleteevent
|
|
||||||
type DeleteEvent struct {
|
|
||||||
Ref *string `json:"ref,omitempty"`
|
|
||||||
// RefType is the object that was deleted. Possible values are: "branch", "tag".
|
|
||||||
RefType *string `json:"ref_type,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
PusherType *string `json:"pusher_type,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeploymentEvent represents a deployment.
|
|
||||||
// The Webhook event name is "deployment".
|
|
||||||
//
|
|
||||||
// Events of this type are not visible in timelines, they are only used to trigger hooks.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#deploymentevent
|
|
||||||
type DeploymentEvent struct {
|
|
||||||
Deployment *Deployment `json:"deployment,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeploymentStatusEvent represents a deployment status.
|
|
||||||
// The Webhook event name is "deployment_status".
|
|
||||||
//
|
|
||||||
// Events of this type are not visible in timelines, they are only used to trigger hooks.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#deploymentstatusevent
|
|
||||||
type DeploymentStatusEvent struct {
|
|
||||||
Deployment *Deployment `json:"deployment,omitempty"`
|
|
||||||
DeploymentStatus *DeploymentStatus `json:"deployment_status,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ForkEvent is triggered when a user forks a repository.
|
|
||||||
// The Webhook event name is "fork".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#forkevent
|
|
||||||
type ForkEvent struct {
|
|
||||||
// Forkee is the created repository.
|
|
||||||
Forkee *Repository `json:"forkee,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Page represents a single Wiki page.
|
|
||||||
type Page struct {
|
|
||||||
PageName *string `json:"page_name,omitempty"`
|
|
||||||
Title *string `json:"title,omitempty"`
|
|
||||||
Summary *string `json:"summary,omitempty"`
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GollumEvent is triggered when a Wiki page is created or updated.
|
|
||||||
// The Webhook event name is "gollum".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#gollumevent
|
|
||||||
type GollumEvent struct {
|
|
||||||
Pages []*Page `json:"pages,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditChange represents the changes when an issue, pull request, or comment has
|
|
||||||
// been edited.
|
|
||||||
type EditChange struct {
|
|
||||||
Title *struct {
|
|
||||||
From *string `json:"from,omitempty"`
|
|
||||||
} `json:"title,omitempty"`
|
|
||||||
Body *struct {
|
|
||||||
From *string `json:"from,omitempty"`
|
|
||||||
} `json:"body,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectChange represents the changes when a project has been edited.
|
|
||||||
type ProjectChange struct {
|
|
||||||
Name *struct {
|
|
||||||
From *string `json:"from,omitempty"`
|
|
||||||
} `json:"name,omitempty"`
|
|
||||||
Body *struct {
|
|
||||||
From *string `json:"from,omitempty"`
|
|
||||||
} `json:"body,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectCardChange represents the changes when a project card has been edited.
|
|
||||||
type ProjectCardChange struct {
|
|
||||||
Note *struct {
|
|
||||||
From *string `json:"from,omitempty"`
|
|
||||||
} `json:"note,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectColumnChange represents the changes when a project column has been edited.
|
|
||||||
type ProjectColumnChange struct {
|
|
||||||
Name *struct {
|
|
||||||
From *string `json:"from,omitempty"`
|
|
||||||
} `json:"name,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TeamChange represents the changes when a team has been edited.
|
|
||||||
type TeamChange struct {
|
|
||||||
Description *struct {
|
|
||||||
From *string `json:"from,omitempty"`
|
|
||||||
} `json:"description,omitempty"`
|
|
||||||
Name *struct {
|
|
||||||
From *string `json:"from,omitempty"`
|
|
||||||
} `json:"name,omitempty"`
|
|
||||||
Privacy *struct {
|
|
||||||
From *string `json:"from,omitempty"`
|
|
||||||
} `json:"privacy,omitempty"`
|
|
||||||
Repository *struct {
|
|
||||||
Permissions *struct {
|
|
||||||
From *struct {
|
|
||||||
Admin *bool `json:"admin,omitempty"`
|
|
||||||
Pull *bool `json:"pull,omitempty"`
|
|
||||||
Push *bool `json:"push,omitempty"`
|
|
||||||
} `json:"from,omitempty"`
|
|
||||||
} `json:"permissions,omitempty"`
|
|
||||||
} `json:"repository,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// InstallationEvent is triggered when a GitHub App has been installed or uninstalled.
|
|
||||||
// The Webhook event name is "installation".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#installationevent
|
|
||||||
type InstallationEvent struct {
|
|
||||||
// The action that was performed. Can be either "created" or "deleted".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// InstallationRepositoriesEvent is triggered when a repository is added or
|
|
||||||
// removed from an installation. The Webhook event name is "installation_repositories".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#installationrepositoriesevent
|
|
||||||
type InstallationRepositoriesEvent struct {
|
|
||||||
// The action that was performed. Can be either "added" or "removed".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
RepositoriesAdded []*Repository `json:"repositories_added,omitempty"`
|
|
||||||
RepositoriesRemoved []*Repository `json:"repositories_removed,omitempty"`
|
|
||||||
RepositorySelection *string `json:"repository_selection,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// IssueCommentEvent is triggered when an issue comment is created on an issue
|
|
||||||
// or pull request.
|
|
||||||
// The Webhook event name is "issue_comment".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#issuecommentevent
|
|
||||||
type IssueCommentEvent struct {
|
|
||||||
// Action is the action that was performed on the comment.
|
|
||||||
// Possible values are: "created", "edited", "deleted".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Issue *Issue `json:"issue,omitempty"`
|
|
||||||
Comment *IssueComment `json:"comment,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Changes *EditChange `json:"changes,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// IssuesEvent is triggered when an issue is assigned, unassigned, labeled,
|
|
||||||
// unlabeled, opened, closed, or reopened.
|
|
||||||
// The Webhook event name is "issues".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#issuesevent
|
|
||||||
type IssuesEvent struct {
|
|
||||||
// Action is the action that was performed. Possible values are: "assigned",
|
|
||||||
// "unassigned", "labeled", "unlabeled", "opened", "closed", "reopened", "edited".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Issue *Issue `json:"issue,omitempty"`
|
|
||||||
Assignee *User `json:"assignee,omitempty"`
|
|
||||||
Label *Label `json:"label,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Changes *EditChange `json:"changes,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// LabelEvent is triggered when a repository's label is created, edited, or deleted.
|
|
||||||
// The Webhook event name is "label"
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#labelevent
|
|
||||||
type LabelEvent struct {
|
|
||||||
// Action is the action that was performed. Possible values are:
|
|
||||||
// "created", "edited", "deleted"
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Label *Label `json:"label,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Changes *EditChange `json:"changes,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Org *Organization `json:"organization,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// MemberEvent is triggered when a user is added as a collaborator to a repository.
|
|
||||||
// The Webhook event name is "member".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#memberevent
|
|
||||||
type MemberEvent struct {
|
|
||||||
// Action is the action that was performed. Possible value is: "added".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Member *User `json:"member,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// MembershipEvent is triggered when a user is added or removed from a team.
|
|
||||||
// The Webhook event name is "membership".
|
|
||||||
//
|
|
||||||
// Events of this type are not visible in timelines, they are only used to
|
|
||||||
// trigger organization webhooks.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#membershipevent
|
|
||||||
type MembershipEvent struct {
|
|
||||||
// Action is the action that was performed. Possible values are: "added", "removed".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
// Scope is the scope of the membership. Possible value is: "team".
|
|
||||||
Scope *string `json:"scope,omitempty"`
|
|
||||||
Member *User `json:"member,omitempty"`
|
|
||||||
Team *Team `json:"team,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"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// MilestoneEvent is triggered when a milestone is created, closed, opened, edited, or deleted.
|
|
||||||
// The Webhook event name is "milestone".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#milestoneevent
|
|
||||||
type MilestoneEvent struct {
|
|
||||||
// Action is the action that was performed. Possible values are:
|
|
||||||
// "created", "closed", "opened", "edited", "deleted"
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Milestone *Milestone `json:"milestone,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Changes *EditChange `json:"changes,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Org *Organization `json:"organization,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// OrganizationEvent is triggered 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.
|
|
||||||
// Webhook event name is "organization".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#organizationevent
|
|
||||||
type OrganizationEvent struct {
|
|
||||||
// Action is the action that was performed.
|
|
||||||
// Can be one of "member_added", "member_removed", or "member_invited".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
|
|
||||||
// Invitaion is the invitation for the user or email if the action is "member_invited".
|
|
||||||
Invitation *Invitation `json:"invitation,omitempty"`
|
|
||||||
|
|
||||||
// Membership is the membership between the user and the organization.
|
|
||||||
// Not present when the action is "member_invited".
|
|
||||||
Membership *Membership `json:"membership,omitempty"`
|
|
||||||
|
|
||||||
Organization *Organization `json:"organization,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// OrgBlockEvent is triggered when an organization blocks or unblocks a user.
|
|
||||||
// The Webhook event name is "org_block".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#orgblockevent
|
|
||||||
type OrgBlockEvent struct {
|
|
||||||
// Action is the action that was performed.
|
|
||||||
// Can be "blocked" or "unblocked".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
BlockedUser *User `json:"blocked_user,omitempty"`
|
|
||||||
Organization *Organization `json:"organization,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PageBuildEvent represents an attempted build of a GitHub Pages site, whether
|
|
||||||
// successful or not.
|
|
||||||
// The Webhook event name is "page_build".
|
|
||||||
//
|
|
||||||
// This event is triggered on push to a GitHub Pages enabled branch (gh-pages
|
|
||||||
// for project pages, master for user and organization pages).
|
|
||||||
//
|
|
||||||
// Events of this type are not visible in timelines, they are only used to trigger hooks.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#pagebuildevent
|
|
||||||
type PageBuildEvent struct {
|
|
||||||
Build *PagesBuild `json:"build,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PingEvent is triggered when a Webhook is added to GitHub.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/webhooks/#ping-event
|
|
||||||
type PingEvent struct {
|
|
||||||
// Random string of GitHub zen.
|
|
||||||
Zen *string `json:"zen,omitempty"`
|
|
||||||
// The ID of the webhook that triggered the ping.
|
|
||||||
HookID *int `json:"hook_id,omitempty"`
|
|
||||||
// The webhook configuration.
|
|
||||||
Hook *Hook `json:"hook,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectEvent is triggered when project is created, modified or deleted.
|
|
||||||
// The webhook event name is "project".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#projectevent
|
|
||||||
type ProjectEvent struct {
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Changes *ProjectChange `json:"changes,omitempty"`
|
|
||||||
Project *Project `json:"project,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Org *Organization `json:"organization,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectCardEvent is triggered when a project card is created, updated, moved, converted to an issue, or deleted.
|
|
||||||
// The webhook event name is "project_card".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#projectcardevent
|
|
||||||
type ProjectCardEvent struct {
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Changes *ProjectCardChange `json:"changes,omitempty"`
|
|
||||||
AfterID *int `json:"after_id,omitempty"`
|
|
||||||
ProjectCard *ProjectCard `json:"project_card,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Org *Organization `json:"organization,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectColumnEvent is triggered when a project column is created, updated, moved, or deleted.
|
|
||||||
// The webhook event name is "project_column".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#projectcolumnevent
|
|
||||||
type ProjectColumnEvent struct {
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Changes *ProjectColumnChange `json:"changes,omitempty"`
|
|
||||||
AfterID *int `json:"after_id,omitempty"`
|
|
||||||
ProjectColumn *ProjectColumn `json:"project_column,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Org *Organization `json:"organization,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicEvent is triggered when a private repository is open sourced.
|
|
||||||
// According to GitHub: "Without a doubt: the best GitHub event."
|
|
||||||
// The Webhook event name is "public".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#publicevent
|
|
||||||
type PublicEvent struct {
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestEvent is triggered when a pull request is assigned, unassigned,
|
|
||||||
// labeled, unlabeled, opened, closed, reopened, or synchronized.
|
|
||||||
// The Webhook event name is "pull_request".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#pullrequestevent
|
|
||||||
type PullRequestEvent struct {
|
|
||||||
// Action is the action that was performed. Possible values are: "assigned",
|
|
||||||
// "unassigned", "labeled", "unlabeled", "opened", "closed", or "reopened",
|
|
||||||
// "synchronize", "edited". If the action is "closed" and the merged key is false,
|
|
||||||
// the pull request was closed with unmerged commits. If the action is "closed"
|
|
||||||
// and the merged key is true, the pull request was merged.
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Number *int `json:"number,omitempty"`
|
|
||||||
PullRequest *PullRequest `json:"pull_request,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Changes *EditChange `json:"changes,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestReviewEvent is triggered when a review is submitted on a pull
|
|
||||||
// request.
|
|
||||||
// The Webhook event name is "pull_request_review".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#pullrequestreviewevent
|
|
||||||
type PullRequestReviewEvent struct {
|
|
||||||
// Action is always "submitted".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Review *PullRequestReview `json:"review,omitempty"`
|
|
||||||
PullRequest *PullRequest `json:"pull_request,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
|
|
||||||
// The following field is only present when the webhook is triggered on
|
|
||||||
// a repository belonging to an organization.
|
|
||||||
Organization *Organization `json:"organization,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestReviewCommentEvent is triggered when a comment is created on a
|
|
||||||
// portion of the unified diff of a pull request.
|
|
||||||
// The Webhook event name is "pull_request_review_comment".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#pullrequestreviewcommentevent
|
|
||||||
type PullRequestReviewCommentEvent struct {
|
|
||||||
// Action is the action that was performed on the comment.
|
|
||||||
// Possible values are: "created", "edited", "deleted".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
PullRequest *PullRequest `json:"pull_request,omitempty"`
|
|
||||||
Comment *PullRequestComment `json:"comment,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Changes *EditChange `json:"changes,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PushEvent represents a git push to a GitHub repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#pushevent
|
|
||||||
type PushEvent struct {
|
|
||||||
PushID *int `json:"push_id,omitempty"`
|
|
||||||
Head *string `json:"head,omitempty"`
|
|
||||||
Ref *string `json:"ref,omitempty"`
|
|
||||||
Size *int `json:"size,omitempty"`
|
|
||||||
Commits []PushEventCommit `json:"commits,omitempty"`
|
|
||||||
Before *string `json:"before,omitempty"`
|
|
||||||
DistinctSize *int `json:"distinct_size,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
After *string `json:"after,omitempty"`
|
|
||||||
Created *bool `json:"created,omitempty"`
|
|
||||||
Deleted *bool `json:"deleted,omitempty"`
|
|
||||||
Forced *bool `json:"forced,omitempty"`
|
|
||||||
BaseRef *string `json:"base_ref,omitempty"`
|
|
||||||
Compare *string `json:"compare,omitempty"`
|
|
||||||
Repo *PushEventRepository `json:"repository,omitempty"`
|
|
||||||
HeadCommit *PushEventCommit `json:"head_commit,omitempty"`
|
|
||||||
Pusher *User `json:"pusher,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p PushEvent) String() string {
|
|
||||||
return Stringify(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PushEventCommit represents a git commit in a GitHub PushEvent.
|
|
||||||
type PushEventCommit struct {
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
Author *CommitAuthor `json:"author,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Distinct *bool `json:"distinct,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Events API.
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
ID *string `json:"id,omitempty"`
|
|
||||||
TreeID *string `json:"tree_id,omitempty"`
|
|
||||||
Timestamp *Timestamp `json:"timestamp,omitempty"`
|
|
||||||
Committer *CommitAuthor `json:"committer,omitempty"`
|
|
||||||
Added []string `json:"added,omitempty"`
|
|
||||||
Removed []string `json:"removed,omitempty"`
|
|
||||||
Modified []string `json:"modified,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p PushEventCommit) String() string {
|
|
||||||
return Stringify(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PushEventRepository represents the repo object in a PushEvent payload.
|
|
||||||
type PushEventRepository struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
FullName *string `json:"full_name,omitempty"`
|
|
||||||
Owner *PushEventRepoOwner `json:"owner,omitempty"`
|
|
||||||
Private *bool `json:"private,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
Fork *bool `json:"fork,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
PushedAt *Timestamp `json:"pushed_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
Homepage *string `json:"homepage,omitempty"`
|
|
||||||
Size *int `json:"size,omitempty"`
|
|
||||||
StargazersCount *int `json:"stargazers_count,omitempty"`
|
|
||||||
WatchersCount *int `json:"watchers_count,omitempty"`
|
|
||||||
Language *string `json:"language,omitempty"`
|
|
||||||
HasIssues *bool `json:"has_issues,omitempty"`
|
|
||||||
HasDownloads *bool `json:"has_downloads,omitempty"`
|
|
||||||
HasWiki *bool `json:"has_wiki,omitempty"`
|
|
||||||
HasPages *bool `json:"has_pages,omitempty"`
|
|
||||||
ForksCount *int `json:"forks_count,omitempty"`
|
|
||||||
OpenIssuesCount *int `json:"open_issues_count,omitempty"`
|
|
||||||
DefaultBranch *string `json:"default_branch,omitempty"`
|
|
||||||
MasterBranch *string `json:"master_branch,omitempty"`
|
|
||||||
Organization *string `json:"organization,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
ArchiveURL *string `json:"archive_url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
StatusesURL *string `json:"statuses_url,omitempty"`
|
|
||||||
GitURL *string `json:"git_url,omitempty"`
|
|
||||||
SSHURL *string `json:"ssh_url,omitempty"`
|
|
||||||
CloneURL *string `json:"clone_url,omitempty"`
|
|
||||||
SVNURL *string `json:"svn_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PushEventRepoOwner is a basic representation of user/org in a PushEvent payload.
|
|
||||||
type PushEventRepoOwner struct {
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Email *string `json:"email,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReleaseEvent is triggered when a release is published.
|
|
||||||
// The Webhook event name is "release".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#releaseevent
|
|
||||||
type ReleaseEvent struct {
|
|
||||||
// Action is the action that was performed. Possible value is: "published".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Release *RepositoryRelease `json:"release,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RepositoryEvent is triggered when a repository is created.
|
|
||||||
// The Webhook event name is "repository".
|
|
||||||
//
|
|
||||||
// Events of this type are not visible in timelines, they are only used to
|
|
||||||
// trigger organization webhooks.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#repositoryevent
|
|
||||||
type RepositoryEvent struct {
|
|
||||||
// Action is the action that was performed. Possible values are: "created", "deleted",
|
|
||||||
// "publicized", "privatized".
|
|
||||||
Action *string `json:"action,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"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// StatusEvent is triggered when the status of a Git commit changes.
|
|
||||||
// The Webhook event name is "status".
|
|
||||||
//
|
|
||||||
// Events of this type are not visible in timelines, they are only used to
|
|
||||||
// trigger hooks.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#statusevent
|
|
||||||
type StatusEvent struct {
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
// State is the new state. Possible values are: "pending", "success", "failure", "error".
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
TargetURL *string `json:"target_url,omitempty"`
|
|
||||||
Branches []*Branch `json:"branches,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Context *string `json:"context,omitempty"`
|
|
||||||
Commit *RepositoryCommit `json:"commit,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TeamEvent is triggered when an organization's team is created, modified or deleted.
|
|
||||||
// The Webhook event name is "team".
|
|
||||||
//
|
|
||||||
// Events of this type are not visible in timelines. These events are only used
|
|
||||||
// to trigger hooks.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#teamevent
|
|
||||||
type TeamEvent struct {
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
Team *Team `json:"team,omitempty"`
|
|
||||||
Changes *TeamChange `json:"changes,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"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TeamAddEvent is triggered when a repository is added to a team.
|
|
||||||
// The Webhook event name is "team_add".
|
|
||||||
//
|
|
||||||
// Events of this type are not visible in timelines. These events are only used
|
|
||||||
// to trigger hooks.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#teamaddevent
|
|
||||||
type TeamAddEvent struct {
|
|
||||||
Team *Team `json:"team,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"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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/
|
|
||||||
//
|
|
||||||
// The event’s actor is the user who starred a repository, and the event’s
|
|
||||||
// repository is the repository that was starred.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/activity/events/types/#watchevent
|
|
||||||
type WatchEvent struct {
|
|
||||||
// Action is the action that was performed. Possible value is: "started".
|
|
||||||
Action *string `json:"action,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
Installation *Installation `json:"installation,omitempty"`
|
|
||||||
}
|
|
299
vendor/github.com/google/go-github/github/gen-accessors.go
generated
vendored
299
vendor/github.com/google/go-github/github/gen-accessors.go
generated
vendored
@ -1,299 +0,0 @@
|
|||||||
// Copyright 2017 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.
|
|
||||||
|
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
// gen-accessors generates accessor methods for structs with pointer fields.
|
|
||||||
//
|
|
||||||
// It is meant to be used by the go-github authors in conjunction with the
|
|
||||||
// go generate tool before sending a commit to GitHub.
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"go/ast"
|
|
||||||
"go/format"
|
|
||||||
"go/parser"
|
|
||||||
"go/token"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"text/template"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
fileSuffix = "-accessors.go"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
verbose = flag.Bool("v", false, "Print verbose log messages")
|
|
||||||
|
|
||||||
sourceTmpl = template.Must(template.New("source").Parse(source))
|
|
||||||
|
|
||||||
// blacklist lists which "struct.method" combos to not generate.
|
|
||||||
blacklist = map[string]bool{
|
|
||||||
"RepositoryContent.GetContent": true,
|
|
||||||
"Client.GetBaseURL": true,
|
|
||||||
"Client.GetUploadURL": true,
|
|
||||||
"ErrorResponse.GetResponse": true,
|
|
||||||
"RateLimitError.GetResponse": true,
|
|
||||||
"AbuseRateLimitError.GetResponse": true,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func logf(fmt string, args ...interface{}) {
|
|
||||||
if *verbose {
|
|
||||||
log.Printf(fmt, args...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
flag.Parse()
|
|
||||||
fset := token.NewFileSet()
|
|
||||||
|
|
||||||
pkgs, err := parser.ParseDir(fset, ".", sourceFilter, 0)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for pkgName, pkg := range pkgs {
|
|
||||||
t := &templateData{
|
|
||||||
filename: pkgName + fileSuffix,
|
|
||||||
Year: time.Now().Year(),
|
|
||||||
Package: pkgName,
|
|
||||||
Imports: map[string]string{},
|
|
||||||
}
|
|
||||||
for filename, f := range pkg.Files {
|
|
||||||
logf("Processing %v...", filename)
|
|
||||||
if err := t.processAST(f); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err := t.dump(); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
logf("Done.")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *templateData) processAST(f *ast.File) error {
|
|
||||||
for _, decl := range f.Decls {
|
|
||||||
gd, ok := decl.(*ast.GenDecl)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, spec := range gd.Specs {
|
|
||||||
ts, ok := spec.(*ast.TypeSpec)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
st, ok := ts.Type.(*ast.StructType)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, field := range st.Fields.List {
|
|
||||||
se, ok := field.Type.(*ast.StarExpr)
|
|
||||||
if len(field.Names) == 0 || !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldName := field.Names[0]
|
|
||||||
if key := fmt.Sprintf("%v.Get%v", ts.Name, fieldName); blacklist[key] {
|
|
||||||
logf("Method %v blacklisted; skipping.", key)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
switch x := se.X.(type) {
|
|
||||||
case *ast.ArrayType:
|
|
||||||
t.addArrayType(x, ts.Name.String(), fieldName.String())
|
|
||||||
case *ast.Ident:
|
|
||||||
t.addIdent(x, ts.Name.String(), fieldName.String())
|
|
||||||
case *ast.MapType:
|
|
||||||
t.addMapType(x, ts.Name.String(), fieldName.String())
|
|
||||||
case *ast.SelectorExpr:
|
|
||||||
t.addSelectorExpr(x, ts.Name.String(), fieldName.String())
|
|
||||||
default:
|
|
||||||
logf("processAST: type %q, field %q, unknown %T: %+v", ts.Name, fieldName, x, x)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func sourceFilter(fi os.FileInfo) bool {
|
|
||||||
return !strings.HasSuffix(fi.Name(), "_test.go") && !strings.HasSuffix(fi.Name(), fileSuffix)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *templateData) dump() error {
|
|
||||||
if len(t.Getters) == 0 {
|
|
||||||
logf("No getters for %v; skipping.", t.filename)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort getters by ReceiverType.FieldName
|
|
||||||
sort.Sort(byName(t.Getters))
|
|
||||||
|
|
||||||
var buf bytes.Buffer
|
|
||||||
if err := sourceTmpl.Execute(&buf, t); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
clean, err := format.Source(buf.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
logf("Writing %v...", t.filename)
|
|
||||||
return ioutil.WriteFile(t.filename, clean, 0644)
|
|
||||||
}
|
|
||||||
|
|
||||||
func newGetter(receiverType, fieldName, fieldType, zeroValue string) *getter {
|
|
||||||
return &getter{
|
|
||||||
sortVal: strings.ToLower(receiverType) + "." + strings.ToLower(fieldName),
|
|
||||||
ReceiverVar: strings.ToLower(receiverType[:1]),
|
|
||||||
ReceiverType: receiverType,
|
|
||||||
FieldName: fieldName,
|
|
||||||
FieldType: fieldType,
|
|
||||||
ZeroValue: zeroValue,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *templateData) addArrayType(x *ast.ArrayType, receiverType, fieldName string) {
|
|
||||||
var eltType string
|
|
||||||
switch elt := x.Elt.(type) {
|
|
||||||
case *ast.Ident:
|
|
||||||
eltType = elt.String()
|
|
||||||
default:
|
|
||||||
logf("addArrayType: type %q, field %q: unknown elt type: %T %+v; skipping.", receiverType, fieldName, elt, elt)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Getters = append(t.Getters, newGetter(receiverType, fieldName, "[]"+eltType, "nil"))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *templateData) addIdent(x *ast.Ident, receiverType, fieldName string) {
|
|
||||||
var zeroValue string
|
|
||||||
switch x.String() {
|
|
||||||
case "int":
|
|
||||||
zeroValue = "0"
|
|
||||||
case "string":
|
|
||||||
zeroValue = `""`
|
|
||||||
case "bool":
|
|
||||||
zeroValue = "false"
|
|
||||||
case "Timestamp":
|
|
||||||
zeroValue = "Timestamp{}"
|
|
||||||
default: // other structs handled by their receivers directly.
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Getters = append(t.Getters, newGetter(receiverType, fieldName, x.String(), zeroValue))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *templateData) addMapType(x *ast.MapType, receiverType, fieldName string) {
|
|
||||||
var keyType string
|
|
||||||
switch key := x.Key.(type) {
|
|
||||||
case *ast.Ident:
|
|
||||||
keyType = key.String()
|
|
||||||
default:
|
|
||||||
logf("addMapType: type %q, field %q: unknown key type: %T %+v; skipping.", receiverType, fieldName, key, key)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var valueType string
|
|
||||||
switch value := x.Value.(type) {
|
|
||||||
case *ast.Ident:
|
|
||||||
valueType = value.String()
|
|
||||||
default:
|
|
||||||
logf("addMapType: type %q, field %q: unknown value type: %T %+v; skipping.", receiverType, fieldName, value, value)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldType := fmt.Sprintf("map[%v]%v", keyType, valueType)
|
|
||||||
zeroValue := fmt.Sprintf("map[%v]%v{}", keyType, valueType)
|
|
||||||
t.Getters = append(t.Getters, newGetter(receiverType, fieldName, fieldType, zeroValue))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *templateData) addSelectorExpr(x *ast.SelectorExpr, receiverType, fieldName string) {
|
|
||||||
if strings.ToLower(fieldName[:1]) == fieldName[:1] { // non-exported field
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var xX string
|
|
||||||
if xx, ok := x.X.(*ast.Ident); ok {
|
|
||||||
xX = xx.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
switch xX {
|
|
||||||
case "time", "json":
|
|
||||||
if xX == "json" {
|
|
||||||
t.Imports["encoding/json"] = "encoding/json"
|
|
||||||
} else {
|
|
||||||
t.Imports[xX] = xX
|
|
||||||
}
|
|
||||||
fieldType := fmt.Sprintf("%v.%v", xX, x.Sel.Name)
|
|
||||||
zeroValue := fmt.Sprintf("%v.%v{}", xX, x.Sel.Name)
|
|
||||||
if xX == "time" && x.Sel.Name == "Duration" {
|
|
||||||
zeroValue = "0"
|
|
||||||
}
|
|
||||||
t.Getters = append(t.Getters, newGetter(receiverType, fieldName, fieldType, zeroValue))
|
|
||||||
default:
|
|
||||||
logf("addSelectorExpr: xX %q, type %q, field %q: unknown x=%+v; skipping.", xX, receiverType, fieldName, x)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type templateData struct {
|
|
||||||
filename string
|
|
||||||
Year int
|
|
||||||
Package string
|
|
||||||
Imports map[string]string
|
|
||||||
Getters []*getter
|
|
||||||
}
|
|
||||||
|
|
||||||
type getter struct {
|
|
||||||
sortVal string // lower-case version of "ReceiverType.FieldName"
|
|
||||||
ReceiverVar string // the one-letter variable name to match the ReceiverType
|
|
||||||
ReceiverType string
|
|
||||||
FieldName string
|
|
||||||
FieldType string
|
|
||||||
ZeroValue string
|
|
||||||
}
|
|
||||||
|
|
||||||
type byName []*getter
|
|
||||||
|
|
||||||
func (b byName) Len() int { return len(b) }
|
|
||||||
func (b byName) Less(i, j int) bool { return b[i].sortVal < b[j].sortVal }
|
|
||||||
func (b byName) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
|
|
||||||
|
|
||||||
const source = `// Copyright {{.Year}} 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.
|
|
||||||
|
|
||||||
// Code generated by gen-accessors; DO NOT EDIT.
|
|
||||||
|
|
||||||
package {{.Package}}
|
|
||||||
{{with .Imports}}
|
|
||||||
import (
|
|
||||||
{{- range . -}}
|
|
||||||
"{{.}}"
|
|
||||||
{{end -}}
|
|
||||||
)
|
|
||||||
{{end}}
|
|
||||||
{{range .Getters}}
|
|
||||||
// Get{{.FieldName}} returns the {{.FieldName}} field if it's non-nil, zero value otherwise.
|
|
||||||
func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() {{.FieldType}} {
|
|
||||||
if {{.ReceiverVar}} == nil || {{.ReceiverVar}}.{{.FieldName}} == nil {
|
|
||||||
return {{.ZeroValue}}
|
|
||||||
}
|
|
||||||
return *{{.ReceiverVar}}.{{.FieldName}}
|
|
||||||
}
|
|
||||||
{{end}}
|
|
||||||
`
|
|
351
vendor/github.com/google/go-github/github/gists.go
generated
vendored
351
vendor/github.com/google/go-github/github/gists.go
generated
vendored
@ -1,351 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GistsService handles communication with the Gist related
|
|
||||||
// methods of the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/
|
|
||||||
type GistsService service
|
|
||||||
|
|
||||||
// Gist represents a GitHub's gist.
|
|
||||||
type Gist struct {
|
|
||||||
ID *string `json:"id,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
Public *bool `json:"public,omitempty"`
|
|
||||||
Owner *User `json:"owner,omitempty"`
|
|
||||||
Files map[GistFilename]GistFile `json:"files,omitempty"`
|
|
||||||
Comments *int `json:"comments,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
GitPullURL *string `json:"git_pull_url,omitempty"`
|
|
||||||
GitPushURL *string `json:"git_push_url,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g Gist) String() string {
|
|
||||||
return Stringify(g)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GistFilename represents filename on a gist.
|
|
||||||
type GistFilename string
|
|
||||||
|
|
||||||
// GistFile represents a file on a gist.
|
|
||||||
type GistFile struct {
|
|
||||||
Size *int `json:"size,omitempty"`
|
|
||||||
Filename *string `json:"filename,omitempty"`
|
|
||||||
Language *string `json:"language,omitempty"`
|
|
||||||
Type *string `json:"type,omitempty"`
|
|
||||||
RawURL *string `json:"raw_url,omitempty"`
|
|
||||||
Content *string `json:"content,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g GistFile) String() string {
|
|
||||||
return Stringify(g)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GistCommit represents a commit on a gist.
|
|
||||||
type GistCommit struct {
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Version *string `json:"version,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
ChangeStatus *CommitStats `json:"change_status,omitempty"`
|
|
||||||
CommittedAt *Timestamp `json:"committed_at,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gc GistCommit) String() string {
|
|
||||||
return Stringify(gc)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GistFork represents a fork of a gist.
|
|
||||||
type GistFork struct {
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
ID *string `json:"id,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gf GistFork) String() string {
|
|
||||||
return Stringify(gf)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GistListOptions specifies the optional parameters to the
|
|
||||||
// GistsService.List, GistsService.ListAll, and GistsService.ListStarred methods.
|
|
||||||
type GistListOptions struct {
|
|
||||||
// Since filters Gists by time.
|
|
||||||
Since time.Time `url:"since,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// List gists for a user. Passing the empty string will list
|
|
||||||
// all public gists if called anonymously. However, if the call
|
|
||||||
// is authenticated, it will returns all gists for the authenticated
|
|
||||||
// user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#list-gists
|
|
||||||
func (s *GistsService) List(ctx context.Context, user string, opt *GistListOptions) ([]*Gist, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if user != "" {
|
|
||||||
u = fmt.Sprintf("users/%v/gists", user)
|
|
||||||
} else {
|
|
||||||
u = "gists"
|
|
||||||
}
|
|
||||||
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 gists []*Gist
|
|
||||||
resp, err := s.client.Do(ctx, req, &gists)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return gists, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListAll lists all public gists.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#list-gists
|
|
||||||
func (s *GistsService) ListAll(ctx context.Context, opt *GistListOptions) ([]*Gist, *Response, error) {
|
|
||||||
u, err := addOptions("gists/public", opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var gists []*Gist
|
|
||||||
resp, err := s.client.Do(ctx, req, &gists)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return gists, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListStarred lists starred gists of authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#list-gists
|
|
||||||
func (s *GistsService) ListStarred(ctx context.Context, opt *GistListOptions) ([]*Gist, *Response, error) {
|
|
||||||
u, err := addOptions("gists/starred", opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var gists []*Gist
|
|
||||||
resp, err := s.client.Do(ctx, req, &gists)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return gists, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a single gist.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#get-a-single-gist
|
|
||||||
func (s *GistsService) Get(ctx context.Context, id string) (*Gist, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v", id)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
gist := new(Gist)
|
|
||||||
resp, err := s.client.Do(ctx, req, gist)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return gist, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRevision gets a specific revision of a gist.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#get-a-specific-revision-of-a-gist
|
|
||||||
func (s *GistsService) GetRevision(ctx context.Context, id, sha string) (*Gist, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/%v", id, sha)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
gist := new(Gist)
|
|
||||||
resp, err := s.client.Do(ctx, req, gist)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return gist, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a gist for authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#create-a-gist
|
|
||||||
func (s *GistsService) Create(ctx context.Context, gist *Gist) (*Gist, *Response, error) {
|
|
||||||
u := "gists"
|
|
||||||
req, err := s.client.NewRequest("POST", u, gist)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
g := new(Gist)
|
|
||||||
resp, err := s.client.Do(ctx, req, g)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return g, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edit a gist.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#edit-a-gist
|
|
||||||
func (s *GistsService) Edit(ctx context.Context, id string, gist *Gist) (*Gist, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v", id)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, gist)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
g := new(Gist)
|
|
||||||
resp, err := s.client.Do(ctx, req, g)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return g, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListCommits lists commits of a gist.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("gists/%v/commits", id)
|
|
||||||
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 gistCommits []*GistCommit
|
|
||||||
resp, err := s.client.Do(ctx, req, &gistCommits)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return gistCommits, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete a gist.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#delete-a-gist
|
|
||||||
func (s *GistsService) Delete(ctx context.Context, id string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v", id)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Star a gist on behalf of authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#star-a-gist
|
|
||||||
func (s *GistsService) Star(ctx context.Context, id string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/star", id)
|
|
||||||
req, err := s.client.NewRequest("PUT", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unstar a gist on a behalf of authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#unstar-a-gist
|
|
||||||
func (s *GistsService) Unstar(ctx context.Context, id string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/star", id)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsStarred checks if a gist is starred by authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#check-if-a-gist-is-starred
|
|
||||||
func (s *GistsService) IsStarred(ctx context.Context, id string) (bool, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/star", id)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return false, nil, err
|
|
||||||
}
|
|
||||||
resp, err := s.client.Do(ctx, req, nil)
|
|
||||||
starred, err := parseBoolResponse(err)
|
|
||||||
return starred, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fork a gist.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#fork-a-gist
|
|
||||||
func (s *GistsService) Fork(ctx context.Context, id string) (*Gist, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/forks", id)
|
|
||||||
req, err := s.client.NewRequest("POST", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
g := new(Gist)
|
|
||||||
resp, err := s.client.Do(ctx, req, g)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return g, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListForks lists forks of a gist.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/#list-gist-forks
|
|
||||||
func (s *GistsService) ListForks(ctx context.Context, id string) ([]*GistFork, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/forks", id)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var gistForks []*GistFork
|
|
||||||
resp, err := s.client.Do(ctx, req, &gistForks)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return gistForks, resp, nil
|
|
||||||
}
|
|
119
vendor/github.com/google/go-github/github/gists_comments.go
generated
vendored
119
vendor/github.com/google/go-github/github/gists_comments.go
generated
vendored
@ -1,119 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GistComment represents a Gist comment.
|
|
||||||
type GistComment struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g GistComment) String() string {
|
|
||||||
return Stringify(g)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListComments lists all comments for a gist.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/comments/#list-comments-on-a-gist
|
|
||||||
func (s *GistsService) ListComments(ctx context.Context, gistID string, opt *ListOptions) ([]*GistComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/comments", gistID)
|
|
||||||
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 comments []*GistComment
|
|
||||||
resp, err := s.client.Do(ctx, req, &comments)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return comments, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetComment retrieves a single comment from a gist.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/comments/#get-a-single-comment
|
|
||||||
func (s *GistsService) GetComment(ctx context.Context, gistID string, commentID int) (*GistComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c := new(GistComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateComment creates a comment for a gist.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/comments/#create-a-comment
|
|
||||||
func (s *GistsService) CreateComment(ctx context.Context, gistID string, comment *GistComment) (*GistComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/comments", gistID)
|
|
||||||
req, err := s.client.NewRequest("POST", u, comment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c := new(GistComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditComment edits an existing gist comment.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/comments/#edit-a-comment
|
|
||||||
func (s *GistsService) EditComment(ctx context.Context, gistID string, commentID int, comment *GistComment) (*GistComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, comment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c := new(GistComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteComment deletes a gist comment.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gists/comments/#delete-a-comment
|
|
||||||
func (s *GistsService) DeleteComment(ctx context.Context, gistID string, commentID int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
12
vendor/github.com/google/go-github/github/git.go
generated
vendored
12
vendor/github.com/google/go-github/github/git.go
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
// GitService handles communication with the git data related
|
|
||||||
// methods of the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/git/
|
|
||||||
type GitService service
|
|
50
vendor/github.com/google/go-github/github/git_blobs.go
generated
vendored
50
vendor/github.com/google/go-github/github/git_blobs.go
generated
vendored
@ -1,50 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Blob represents a blob object.
|
|
||||||
type Blob struct {
|
|
||||||
Content *string `json:"content,omitempty"`
|
|
||||||
Encoding *string `json:"encoding,omitempty"`
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Size *int `json:"size,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetBlob fetchs a blob from a repo given a SHA.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/git/blobs/#get-a-blob
|
|
||||||
func (s *GitService) GetBlob(ctx context.Context, owner string, repo string, sha string) (*Blob, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/git/blobs/%v", owner, repo, sha)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
blob := new(Blob)
|
|
||||||
resp, err := s.client.Do(ctx, req, blob)
|
|
||||||
return blob, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateBlob creates a blob object.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/git/blobs/#create-a-blob
|
|
||||||
func (s *GitService) CreateBlob(ctx context.Context, owner string, repo string, blob *Blob) (*Blob, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/git/blobs", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("POST", u, blob)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
t := new(Blob)
|
|
||||||
resp, err := s.client.Do(ctx, req, t)
|
|
||||||
return t, resp, err
|
|
||||||
}
|
|
133
vendor/github.com/google/go-github/github/git_commits.go
generated
vendored
133
vendor/github.com/google/go-github/github/git_commits.go
generated
vendored
@ -1,133 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SignatureVerification represents GPG signature verification.
|
|
||||||
type SignatureVerification struct {
|
|
||||||
Verified *bool `json:"verified,omitempty"`
|
|
||||||
Reason *string `json:"reason,omitempty"`
|
|
||||||
Signature *string `json:"signature,omitempty"`
|
|
||||||
Payload *string `json:"payload,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Commit represents a GitHub commit.
|
|
||||||
type Commit struct {
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Author *CommitAuthor `json:"author,omitempty"`
|
|
||||||
Committer *CommitAuthor `json:"committer,omitempty"`
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
Tree *Tree `json:"tree,omitempty"`
|
|
||||||
Parents []Commit `json:"parents,omitempty"`
|
|
||||||
Stats *CommitStats `json:"stats,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Verification *SignatureVerification `json:"verification,omitempty"`
|
|
||||||
|
|
||||||
// CommentCount is the number of GitHub comments on the commit. This
|
|
||||||
// is only populated for requests that fetch GitHub data like
|
|
||||||
// Pulls.ListCommits, Repositories.ListCommits, etc.
|
|
||||||
CommentCount *int `json:"comment_count,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c Commit) String() string {
|
|
||||||
return Stringify(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommitAuthor represents the author or committer of a commit. The commit
|
|
||||||
// author may not correspond to a GitHub User.
|
|
||||||
type CommitAuthor struct {
|
|
||||||
Date *time.Time `json:"date,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Email *string `json:"email,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
Login *string `json:"username,omitempty"` // Renamed for go-github consistency.
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c CommitAuthor) String() string {
|
|
||||||
return Stringify(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCommit fetchs the Commit object for a given SHA.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/git/commits/#get-a-commit
|
|
||||||
func (s *GitService) GetCommit(ctx context.Context, owner string, repo string, sha string) (*Commit, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/git/commits/%v", 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", mediaTypeGitSigningPreview)
|
|
||||||
|
|
||||||
c := new(Commit)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// createCommit represents the body of a CreateCommit request.
|
|
||||||
type createCommit struct {
|
|
||||||
Author *CommitAuthor `json:"author,omitempty"`
|
|
||||||
Committer *CommitAuthor `json:"committer,omitempty"`
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
Tree *string `json:"tree,omitempty"`
|
|
||||||
Parents []string `json:"parents,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateCommit creates a new commit in a repository.
|
|
||||||
// commit must not be nil.
|
|
||||||
//
|
|
||||||
// The commit.Committer is optional and will be filled with the commit.Author
|
|
||||||
// data if omitted. If the commit.Author is omitted, it will be filled in with
|
|
||||||
// the authenticated user’s information and the current date.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/git/commits/#create-a-commit
|
|
||||||
func (s *GitService) CreateCommit(ctx context.Context, owner string, repo string, commit *Commit) (*Commit, *Response, error) {
|
|
||||||
if commit == nil {
|
|
||||||
return nil, nil, fmt.Errorf("commit must be provided")
|
|
||||||
}
|
|
||||||
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/git/commits", owner, repo)
|
|
||||||
|
|
||||||
parents := make([]string, len(commit.Parents))
|
|
||||||
for i, parent := range commit.Parents {
|
|
||||||
parents[i] = *parent.SHA
|
|
||||||
}
|
|
||||||
|
|
||||||
body := &createCommit{
|
|
||||||
Author: commit.Author,
|
|
||||||
Committer: commit.Committer,
|
|
||||||
Message: commit.Message,
|
|
||||||
Parents: parents,
|
|
||||||
}
|
|
||||||
if commit.Tree != nil {
|
|
||||||
body.Tree = commit.Tree.SHA
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", u, body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c := new(Commit)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
217
vendor/github.com/google/go-github/github/git_refs.go
generated
vendored
217
vendor/github.com/google/go-github/github/git_refs.go
generated
vendored
@ -1,217 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Reference represents a GitHub reference.
|
|
||||||
type Reference struct {
|
|
||||||
Ref *string `json:"ref"`
|
|
||||||
URL *string `json:"url"`
|
|
||||||
Object *GitObject `json:"object"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r Reference) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GitObject represents a Git object.
|
|
||||||
type GitObject struct {
|
|
||||||
Type *string `json:"type"`
|
|
||||||
SHA *string `json:"sha"`
|
|
||||||
URL *string `json:"url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o GitObject) String() string {
|
|
||||||
return Stringify(o)
|
|
||||||
}
|
|
||||||
|
|
||||||
// createRefRequest represents the payload for creating a reference.
|
|
||||||
type createRefRequest struct {
|
|
||||||
Ref *string `json:"ref"`
|
|
||||||
SHA *string `json:"sha"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// updateRefRequest represents the payload for updating a reference.
|
|
||||||
type updateRefRequest struct {
|
|
||||||
SHA *string `json:"sha"`
|
|
||||||
Force *bool `json:"force"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRef fetches a single Reference object for a given Git ref.
|
|
||||||
// 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
|
|
||||||
func (s *GitService) GetRef(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, ref)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
r := new(Reference)
|
|
||||||
resp, err := s.client.Do(ctx, req, r)
|
|
||||||
if _, ok := err.(*json.UnmarshalTypeError); ok {
|
|
||||||
// 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 r, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRefs fetches a slice of Reference objects for a given Git ref.
|
|
||||||
// If there is an exact match, only that ref is returned.
|
|
||||||
// If there is no exact match, GitHub returns all refs that start with ref.
|
|
||||||
// If returned error is nil, there will be at least 1 ref returned.
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// "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, ref)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
// GitService.ListRefs method.
|
|
||||||
type ReferenceListOptions struct {
|
|
||||||
Type string `url:"-"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListRefs lists all refs in a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/git/refs/#get-all-references
|
|
||||||
func (s *GitService) ListRefs(ctx context.Context, owner, repo string, opt *ReferenceListOptions) ([]*Reference, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if opt != nil && opt.Type != "" {
|
|
||||||
u = fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, opt.Type)
|
|
||||||
} else {
|
|
||||||
u = fmt.Sprintf("repos/%v/%v/git/refs", owner, repo)
|
|
||||||
}
|
|
||||||
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 rs []*Reference
|
|
||||||
resp, err := s.client.Do(ctx, req, &rs)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return rs, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateRef creates a new ref in a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/git/refs/#create-a-reference
|
|
||||||
func (s *GitService) CreateRef(ctx context.Context, owner string, repo string, ref *Reference) (*Reference, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/git/refs", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("POST", u, &createRefRequest{
|
|
||||||
// back-compat with previous behavior that didn't require 'refs/' prefix
|
|
||||||
Ref: String("refs/" + strings.TrimPrefix(*ref.Ref, "refs/")),
|
|
||||||
SHA: ref.Object.SHA,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
r := new(Reference)
|
|
||||||
resp, err := s.client.Do(ctx, req, r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return r, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateRef updates an existing ref in a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/git/refs/#update-a-reference
|
|
||||||
func (s *GitService) UpdateRef(ctx context.Context, owner string, repo string, ref *Reference, force bool) (*Reference, *Response, error) {
|
|
||||||
refPath := strings.TrimPrefix(*ref.Ref, "refs/")
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, refPath)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, &updateRefRequest{
|
|
||||||
SHA: ref.Object.SHA,
|
|
||||||
Force: &force,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
r := new(Reference)
|
|
||||||
resp, err := s.client.Do(ctx, req, r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return r, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteRef deletes a ref from a repository.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
ref = strings.TrimPrefix(ref, "refs/")
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, ref)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
78
vendor/github.com/google/go-github/github/git_tags.go
generated
vendored
78
vendor/github.com/google/go-github/github/git_tags.go
generated
vendored
@ -1,78 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Tag represents a tag object.
|
|
||||||
type Tag struct {
|
|
||||||
Tag *string `json:"tag,omitempty"`
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
Tagger *CommitAuthor `json:"tagger,omitempty"`
|
|
||||||
Object *GitObject `json:"object,omitempty"`
|
|
||||||
Verification *SignatureVerification `json:"verification,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// createTagRequest represents the body of a CreateTag request. This is mostly
|
|
||||||
// identical to Tag with the exception that the object SHA and Type are
|
|
||||||
// top-level fields, rather than being nested inside a JSON object.
|
|
||||||
type createTagRequest struct {
|
|
||||||
Tag *string `json:"tag,omitempty"`
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
Object *string `json:"object,omitempty"`
|
|
||||||
Type *string `json:"type,omitempty"`
|
|
||||||
Tagger *CommitAuthor `json:"tagger,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetTag fetchs a tag from a repo given a SHA.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/git/tags/#get-a-tag
|
|
||||||
func (s *GitService) GetTag(ctx context.Context, owner string, repo string, sha string) (*Tag, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/git/tags/%v", 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", mediaTypeGitSigningPreview)
|
|
||||||
|
|
||||||
tag := new(Tag)
|
|
||||||
resp, err := s.client.Do(ctx, req, tag)
|
|
||||||
return tag, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateTag creates a tag object.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/git/tags/#create-a-tag-object
|
|
||||||
func (s *GitService) CreateTag(ctx context.Context, owner string, repo string, tag *Tag) (*Tag, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/git/tags", owner, repo)
|
|
||||||
|
|
||||||
// convert Tag into a createTagRequest
|
|
||||||
tagRequest := &createTagRequest{
|
|
||||||
Tag: tag.Tag,
|
|
||||||
Message: tag.Message,
|
|
||||||
Tagger: tag.Tagger,
|
|
||||||
}
|
|
||||||
if tag.Object != nil {
|
|
||||||
tagRequest.Object = tag.Object.SHA
|
|
||||||
tagRequest.Type = tag.Object.Type
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", u, tagRequest)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
t := new(Tag)
|
|
||||||
resp, err := s.client.Do(ctx, req, t)
|
|
||||||
return t, resp, err
|
|
||||||
}
|
|
93
vendor/github.com/google/go-github/github/git_trees.go
generated
vendored
93
vendor/github.com/google/go-github/github/git_trees.go
generated
vendored
@ -1,93 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Tree represents a GitHub tree.
|
|
||||||
type Tree struct {
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Entries []TreeEntry `json:"tree,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t Tree) String() string {
|
|
||||||
return Stringify(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TreeEntry represents the contents of a tree structure. TreeEntry can
|
|
||||||
// represent either a blob, a commit (in the case of a submodule), or another
|
|
||||||
// tree.
|
|
||||||
type TreeEntry 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"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t TreeEntry) String() string {
|
|
||||||
return Stringify(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *GitService) GetTree(ctx context.Context, owner string, repo string, sha string, recursive bool) (*Tree, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/git/trees/%v", owner, repo, sha)
|
|
||||||
if recursive {
|
|
||||||
u += "?recursive=1"
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
t := new(Tree)
|
|
||||||
resp, err := s.client.Do(ctx, req, t)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return t, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// createTree represents the body of a CreateTree request.
|
|
||||||
type createTree struct {
|
|
||||||
BaseTree string `json:"base_tree,omitempty"`
|
|
||||||
Entries []TreeEntry `json:"tree"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateTree creates a new tree in a repository. If both a tree and a nested
|
|
||||||
// path modifying that tree are specified, it will overwrite the contents of
|
|
||||||
// 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
|
|
||||||
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)
|
|
||||||
|
|
||||||
body := &createTree{
|
|
||||||
BaseTree: baseTree,
|
|
||||||
Entries: entries,
|
|
||||||
}
|
|
||||||
req, err := s.client.NewRequest("POST", u, body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
t := new(Tree)
|
|
||||||
resp, err := s.client.Do(ctx, req, t)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return t, resp, nil
|
|
||||||
}
|
|
7477
vendor/github.com/google/go-github/github/github-accessors.go
generated
vendored
7477
vendor/github.com/google/go-github/github/github-accessors.go
generated
vendored
File diff suppressed because it is too large
Load Diff
924
vendor/github.com/google/go-github/github/github.go
generated
vendored
924
vendor/github.com/google/go-github/github/github.go
generated
vendored
@ -1,924 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:generate go run gen-accessors.go
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/google/go-querystring/query"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
libraryVersion = "9"
|
|
||||||
defaultBaseURL = "https://api.github.com/"
|
|
||||||
uploadBaseURL = "https://uploads.github.com/"
|
|
||||||
userAgent = "go-github/" + libraryVersion
|
|
||||||
|
|
||||||
headerRateLimit = "X-RateLimit-Limit"
|
|
||||||
headerRateRemaining = "X-RateLimit-Remaining"
|
|
||||||
headerRateReset = "X-RateLimit-Reset"
|
|
||||||
headerOTP = "X-GitHub-OTP"
|
|
||||||
|
|
||||||
mediaTypeV3 = "application/vnd.github.v3+json"
|
|
||||||
defaultMediaType = "application/octet-stream"
|
|
||||||
mediaTypeV3SHA = "application/vnd.github.v3.sha"
|
|
||||||
mediaTypeV3Diff = "application/vnd.github.v3.diff"
|
|
||||||
mediaTypeV3Patch = "application/vnd.github.v3.patch"
|
|
||||||
mediaTypeOrgPermissionRepo = "application/vnd.github.v3.repository+json"
|
|
||||||
|
|
||||||
// Media Type values to access preview APIs
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2015-03-09-licenses-api/
|
|
||||||
mediaTypeLicensesPreview = "application/vnd.github.drax-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2014-12-09-new-attributes-for-stars-api/
|
|
||||||
mediaTypeStarringPreview = "application/vnd.github.v3.star+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2015-11-11-protected-branches-api/
|
|
||||||
mediaTypeProtectedBranchesPreview = "application/vnd.github.loki-preview+json"
|
|
||||||
|
|
||||||
// https://help.github.com/enterprise/2.4/admin/guides/migrations/exporting-the-github-com-organization-s-repositories/
|
|
||||||
mediaTypeMigrationsPreview = "application/vnd.github.wyandotte-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2016-04-06-deployment-and-deployment-status-enhancements/
|
|
||||||
mediaTypeDeploymentStatusPreview = "application/vnd.github.ant-man-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/
|
|
||||||
mediaTypeReactionsPreview = "application/vnd.github.squirrel-girl-preview"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2016-04-04-git-signing-api-preview/
|
|
||||||
mediaTypeGitSigningPreview = "application/vnd.github.cryptographer-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2016-05-23-timeline-preview-api/
|
|
||||||
mediaTypeTimelinePreview = "application/vnd.github.mockingbird-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2016-06-14-repository-invitations/
|
|
||||||
mediaTypeRepositoryInvitationsPreview = "application/vnd.github.swamp-thing-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/
|
|
||||||
mediaTypeProjectsPreview = "application/vnd.github.inertia-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2016-09-14-Integrations-Early-Access/
|
|
||||||
mediaTypeIntegrationPreview = "application/vnd.github.machine-man-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2017-01-05-commit-search-api/
|
|
||||||
mediaTypeCommitSearchPreview = "application/vnd.github.cloak-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2017-02-28-user-blocking-apis-and-webhook/
|
|
||||||
mediaTypeBlockUsersPreview = "application/vnd.github.giant-sentry-fist-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2017-02-09-community-health/
|
|
||||||
mediaTypeRepositoryCommunityHealthMetricsPreview = "application/vnd.github.black-panther-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2017-05-23-coc-api/
|
|
||||||
mediaTypeCodesOfConductPreview = "application/vnd.github.scarlet-witch-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2017-07-17-update-topics-on-repositories/
|
|
||||||
mediaTypeTopicsPreview = "application/vnd.github.mercy-preview+json"
|
|
||||||
|
|
||||||
// https://developer.github.com/changes/2017-07-26-team-review-request-thor-preview/
|
|
||||||
mediaTypeTeamReviewPreview = "application/vnd.github.thor-preview+json"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A Client manages communication with the GitHub API.
|
|
||||||
type Client struct {
|
|
||||||
clientMu sync.Mutex // clientMu protects the client during calls that modify the CheckRedirect func.
|
|
||||||
client *http.Client // HTTP client used to communicate with the API.
|
|
||||||
|
|
||||||
// Base URL for API requests. Defaults to the public GitHub API, but can be
|
|
||||||
// set to a domain endpoint to use with GitHub Enterprise. BaseURL should
|
|
||||||
// always be specified with a trailing slash.
|
|
||||||
BaseURL *url.URL
|
|
||||||
|
|
||||||
// Base URL for uploading files.
|
|
||||||
UploadURL *url.URL
|
|
||||||
|
|
||||||
// User agent used when communicating with the GitHub API.
|
|
||||||
UserAgent string
|
|
||||||
|
|
||||||
rateMu sync.Mutex
|
|
||||||
rateLimits [categories]Rate // Rate limits for the client as determined by the most recent API calls.
|
|
||||||
|
|
||||||
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.
|
|
||||||
Activity *ActivityService
|
|
||||||
Admin *AdminService
|
|
||||||
Apps *AppsService
|
|
||||||
Authorizations *AuthorizationsService
|
|
||||||
Gists *GistsService
|
|
||||||
Git *GitService
|
|
||||||
Gitignores *GitignoresService
|
|
||||||
Issues *IssuesService
|
|
||||||
Organizations *OrganizationsService
|
|
||||||
Projects *ProjectsService
|
|
||||||
PullRequests *PullRequestsService
|
|
||||||
Repositories *RepositoriesService
|
|
||||||
Search *SearchService
|
|
||||||
Users *UsersService
|
|
||||||
Licenses *LicensesService
|
|
||||||
Migrations *MigrationService
|
|
||||||
Reactions *ReactionsService
|
|
||||||
}
|
|
||||||
|
|
||||||
type service struct {
|
|
||||||
client *Client
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListOptions specifies the optional parameters to various List methods that
|
|
||||||
// support pagination.
|
|
||||||
type ListOptions struct {
|
|
||||||
// For paginated result sets, page of results to retrieve.
|
|
||||||
Page int `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.
|
|
||||||
type UploadOptions struct {
|
|
||||||
Name string `url:"name,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RawType represents type of raw format of a request instead of JSON.
|
|
||||||
type RawType uint8
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Diff format.
|
|
||||||
Diff RawType = 1 + iota
|
|
||||||
// Patch format.
|
|
||||||
Patch
|
|
||||||
)
|
|
||||||
|
|
||||||
// RawOptions specifies parameters when user wants to get raw format of
|
|
||||||
// a response instead of JSON.
|
|
||||||
type RawOptions struct {
|
|
||||||
Type RawType
|
|
||||||
}
|
|
||||||
|
|
||||||
// addOptions adds the parameters in opt as URL query parameters to s. opt
|
|
||||||
// must be a struct whose fields may contain "url" tags.
|
|
||||||
func addOptions(s string, opt interface{}) (string, error) {
|
|
||||||
v := reflect.ValueOf(opt)
|
|
||||||
if v.Kind() == reflect.Ptr && v.IsNil() {
|
|
||||||
return s, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
u, err := url.Parse(s)
|
|
||||||
if err != nil {
|
|
||||||
return s, err
|
|
||||||
}
|
|
||||||
|
|
||||||
qs, err := query.Values(opt)
|
|
||||||
if err != nil {
|
|
||||||
return s, err
|
|
||||||
}
|
|
||||||
|
|
||||||
u.RawQuery = qs.Encode()
|
|
||||||
return u.String(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewClient returns a new GitHub API client. If a nil httpClient is
|
|
||||||
// provided, http.DefaultClient will be used. To use API methods which require
|
|
||||||
// authentication, provide an http.Client that will perform the authentication
|
|
||||||
// for you (such as that provided by the golang.org/x/oauth2 library).
|
|
||||||
func NewClient(httpClient *http.Client) *Client {
|
|
||||||
if httpClient == nil {
|
|
||||||
httpClient = http.DefaultClient
|
|
||||||
}
|
|
||||||
baseURL, _ := url.Parse(defaultBaseURL)
|
|
||||||
uploadURL, _ := url.Parse(uploadBaseURL)
|
|
||||||
|
|
||||||
c := &Client{client: httpClient, BaseURL: baseURL, UserAgent: userAgent, UploadURL: uploadURL}
|
|
||||||
c.common.client = c
|
|
||||||
c.Activity = (*ActivityService)(&c.common)
|
|
||||||
c.Admin = (*AdminService)(&c.common)
|
|
||||||
c.Apps = (*AppsService)(&c.common)
|
|
||||||
c.Authorizations = (*AuthorizationsService)(&c.common)
|
|
||||||
c.Gists = (*GistsService)(&c.common)
|
|
||||||
c.Git = (*GitService)(&c.common)
|
|
||||||
c.Gitignores = (*GitignoresService)(&c.common)
|
|
||||||
c.Issues = (*IssuesService)(&c.common)
|
|
||||||
c.Licenses = (*LicensesService)(&c.common)
|
|
||||||
c.Migrations = (*MigrationService)(&c.common)
|
|
||||||
c.Organizations = (*OrganizationsService)(&c.common)
|
|
||||||
c.Projects = (*ProjectsService)(&c.common)
|
|
||||||
c.PullRequests = (*PullRequestsService)(&c.common)
|
|
||||||
c.Reactions = (*ReactionsService)(&c.common)
|
|
||||||
c.Repositories = (*RepositoriesService)(&c.common)
|
|
||||||
c.Search = (*SearchService)(&c.common)
|
|
||||||
c.Users = (*UsersService)(&c.common)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewRequest creates an API request. A relative URL can be provided in urlStr,
|
|
||||||
// in which case it is resolved relative to the BaseURL of the Client.
|
|
||||||
// Relative URLs should always be specified without a preceding slash. If
|
|
||||||
// specified, the value pointed to by body is JSON encoded and included as the
|
|
||||||
// request body.
|
|
||||||
func (c *Client) NewRequest(method, urlStr string, body interface{}) (*http.Request, error) {
|
|
||||||
if !strings.HasSuffix(c.BaseURL.Path, "/") {
|
|
||||||
return nil, fmt.Errorf("BaseURL must have a trailing slash, but %q does not", c.BaseURL)
|
|
||||||
}
|
|
||||||
u, err := c.BaseURL.Parse(urlStr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var buf io.ReadWriter
|
|
||||||
if body != nil {
|
|
||||||
buf = new(bytes.Buffer)
|
|
||||||
err := json.NewEncoder(buf).Encode(body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := http.NewRequest(method, u.String(), buf)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if body != nil {
|
|
||||||
req.Header.Set("Content-Type", "application/json")
|
|
||||||
}
|
|
||||||
req.Header.Set("Accept", mediaTypeV3)
|
|
||||||
if c.UserAgent != "" {
|
|
||||||
req.Header.Set("User-Agent", c.UserAgent)
|
|
||||||
}
|
|
||||||
return req, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewUploadRequest creates an upload request. A relative URL can be provided in
|
|
||||||
// urlStr, in which case it is resolved relative to the UploadURL of the Client.
|
|
||||||
// Relative URLs should always be specified without a preceding slash.
|
|
||||||
func (c *Client) NewUploadRequest(urlStr string, reader io.Reader, size int64, mediaType string) (*http.Request, error) {
|
|
||||||
if !strings.HasSuffix(c.UploadURL.Path, "/") {
|
|
||||||
return nil, fmt.Errorf("UploadURL must have a trailing slash, but %q does not", c.UploadURL)
|
|
||||||
}
|
|
||||||
u, err := c.UploadURL.Parse(urlStr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := http.NewRequest("POST", u.String(), reader)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
req.ContentLength = size
|
|
||||||
|
|
||||||
if mediaType == "" {
|
|
||||||
mediaType = defaultMediaType
|
|
||||||
}
|
|
||||||
req.Header.Set("Content-Type", mediaType)
|
|
||||||
req.Header.Set("Accept", mediaTypeV3)
|
|
||||||
req.Header.Set("User-Agent", c.UserAgent)
|
|
||||||
return req, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Response is a GitHub API response. This wraps the standard http.Response
|
|
||||||
// returned from GitHub and provides convenient access to things like
|
|
||||||
// pagination links.
|
|
||||||
type Response struct {
|
|
||||||
*http.Response
|
|
||||||
|
|
||||||
// These fields provide the page values for paginating through a set of
|
|
||||||
// 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
|
|
||||||
// are no additional pages.
|
|
||||||
|
|
||||||
NextPage int
|
|
||||||
PrevPage int
|
|
||||||
FirstPage int
|
|
||||||
LastPage int
|
|
||||||
|
|
||||||
Rate
|
|
||||||
}
|
|
||||||
|
|
||||||
// newResponse creates a new Response for the provided http.Response.
|
|
||||||
// r must not be nil.
|
|
||||||
func newResponse(r *http.Response) *Response {
|
|
||||||
response := &Response{Response: r}
|
|
||||||
response.populatePageValues()
|
|
||||||
response.Rate = parseRate(r)
|
|
||||||
return response
|
|
||||||
}
|
|
||||||
|
|
||||||
// populatePageValues parses the HTTP Link response headers and populates the
|
|
||||||
// various pagination link values in the Response.
|
|
||||||
func (r *Response) populatePageValues() {
|
|
||||||
if links, ok := r.Response.Header["Link"]; ok && len(links) > 0 {
|
|
||||||
for _, link := range strings.Split(links[0], ",") {
|
|
||||||
segments := strings.Split(strings.TrimSpace(link), ";")
|
|
||||||
|
|
||||||
// link must at least have href and rel
|
|
||||||
if len(segments) < 2 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// ensure href is properly formatted
|
|
||||||
if !strings.HasPrefix(segments[0], "<") || !strings.HasSuffix(segments[0], ">") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// try to pull out page parameter
|
|
||||||
url, err := url.Parse(segments[0][1 : len(segments[0])-1])
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
page := url.Query().Get("page")
|
|
||||||
if page == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, segment := range segments[1:] {
|
|
||||||
switch strings.TrimSpace(segment) {
|
|
||||||
case `rel="next"`:
|
|
||||||
r.NextPage, _ = strconv.Atoi(page)
|
|
||||||
case `rel="prev"`:
|
|
||||||
r.PrevPage, _ = strconv.Atoi(page)
|
|
||||||
case `rel="first"`:
|
|
||||||
r.FirstPage, _ = strconv.Atoi(page)
|
|
||||||
case `rel="last"`:
|
|
||||||
r.LastPage, _ = strconv.Atoi(page)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parseRate parses the rate related headers.
|
|
||||||
func parseRate(r *http.Response) Rate {
|
|
||||||
var rate Rate
|
|
||||||
if limit := r.Header.Get(headerRateLimit); limit != "" {
|
|
||||||
rate.Limit, _ = strconv.Atoi(limit)
|
|
||||||
}
|
|
||||||
if remaining := r.Header.Get(headerRateRemaining); remaining != "" {
|
|
||||||
rate.Remaining, _ = strconv.Atoi(remaining)
|
|
||||||
}
|
|
||||||
if reset := r.Header.Get(headerRateReset); reset != "" {
|
|
||||||
if v, _ := strconv.ParseInt(reset, 10, 64); v != 0 {
|
|
||||||
rate.Reset = Timestamp{time.Unix(v, 0)}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rate
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do sends an API request and returns the API response. The API response is
|
|
||||||
// JSON decoded and stored in the value pointed to by v, or returned as an
|
|
||||||
// error if an API error has occurred. If v implements the io.Writer
|
|
||||||
// interface, the raw response body will be written to v, without attempting to
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// The provided ctx must be non-nil. If it is canceled or times out,
|
|
||||||
// ctx.Err() will be returned.
|
|
||||||
func (c *Client) Do(ctx context.Context, req *http.Request, v interface{}) (*Response, error) {
|
|
||||||
req = withContext(ctx, req)
|
|
||||||
|
|
||||||
rateLimitCategory := category(req.URL.Path)
|
|
||||||
|
|
||||||
// If we've hit rate limit, don't make further requests before Reset time.
|
|
||||||
if err := c.checkRateLimitBeforeDo(req, rateLimitCategory); err != nil {
|
|
||||||
return &Response{
|
|
||||||
Response: err.Response,
|
|
||||||
Rate: err.Rate,
|
|
||||||
}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := c.client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
// If we got an error, and the context has been canceled,
|
|
||||||
// the context's error is probably more useful.
|
|
||||||
select {
|
|
||||||
case <-ctx.Done():
|
|
||||||
return nil, ctx.Err()
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the error type is *url.Error, sanitize its URL before returning.
|
|
||||||
if e, ok := err.(*url.Error); ok {
|
|
||||||
if url, err := url.Parse(e.URL); err == nil {
|
|
||||||
e.URL = sanitizeURL(url).String()
|
|
||||||
return nil, e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
// Drain up to 512 bytes and close the body to let the Transport reuse the connection
|
|
||||||
io.CopyN(ioutil.Discard, resp.Body, 512)
|
|
||||||
resp.Body.Close()
|
|
||||||
}()
|
|
||||||
|
|
||||||
response := newResponse(resp)
|
|
||||||
|
|
||||||
c.rateMu.Lock()
|
|
||||||
c.rateLimits[rateLimitCategory] = response.Rate
|
|
||||||
c.rateMu.Unlock()
|
|
||||||
|
|
||||||
err = CheckResponse(resp)
|
|
||||||
if err != nil {
|
|
||||||
// even though there was an error, we still return the response
|
|
||||||
// in case the caller wants to inspect it further
|
|
||||||
return response, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if v != nil {
|
|
||||||
if w, ok := v.(io.Writer); ok {
|
|
||||||
io.Copy(w, resp.Body)
|
|
||||||
} else {
|
|
||||||
err = json.NewDecoder(resp.Body).Decode(v)
|
|
||||||
if err == io.EOF {
|
|
||||||
err = nil // ignore EOF errors caused by empty response body
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return response, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkRateLimitBeforeDo does not make any network calls, but uses existing knowledge from
|
|
||||||
// current client state in order to quickly check if *RateLimitError can be immediately returned
|
|
||||||
// from Client.Do, and if so, returns it so that Client.Do can skip making a network API call unnecessarily.
|
|
||||||
// Otherwise it returns nil, and Client.Do should proceed normally.
|
|
||||||
func (c *Client) checkRateLimitBeforeDo(req *http.Request, rateLimitCategory rateLimitCategory) *RateLimitError {
|
|
||||||
c.rateMu.Lock()
|
|
||||||
rate := c.rateLimits[rateLimitCategory]
|
|
||||||
c.rateMu.Unlock()
|
|
||||||
if !rate.Reset.Time.IsZero() && rate.Remaining == 0 && time.Now().Before(rate.Reset.Time) {
|
|
||||||
// Create a fake response.
|
|
||||||
resp := &http.Response{
|
|
||||||
Status: http.StatusText(http.StatusForbidden),
|
|
||||||
StatusCode: http.StatusForbidden,
|
|
||||||
Request: req,
|
|
||||||
Header: make(http.Header),
|
|
||||||
Body: ioutil.NopCloser(strings.NewReader("")),
|
|
||||||
}
|
|
||||||
return &RateLimitError{
|
|
||||||
Rate: rate,
|
|
||||||
Response: resp,
|
|
||||||
Message: fmt.Sprintf("API rate limit of %v still exceeded until %v, not making remote request.", rate.Limit, rate.Reset.Time),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
An ErrorResponse reports one or more errors caused by an API request.
|
|
||||||
|
|
||||||
GitHub API docs: https://developer.github.com/v3/#client-errors
|
|
||||||
*/
|
|
||||||
type ErrorResponse struct {
|
|
||||||
Response *http.Response // HTTP response that caused this error
|
|
||||||
Message string `json:"message"` // error message
|
|
||||||
Errors []Error `json:"errors"` // more detail on individual errors
|
|
||||||
// Block is only populated on certain types of errors such as code 451.
|
|
||||||
// See https://developer.github.com/changes/2016-03-17-the-451-status-code-is-now-supported/
|
|
||||||
// for more information.
|
|
||||||
Block *struct {
|
|
||||||
Reason string `json:"reason,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
} `json:"block,omitempty"`
|
|
||||||
// Most errors will also include a documentation_url field pointing
|
|
||||||
// to some content that might help you resolve the error, see
|
|
||||||
// https://developer.github.com/v3/#client-errors
|
|
||||||
DocumentationURL string `json:"documentation_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *ErrorResponse) Error() string {
|
|
||||||
return fmt.Sprintf("%v %v: %d %v %+v",
|
|
||||||
r.Response.Request.Method, sanitizeURL(r.Response.Request.URL),
|
|
||||||
r.Response.StatusCode, r.Message, r.Errors)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TwoFactorAuthError occurs when using HTTP Basic Authentication for a user
|
|
||||||
// that has two-factor authentication enabled. The request can be reattempted
|
|
||||||
// by providing a one-time password in the request.
|
|
||||||
type TwoFactorAuthError ErrorResponse
|
|
||||||
|
|
||||||
func (r *TwoFactorAuthError) Error() string { return (*ErrorResponse)(r).Error() }
|
|
||||||
|
|
||||||
// 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 ".
|
|
||||||
type RateLimitError struct {
|
|
||||||
Rate Rate // Rate specifies last known rate limit for the client
|
|
||||||
Response *http.Response // HTTP response that caused this error
|
|
||||||
Message string `json:"message"` // error message
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *RateLimitError) Error() string {
|
|
||||||
return fmt.Sprintf("%v %v: %d %v %v",
|
|
||||||
r.Response.Request.Method, sanitizeURL(r.Response.Request.URL),
|
|
||||||
r.Response.StatusCode, r.Message, formatRateReset(r.Rate.Reset.Time.Sub(time.Now())))
|
|
||||||
}
|
|
||||||
|
|
||||||
// AcceptedError occurs when GitHub returns 202 Accepted response with an
|
|
||||||
// empty body, which means a job was scheduled on the GitHub side to process
|
|
||||||
// the information needed and cache it.
|
|
||||||
// Technically, 202 Accepted is not a real error, it's just used to
|
|
||||||
// indicate that results are not ready yet, but should be available soon.
|
|
||||||
// The request can be repeated after some time.
|
|
||||||
type AcceptedError struct{}
|
|
||||||
|
|
||||||
func (*AcceptedError) Error() string {
|
|
||||||
return "job scheduled on GitHub side; try again later"
|
|
||||||
}
|
|
||||||
|
|
||||||
// AbuseRateLimitError occurs when GitHub returns 403 Forbidden response with the
|
|
||||||
// "documentation_url" field value equal to "https://developer.github.com/v3#abuse-rate-limits".
|
|
||||||
type AbuseRateLimitError struct {
|
|
||||||
Response *http.Response // HTTP response that caused this error
|
|
||||||
Message string `json:"message"` // error message
|
|
||||||
|
|
||||||
// RetryAfter is provided with some abuse rate limit errors. If present,
|
|
||||||
// it is the amount of time that the client should wait before retrying.
|
|
||||||
// Otherwise, the client should try again later (after an unspecified amount of time).
|
|
||||||
RetryAfter *time.Duration
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AbuseRateLimitError) Error() string {
|
|
||||||
return fmt.Sprintf("%v %v: %d %v",
|
|
||||||
r.Response.Request.Method, sanitizeURL(r.Response.Request.URL),
|
|
||||||
r.Response.StatusCode, r.Message)
|
|
||||||
}
|
|
||||||
|
|
||||||
// sanitizeURL redacts the client_secret parameter from the URL which may be
|
|
||||||
// exposed to the user.
|
|
||||||
func sanitizeURL(uri *url.URL) *url.URL {
|
|
||||||
if uri == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
params := uri.Query()
|
|
||||||
if len(params.Get("client_secret")) > 0 {
|
|
||||||
params.Set("client_secret", "REDACTED")
|
|
||||||
uri.RawQuery = params.Encode()
|
|
||||||
}
|
|
||||||
return uri
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
An Error reports more details on an individual error in an ErrorResponse.
|
|
||||||
These are the possible validation error codes:
|
|
||||||
|
|
||||||
missing:
|
|
||||||
resource does not exist
|
|
||||||
missing_field:
|
|
||||||
a required field on a resource has not been set
|
|
||||||
invalid:
|
|
||||||
the formatting of a field is invalid
|
|
||||||
already_exists:
|
|
||||||
another resource has the same valid as this field
|
|
||||||
custom:
|
|
||||||
some resources return this (e.g. github.User.CreateKey()), additional
|
|
||||||
information is set in the Message field of the Error
|
|
||||||
|
|
||||||
GitHub API docs: https://developer.github.com/v3/#client-errors
|
|
||||||
*/
|
|
||||||
type Error struct {
|
|
||||||
Resource string `json:"resource"` // resource on which the error occurred
|
|
||||||
Field string `json:"field"` // field on which the error occurred
|
|
||||||
Code string `json:"code"` // validation error code
|
|
||||||
Message string `json:"message"` // Message describing the error. Errors with Code == "custom" will always have this set.
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *Error) Error() string {
|
|
||||||
return fmt.Sprintf("%v error caused by %v field on %v resource",
|
|
||||||
e.Code, e.Field, e.Resource)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
// the 200 range or equal to 202 Accepted.
|
|
||||||
// API error responses are expected to have either no response
|
|
||||||
// body, or a JSON response body that maps to ErrorResponse. Any other
|
|
||||||
// response body will be silently ignored.
|
|
||||||
//
|
|
||||||
// The error type will be *RateLimitError for rate limit exceeded errors,
|
|
||||||
// *AcceptedError for 202 Accepted status codes,
|
|
||||||
// and *TwoFactorAuthError for two-factor authentication errors.
|
|
||||||
func CheckResponse(r *http.Response) error {
|
|
||||||
if r.StatusCode == http.StatusAccepted {
|
|
||||||
return &AcceptedError{}
|
|
||||||
}
|
|
||||||
if c := r.StatusCode; 200 <= c && c <= 299 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
errorResponse := &ErrorResponse{Response: r}
|
|
||||||
data, err := ioutil.ReadAll(r.Body)
|
|
||||||
if err == nil && data != nil {
|
|
||||||
json.Unmarshal(data, errorResponse)
|
|
||||||
}
|
|
||||||
switch {
|
|
||||||
case r.StatusCode == http.StatusUnauthorized && strings.HasPrefix(r.Header.Get(headerOTP), "required"):
|
|
||||||
return (*TwoFactorAuthError)(errorResponse)
|
|
||||||
case r.StatusCode == http.StatusForbidden && r.Header.Get(headerRateRemaining) == "0" && strings.HasPrefix(errorResponse.Message, "API rate limit exceeded for "):
|
|
||||||
return &RateLimitError{
|
|
||||||
Rate: parseRate(r),
|
|
||||||
Response: errorResponse.Response,
|
|
||||||
Message: errorResponse.Message,
|
|
||||||
}
|
|
||||||
case r.StatusCode == http.StatusForbidden && errorResponse.DocumentationURL == "https://developer.github.com/v3#abuse-rate-limits":
|
|
||||||
abuseRateLimitError := &AbuseRateLimitError{
|
|
||||||
Response: errorResponse.Response,
|
|
||||||
Message: errorResponse.Message,
|
|
||||||
}
|
|
||||||
if v := r.Header["Retry-After"]; len(v) > 0 {
|
|
||||||
// According to GitHub support, the "Retry-After" header value will be
|
|
||||||
// an integer which represents the number of seconds that one should
|
|
||||||
// wait before resuming making requests.
|
|
||||||
retryAfterSeconds, _ := strconv.ParseInt(v[0], 10, 64) // Error handling is noop.
|
|
||||||
retryAfter := time.Duration(retryAfterSeconds) * time.Second
|
|
||||||
abuseRateLimitError.RetryAfter = &retryAfter
|
|
||||||
}
|
|
||||||
return abuseRateLimitError
|
|
||||||
default:
|
|
||||||
return errorResponse
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parseBoolResponse determines the boolean result from a GitHub API response.
|
|
||||||
// Several GitHub API methods return boolean responses indicated by the HTTP
|
|
||||||
// status code in the response (true indicated by a 204, false indicated by a
|
|
||||||
// 404). This helper function will determine that result and hide the 404
|
|
||||||
// error if present. Any other error will be returned through as-is.
|
|
||||||
func parseBoolResponse(err error) (bool, error) {
|
|
||||||
if err == nil {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err, ok := err.(*ErrorResponse); ok && err.Response.StatusCode == http.StatusNotFound {
|
|
||||||
// Simply false. In this one case, we do not pass the error through.
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// some other real error occurred
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rate represents the rate limit for the current client.
|
|
||||||
type Rate struct {
|
|
||||||
// The number of requests per hour the client is currently limited to.
|
|
||||||
Limit int `json:"limit"`
|
|
||||||
|
|
||||||
// The number of remaining requests the client can make this hour.
|
|
||||||
Remaining int `json:"remaining"`
|
|
||||||
|
|
||||||
// The time at which the current rate limit will reset.
|
|
||||||
Reset Timestamp `json:"reset"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r Rate) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RateLimits represents the rate limits for the current client.
|
|
||||||
type RateLimits struct {
|
|
||||||
// The rate limit for non-search API requests. Unauthenticated
|
|
||||||
// requests are limited to 60 per hour. Authenticated requests are
|
|
||||||
// limited to 5,000 per hour.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/#rate-limiting
|
|
||||||
Core *Rate `json:"core"`
|
|
||||||
|
|
||||||
// The rate limit for search API requests. Unauthenticated requests
|
|
||||||
// are limited to 10 requests per minutes. Authenticated requests are
|
|
||||||
// limited to 30 per minute.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/search/#rate-limit
|
|
||||||
Search *Rate `json:"search"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r RateLimits) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
type rateLimitCategory uint8
|
|
||||||
|
|
||||||
const (
|
|
||||||
coreCategory rateLimitCategory = iota
|
|
||||||
searchCategory
|
|
||||||
|
|
||||||
categories // An array of this length will be able to contain all rate limit categories.
|
|
||||||
)
|
|
||||||
|
|
||||||
// category returns the rate limit category of the endpoint, determined by Request.URL.Path.
|
|
||||||
func category(path string) rateLimitCategory {
|
|
||||||
switch {
|
|
||||||
default:
|
|
||||||
return coreCategory
|
|
||||||
case strings.HasPrefix(path, "/search/"):
|
|
||||||
return searchCategory
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// RateLimits returns the rate limits for the current client.
|
|
||||||
func (c *Client) RateLimits(ctx context.Context) (*RateLimits, *Response, error) {
|
|
||||||
req, err := c.NewRequest("GET", "rate_limit", nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
response := new(struct {
|
|
||||||
Resources *RateLimits `json:"resources"`
|
|
||||||
})
|
|
||||||
resp, err := c.Do(ctx, req, response)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if response.Resources != nil {
|
|
||||||
c.rateMu.Lock()
|
|
||||||
if response.Resources.Core != nil {
|
|
||||||
c.rateLimits[coreCategory] = *response.Resources.Core
|
|
||||||
}
|
|
||||||
if response.Resources.Search != nil {
|
|
||||||
c.rateLimits[searchCategory] = *response.Resources.Search
|
|
||||||
}
|
|
||||||
c.rateMu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
return response.Resources, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
UnauthenticatedRateLimitedTransport allows you to make unauthenticated calls
|
|
||||||
that need to use a higher rate limit associated with your OAuth application.
|
|
||||||
|
|
||||||
t := &github.UnauthenticatedRateLimitedTransport{
|
|
||||||
ClientID: "your app's client ID",
|
|
||||||
ClientSecret: "your app's client secret",
|
|
||||||
}
|
|
||||||
client := github.NewClient(t.Client())
|
|
||||||
|
|
||||||
This will append the querystring params client_id=xxx&client_secret=yyy to all
|
|
||||||
requests.
|
|
||||||
|
|
||||||
See https://developer.github.com/v3/#unauthenticated-rate-limited-requests for
|
|
||||||
more information.
|
|
||||||
*/
|
|
||||||
type UnauthenticatedRateLimitedTransport struct {
|
|
||||||
// ClientID is the GitHub OAuth client ID of the current application, which
|
|
||||||
// can be found by selecting its entry in the list at
|
|
||||||
// https://github.com/settings/applications.
|
|
||||||
ClientID string
|
|
||||||
|
|
||||||
// ClientSecret is the GitHub OAuth client secret of the current
|
|
||||||
// application.
|
|
||||||
ClientSecret string
|
|
||||||
|
|
||||||
// Transport is the underlying HTTP transport to use when making requests.
|
|
||||||
// It will default to http.DefaultTransport if nil.
|
|
||||||
Transport http.RoundTripper
|
|
||||||
}
|
|
||||||
|
|
||||||
// RoundTrip implements the RoundTripper interface.
|
|
||||||
func (t *UnauthenticatedRateLimitedTransport) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
||||||
if t.ClientID == "" {
|
|
||||||
return nil, errors.New("t.ClientID is empty")
|
|
||||||
}
|
|
||||||
if t.ClientSecret == "" {
|
|
||||||
return nil, errors.New("t.ClientSecret is empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
// To set extra querystring params, 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.
|
|
||||||
req = cloneRequest(req)
|
|
||||||
q := req.URL.Query()
|
|
||||||
q.Set("client_id", t.ClientID)
|
|
||||||
q.Set("client_secret", t.ClientSecret)
|
|
||||||
req.URL.RawQuery = q.Encode()
|
|
||||||
|
|
||||||
// Make the HTTP request.
|
|
||||||
return t.transport().RoundTrip(req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Client returns an *http.Client that makes requests which are subject to the
|
|
||||||
// rate limit of your OAuth application.
|
|
||||||
func (t *UnauthenticatedRateLimitedTransport) Client() *http.Client {
|
|
||||||
return &http.Client{Transport: t}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *UnauthenticatedRateLimitedTransport) transport() http.RoundTripper {
|
|
||||||
if t.Transport != nil {
|
|
||||||
return t.Transport
|
|
||||||
}
|
|
||||||
return http.DefaultTransport
|
|
||||||
}
|
|
||||||
|
|
||||||
// BasicAuthTransport is an http.RoundTripper that authenticates all requests
|
|
||||||
// using HTTP Basic Authentication with the provided username and password. It
|
|
||||||
// additionally supports users who have two-factor authentication enabled on
|
|
||||||
// their GitHub account.
|
|
||||||
type BasicAuthTransport struct {
|
|
||||||
Username string // GitHub username
|
|
||||||
Password string // GitHub password
|
|
||||||
OTP string // one-time password for users with two-factor auth enabled
|
|
||||||
|
|
||||||
// Transport is the underlying HTTP transport to use when making requests.
|
|
||||||
// It will default to http.DefaultTransport if nil.
|
|
||||||
Transport http.RoundTripper
|
|
||||||
}
|
|
||||||
|
|
||||||
// RoundTrip implements the RoundTripper interface.
|
|
||||||
func (t *BasicAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) {
|
|
||||||
req = cloneRequest(req) // per RoundTrip contract
|
|
||||||
req.SetBasicAuth(t.Username, t.Password)
|
|
||||||
if t.OTP != "" {
|
|
||||||
req.Header.Set(headerOTP, t.OTP)
|
|
||||||
}
|
|
||||||
return t.transport().RoundTrip(req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Client returns an *http.Client that makes requests that are authenticated
|
|
||||||
// using HTTP Basic Authentication.
|
|
||||||
func (t *BasicAuthTransport) Client() *http.Client {
|
|
||||||
return &http.Client{Transport: t}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *BasicAuthTransport) transport() http.RoundTripper {
|
|
||||||
if t.Transport != nil {
|
|
||||||
return t.Transport
|
|
||||||
}
|
|
||||||
return http.DefaultTransport
|
|
||||||
}
|
|
||||||
|
|
||||||
// cloneRequest returns a clone of the provided *http.Request. The clone is a
|
|
||||||
// shallow copy of the struct and its Header map.
|
|
||||||
func cloneRequest(r *http.Request) *http.Request {
|
|
||||||
// shallow copy of the struct
|
|
||||||
r2 := new(http.Request)
|
|
||||||
*r2 = *r
|
|
||||||
// deep copy of the Header
|
|
||||||
r2.Header = make(http.Header, len(r.Header))
|
|
||||||
for k, s := range r.Header {
|
|
||||||
r2.Header[k] = append([]string(nil), s...)
|
|
||||||
}
|
|
||||||
return r2
|
|
||||||
}
|
|
||||||
|
|
||||||
// formatRateReset formats d to look like "[rate reset in 2s]" or
|
|
||||||
// "[rate reset in 87m02s]" for the positive durations. And like "[rate limit was reset 87m02s ago]"
|
|
||||||
// for the negative cases.
|
|
||||||
func formatRateReset(d time.Duration) string {
|
|
||||||
isNegative := d < 0
|
|
||||||
if isNegative {
|
|
||||||
d *= -1
|
|
||||||
}
|
|
||||||
secondsTotal := int(0.5 + d.Seconds())
|
|
||||||
minutes := secondsTotal / 60
|
|
||||||
seconds := secondsTotal - minutes*60
|
|
||||||
|
|
||||||
var timeString string
|
|
||||||
if minutes > 0 {
|
|
||||||
timeString = fmt.Sprintf("%dm%02ds", minutes, seconds)
|
|
||||||
} else {
|
|
||||||
timeString = fmt.Sprintf("%ds", seconds)
|
|
||||||
}
|
|
||||||
|
|
||||||
if isNegative {
|
|
||||||
return fmt.Sprintf("[rate limit was reset %v ago]", timeString)
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("[rate reset in %v]", timeString)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bool is a helper routine that allocates a new bool value
|
|
||||||
// to store v and returns a pointer to it.
|
|
||||||
func Bool(v bool) *bool { return &v }
|
|
||||||
|
|
||||||
// Int is a helper routine that allocates a new int value
|
|
||||||
// to store v and returns a pointer to it.
|
|
||||||
func Int(v int) *int { return &v }
|
|
||||||
|
|
||||||
// String is a helper routine that allocates a new string value
|
|
||||||
// to store v and returns a pointer to it.
|
|
||||||
func String(v string) *string { return &v }
|
|
64
vendor/github.com/google/go-github/github/gitignore.go
generated
vendored
64
vendor/github.com/google/go-github/github/gitignore.go
generated
vendored
@ -1,64 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GitignoresService provides access to the gitignore related functions in the
|
|
||||||
// GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gitignore/
|
|
||||||
type GitignoresService service
|
|
||||||
|
|
||||||
// Gitignore represents a .gitignore file as returned by the GitHub API.
|
|
||||||
type Gitignore struct {
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Source *string `json:"source,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (g Gitignore) String() string {
|
|
||||||
return Stringify(g)
|
|
||||||
}
|
|
||||||
|
|
||||||
// List all available Gitignore templates.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gitignore/#listing-available-templates
|
|
||||||
func (s GitignoresService) List(ctx context.Context) ([]string, *Response, error) {
|
|
||||||
req, err := s.client.NewRequest("GET", "gitignore/templates", nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var availableTemplates []string
|
|
||||||
resp, err := s.client.Do(ctx, req, &availableTemplates)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return availableTemplates, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a Gitignore by name.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/gitignore/#get-a-single-template
|
|
||||||
func (s GitignoresService) Get(ctx context.Context, name string) (*Gitignore, *Response, error) {
|
|
||||||
u := fmt.Sprintf("gitignore/templates/%v", name)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
gitignore := new(Gitignore)
|
|
||||||
resp, err := s.client.Do(ctx, req, gitignore)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return gitignore, resp, nil
|
|
||||||
}
|
|
307
vendor/github.com/google/go-github/github/issues.go
generated
vendored
307
vendor/github.com/google/go-github/github/issues.go
generated
vendored
@ -1,307 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IssuesService handles communication with the issue related
|
|
||||||
// methods of the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/
|
|
||||||
type IssuesService service
|
|
||||||
|
|
||||||
// Issue represents a GitHub issue on a repository.
|
|
||||||
//
|
|
||||||
// Note: As far as the GitHub API is concerned, every pull request is an issue,
|
|
||||||
// but not every issue is a pull request. Some endpoints, events, and webhooks
|
|
||||||
// may also return pull requests via this struct. If PullRequestLinks is nil,
|
|
||||||
// this is an issue, and if PullRequestLinks is not nil, this is a pull request.
|
|
||||||
type Issue struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Number *int `json:"number,omitempty"`
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
Locked *bool `json:"locked,omitempty"`
|
|
||||||
Title *string `json:"title,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
Labels []Label `json:"labels,omitempty"`
|
|
||||||
Assignee *User `json:"assignee,omitempty"`
|
|
||||||
Comments *int `json:"comments,omitempty"`
|
|
||||||
ClosedAt *time.Time `json:"closed_at,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
ClosedBy *User `json:"closed_by,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
Milestone *Milestone `json:"milestone,omitempty"`
|
|
||||||
PullRequestLinks *PullRequestLinks `json:"pull_request,omitempty"`
|
|
||||||
Repository *Repository `json:"repository,omitempty"`
|
|
||||||
Reactions *Reactions `json:"reactions,omitempty"`
|
|
||||||
Assignees []*User `json:"assignees,omitempty"`
|
|
||||||
|
|
||||||
// TextMatches is only populated from search results that request text matches
|
|
||||||
// See: search.go and https://developer.github.com/v3/search/#text-match-metadata
|
|
||||||
TextMatches []TextMatch `json:"text_matches,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i Issue) String() string {
|
|
||||||
return Stringify(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IssueRequest represents a request to create/edit an issue.
|
|
||||||
// It is separate from Issue above because otherwise Labels
|
|
||||||
// and Assignee fail to serialize to the correct JSON.
|
|
||||||
type IssueRequest struct {
|
|
||||||
Title *string `json:"title,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
Labels *[]string `json:"labels,omitempty"`
|
|
||||||
Assignee *string `json:"assignee,omitempty"`
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
Milestone *int `json:"milestone,omitempty"`
|
|
||||||
Assignees *[]string `json:"assignees,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// IssueListOptions specifies the optional parameters to the IssuesService.List
|
|
||||||
// and IssuesService.ListByOrg methods.
|
|
||||||
type IssueListOptions struct {
|
|
||||||
// Filter specifies which issues to list. Possible values are: assigned,
|
|
||||||
// created, mentioned, subscribed, all. Default is "assigned".
|
|
||||||
Filter string `url:"filter,omitempty"`
|
|
||||||
|
|
||||||
// State filters issues based on their state. Possible values are: open,
|
|
||||||
// closed, all. Default is "open".
|
|
||||||
State string `url:"state,omitempty"`
|
|
||||||
|
|
||||||
// Labels filters issues based on their label.
|
|
||||||
Labels []string `url:"labels,comma,omitempty"`
|
|
||||||
|
|
||||||
// Sort specifies how to sort issues. Possible values are: created, updated,
|
|
||||||
// and comments. Default value is "created".
|
|
||||||
Sort string `url:"sort,omitempty"`
|
|
||||||
|
|
||||||
// Direction in which to sort issues. Possible values are: asc, desc.
|
|
||||||
// Default is "desc".
|
|
||||||
Direction string `url:"direction,omitempty"`
|
|
||||||
|
|
||||||
// Since filters issues by time.
|
|
||||||
Since time.Time `url:"since,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestLinks object is added to the Issue object when it's an issue included
|
|
||||||
// in the IssueCommentEvent webhook payload, if the webhooks is fired by a comment on a PR
|
|
||||||
type PullRequestLinks struct {
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
DiffURL *string `json:"diff_url,omitempty"`
|
|
||||||
PatchURL *string `json:"patch_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// List the issues for the authenticated user. If all is true, list issues
|
|
||||||
// across all the user's visible repositories including owned, member, and
|
|
||||||
// organization repositories; if false, list only owned and member
|
|
||||||
// repositories.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/#list-issues
|
|
||||||
func (s *IssuesService) List(ctx context.Context, all bool, opt *IssueListOptions) ([]*Issue, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if all {
|
|
||||||
u = "issues"
|
|
||||||
} else {
|
|
||||||
u = "user/issues"
|
|
||||||
}
|
|
||||||
return s.listIssues(ctx, u, opt)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListByOrg fetches the issues in the specified organization for the
|
|
||||||
// authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/#list-issues
|
|
||||||
func (s *IssuesService) ListByOrg(ctx context.Context, org string, opt *IssueListOptions) ([]*Issue, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/issues", org)
|
|
||||||
return s.listIssues(ctx, u, opt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *IssuesService) listIssues(ctx context.Context, u string, opt *IssueListOptions) ([]*Issue, *Response, error) {
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
var issues []*Issue
|
|
||||||
resp, err := s.client.Do(ctx, req, &issues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return issues, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IssueListByRepoOptions specifies the optional parameters to the
|
|
||||||
// IssuesService.ListByRepo method.
|
|
||||||
type IssueListByRepoOptions struct {
|
|
||||||
// Milestone limits issues for the specified milestone. Possible values are
|
|
||||||
// a milestone number, "none" for issues with no milestone, "*" for issues
|
|
||||||
// with any milestone.
|
|
||||||
Milestone string `url:"milestone,omitempty"`
|
|
||||||
|
|
||||||
// State filters issues based on their state. Possible values are: open,
|
|
||||||
// closed, all. Default is "open".
|
|
||||||
State string `url:"state,omitempty"`
|
|
||||||
|
|
||||||
// Assignee filters issues based on their assignee. Possible values are a
|
|
||||||
// user name, "none" for issues that are not assigned, "*" for issues with
|
|
||||||
// any assigned user.
|
|
||||||
Assignee string `url:"assignee,omitempty"`
|
|
||||||
|
|
||||||
// Creator filters issues based on their creator.
|
|
||||||
Creator string `url:"creator,omitempty"`
|
|
||||||
|
|
||||||
// Mentioned filters issues to those mentioned a specific user.
|
|
||||||
Mentioned string `url:"mentioned,omitempty"`
|
|
||||||
|
|
||||||
// Labels filters issues based on their label.
|
|
||||||
Labels []string `url:"labels,omitempty,comma"`
|
|
||||||
|
|
||||||
// Sort specifies how to sort issues. Possible values are: created, updated,
|
|
||||||
// and comments. Default value is "created".
|
|
||||||
Sort string `url:"sort,omitempty"`
|
|
||||||
|
|
||||||
// Direction in which to sort issues. Possible values are: asc, desc.
|
|
||||||
// Default is "desc".
|
|
||||||
Direction string `url:"direction,omitempty"`
|
|
||||||
|
|
||||||
// Since filters issues by time.
|
|
||||||
Since time.Time `url:"since,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListByRepo lists the issues for the specified repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/#list-issues-for-a-repository
|
|
||||||
func (s *IssuesService) ListByRepo(ctx context.Context, owner string, repo string, opt *IssueListByRepoOptions) ([]*Issue, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues", owner, repo)
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
var issues []*Issue
|
|
||||||
resp, err := s.client.Do(ctx, req, &issues)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return issues, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a single issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/#get-a-single-issue
|
|
||||||
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)
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
issue := new(Issue)
|
|
||||||
resp, err := s.client.Do(ctx, req, issue)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return issue, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new issue on the specified repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/#create-an-issue
|
|
||||||
func (s *IssuesService) Create(ctx context.Context, owner string, repo string, issue *IssueRequest) (*Issue, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("POST", u, issue)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
i := new(Issue)
|
|
||||||
resp, err := s.client.Do(ctx, req, i)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return i, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edit an issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/#edit-an-issue
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, issue)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
i := new(Issue)
|
|
||||||
resp, err := s.client.Do(ctx, req, i)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return i, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lock an issue's conversation.
|
|
||||||
//
|
|
||||||
// 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) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%d/lock", owner, repo, number)
|
|
||||||
req, err := s.client.NewRequest("PUT", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unlock an issue's conversation.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/#unlock-an-issue
|
|
||||||
func (s *IssuesService) Unlock(ctx context.Context, owner string, repo string, number int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%d/lock", owner, repo, number)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
85
vendor/github.com/google/go-github/github/issues_assignees.go
generated
vendored
85
vendor/github.com/google/go-github/github/issues_assignees.go
generated
vendored
@ -1,85 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ListAssignees fetches all available assignees (owners and collaborators) to
|
|
||||||
// which issues may be assigned.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/assignees", owner, repo)
|
|
||||||
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 assignees []*User
|
|
||||||
resp, err := s.client.Do(ctx, req, &assignees)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return assignees, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsAssignee checks if a user is an assignee for the specified repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/assignees/#check-assignee
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return false, nil, err
|
|
||||||
}
|
|
||||||
resp, err := s.client.Do(ctx, req, nil)
|
|
||||||
assignee, err := parseBoolResponse(err)
|
|
||||||
return assignee, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddAssignees adds the provided GitHub users as assignees to the issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/assignees/#add-assignees-to-an-issue
|
|
||||||
func (s *IssuesService) AddAssignees(ctx context.Context, owner, repo string, number int, assignees []string) (*Issue, *Response, error) {
|
|
||||||
users := &struct {
|
|
||||||
Assignees []string `json:"assignees,omitempty"`
|
|
||||||
}{Assignees: assignees}
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%v/assignees", owner, repo, number)
|
|
||||||
req, err := s.client.NewRequest("POST", u, users)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
issue := &Issue{}
|
|
||||||
resp, err := s.client.Do(ctx, req, issue)
|
|
||||||
return issue, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveAssignees removes the provided GitHub users as assignees from the issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/assignees/#remove-assignees-from-an-issue
|
|
||||||
func (s *IssuesService) RemoveAssignees(ctx context.Context, owner, repo string, number int, assignees []string) (*Issue, *Response, error) {
|
|
||||||
users := &struct {
|
|
||||||
Assignees []string `json:"assignees,omitempty"`
|
|
||||||
}{Assignees: assignees}
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%v/assignees", owner, repo, number)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, users)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
issue := &Issue{}
|
|
||||||
resp, err := s.client.Do(ctx, req, issue)
|
|
||||||
return issue, resp, err
|
|
||||||
}
|
|
148
vendor/github.com/google/go-github/github/issues_comments.go
generated
vendored
148
vendor/github.com/google/go-github/github/issues_comments.go
generated
vendored
@ -1,148 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IssueComment represents a comment left on an issue.
|
|
||||||
type IssueComment struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
Reactions *Reactions `json:"reactions,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
IssueURL *string `json:"issue_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i IssueComment) String() string {
|
|
||||||
return Stringify(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// IssueListCommentsOptions specifies the optional parameters to the
|
|
||||||
// IssuesService.ListComments method.
|
|
||||||
type IssueListCommentsOptions struct {
|
|
||||||
// Sort specifies how to sort comments. Possible values are: created, updated.
|
|
||||||
Sort string `url:"sort,omitempty"`
|
|
||||||
|
|
||||||
// Direction in which to sort comments. Possible values are: asc, desc.
|
|
||||||
Direction string `url:"direction,omitempty"`
|
|
||||||
|
|
||||||
// Since filters comments by time.
|
|
||||||
Since time.Time `url:"since,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListComments lists all comments on the specified issue. Specifying an issue
|
|
||||||
// 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
|
|
||||||
func (s *IssuesService) ListComments(ctx context.Context, owner string, repo string, number int, opt *IssueListCommentsOptions) ([]*IssueComment, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if number == 0 {
|
|
||||||
u = fmt.Sprintf("repos/%v/%v/issues/comments", owner, repo)
|
|
||||||
} else {
|
|
||||||
u = fmt.Sprintf("repos/%v/%v/issues/%d/comments", owner, repo, number)
|
|
||||||
}
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
var comments []*IssueComment
|
|
||||||
resp, err := s.client.Do(ctx, req, &comments)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return comments, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetComment fetches the specified issue comment.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/comments/#get-a-single-comment
|
|
||||||
func (s *IssuesService) GetComment(ctx context.Context, owner string, repo string, id int) (*IssueComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, id)
|
|
||||||
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
comment := new(IssueComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, comment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return comment, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateComment creates a new comment on the specified issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/comments/#create-a-comment
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("POST", u, comment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
c := new(IssueComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditComment updates an issue comment.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/comments/#edit-a-comment
|
|
||||||
func (s *IssuesService) EditComment(ctx context.Context, owner string, repo string, id int, comment *IssueComment) (*IssueComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, comment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
c := new(IssueComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteComment deletes an issue comment.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/comments/#delete-a-comment
|
|
||||||
func (s *IssuesService) DeleteComment(ctx context.Context, owner string, repo string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
151
vendor/github.com/google/go-github/github/issues_events.go
generated
vendored
151
vendor/github.com/google/go-github/github/issues_events.go
generated
vendored
@ -1,151 +0,0 @@
|
|||||||
// Copyright 2014 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// IssueEvent represents an event that occurred around an Issue or Pull Request.
|
|
||||||
type IssueEvent struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
|
|
||||||
// The User that generated this event.
|
|
||||||
Actor *User `json:"actor,omitempty"`
|
|
||||||
|
|
||||||
// Event identifies the actual type of Event that occurred. Possible
|
|
||||||
// values are:
|
|
||||||
//
|
|
||||||
// closed
|
|
||||||
// The Actor closed the issue.
|
|
||||||
// If the issue was closed by commit message, CommitID holds the SHA1 hash of the commit.
|
|
||||||
//
|
|
||||||
// merged
|
|
||||||
// The Actor merged into master a branch containing a commit mentioning the issue.
|
|
||||||
// CommitID holds the SHA1 of the merge commit.
|
|
||||||
//
|
|
||||||
// referenced
|
|
||||||
// The Actor committed to master a commit mentioning the issue in its commit message.
|
|
||||||
// CommitID holds the SHA1 of the commit.
|
|
||||||
//
|
|
||||||
// reopened, locked, unlocked
|
|
||||||
// The Actor did that to the issue.
|
|
||||||
//
|
|
||||||
// renamed
|
|
||||||
// The Actor changed the issue title from Rename.From to Rename.To.
|
|
||||||
//
|
|
||||||
// mentioned
|
|
||||||
// Someone unspecified @mentioned the Actor [sic] in an issue comment body.
|
|
||||||
//
|
|
||||||
// assigned, unassigned
|
|
||||||
// The Assigner assigned the issue to or removed the assignment from the Assignee.
|
|
||||||
//
|
|
||||||
// labeled, unlabeled
|
|
||||||
// The Actor added or removed the Label from the issue.
|
|
||||||
//
|
|
||||||
// milestoned, demilestoned
|
|
||||||
// The Actor added or removed the issue from the Milestone.
|
|
||||||
//
|
|
||||||
// subscribed, unsubscribed
|
|
||||||
// The Actor subscribed to or unsubscribed from notifications for an issue.
|
|
||||||
//
|
|
||||||
// head_ref_deleted, head_ref_restored
|
|
||||||
// The pull request’s branch was deleted or restored.
|
|
||||||
//
|
|
||||||
Event *string `json:"event,omitempty"`
|
|
||||||
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
Issue *Issue `json:"issue,omitempty"`
|
|
||||||
|
|
||||||
// Only present on certain events; see above.
|
|
||||||
Assignee *User `json:"assignee,omitempty"`
|
|
||||||
Assigner *User `json:"assigner,omitempty"`
|
|
||||||
CommitID *string `json:"commit_id,omitempty"`
|
|
||||||
Milestone *Milestone `json:"milestone,omitempty"`
|
|
||||||
Label *Label `json:"label,omitempty"`
|
|
||||||
Rename *Rename `json:"rename,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListIssueEvents lists events for the specified issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/events/#list-events-for-an-issue
|
|
||||||
func (s *IssuesService) ListIssueEvents(ctx context.Context, owner, repo string, number int, opt *ListOptions) ([]*IssueEvent, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%v/events", owner, repo, number)
|
|
||||||
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 events []*IssueEvent
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return events, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListRepositoryEvents lists events for the specified repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/events/#list-events-for-a-repository
|
|
||||||
func (s *IssuesService) ListRepositoryEvents(ctx context.Context, owner, repo string, opt *ListOptions) ([]*IssueEvent, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/events", owner, repo)
|
|
||||||
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 events []*IssueEvent
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return events, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetEvent returns the specified issue event.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/events/#get-a-single-event
|
|
||||||
func (s *IssuesService) GetEvent(ctx context.Context, owner, repo string, id int) (*IssueEvent, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/events/%v", owner, repo, id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
event := new(IssueEvent)
|
|
||||||
resp, err := s.client.Do(ctx, req, event)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return event, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rename contains details for 'renamed' events.
|
|
||||||
type Rename struct {
|
|
||||||
From *string `json:"from,omitempty"`
|
|
||||||
To *string `json:"to,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r Rename) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
226
vendor/github.com/google/go-github/github/issues_labels.go
generated
vendored
226
vendor/github.com/google/go-github/github/issues_labels.go
generated
vendored
@ -1,226 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Label represents a GitHub label on an Issue
|
|
||||||
type Label struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Color *string `json:"color,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l Label) String() string {
|
|
||||||
return Stringify(l)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListLabels lists all labels for a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository
|
|
||||||
func (s *IssuesService) ListLabels(ctx context.Context, owner string, repo string, opt *ListOptions) ([]*Label, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/labels", owner, repo)
|
|
||||||
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 labels []*Label
|
|
||||||
resp, err := s.client.Do(ctx, req, &labels)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return labels, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLabel gets a single label.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/labels/#get-a-single-label
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
label := new(Label)
|
|
||||||
resp, err := s.client.Do(ctx, req, label)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return label, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateLabel creates a new label on the specified repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/labels/#create-a-label
|
|
||||||
func (s *IssuesService) CreateLabel(ctx context.Context, owner string, repo string, label *Label) (*Label, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/labels", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("POST", u, label)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
l := new(Label)
|
|
||||||
resp, err := s.client.Do(ctx, req, l)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return l, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditLabel edits a label.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/labels/#update-a-label
|
|
||||||
func (s *IssuesService) EditLabel(ctx context.Context, owner string, repo string, name string, label *Label) (*Label, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/labels/%v", owner, repo, name)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, label)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
l := new(Label)
|
|
||||||
resp, err := s.client.Do(ctx, req, l)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return l, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteLabel deletes a label.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/labels/#delete-a-label
|
|
||||||
func (s *IssuesService) DeleteLabel(ctx context.Context, owner string, repo string, name string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/labels/%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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListLabelsByIssue lists all labels for an issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/labels/#list-labels-on-an-issue
|
|
||||||
func (s *IssuesService) ListLabelsByIssue(ctx context.Context, owner string, repo string, number int, opt *ListOptions) ([]*Label, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number)
|
|
||||||
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 labels []*Label
|
|
||||||
resp, err := s.client.Do(ctx, req, &labels)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return labels, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddLabelsToIssue adds labels to an issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/labels/#add-labels-to-an-issue
|
|
||||||
func (s *IssuesService) AddLabelsToIssue(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)
|
|
||||||
req, err := s.client.NewRequest("POST", u, labels)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var l []*Label
|
|
||||||
resp, err := s.client.Do(ctx, req, &l)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return l, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveLabelForIssue removes a label for an issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/labels/#remove-a-label-from-an-issue
|
|
||||||
func (s *IssuesService) RemoveLabelForIssue(ctx context.Context, owner string, repo string, number int, label string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%d/labels/%v", owner, repo, number, label)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReplaceLabelsForIssue replaces all labels for an issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/labels/#replace-all-labels-for-an-issue
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("PUT", u, labels)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var l []*Label
|
|
||||||
resp, err := s.client.Do(ctx, req, &l)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return l, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveLabelsForIssue removes all labels for an issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/labels/#remove-all-labels-from-an-issue
|
|
||||||
func (s *IssuesService) RemoveLabelsForIssue(ctx context.Context, owner string, repo string, number int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *IssuesService) ListLabelsForMilestone(ctx context.Context, owner string, repo string, number int, opt *ListOptions) ([]*Label, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/milestones/%d/labels", owner, repo, number)
|
|
||||||
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 labels []*Label
|
|
||||||
resp, err := s.client.Do(ctx, req, &labels)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return labels, resp, nil
|
|
||||||
}
|
|
147
vendor/github.com/google/go-github/github/issues_milestones.go
generated
vendored
147
vendor/github.com/google/go-github/github/issues_milestones.go
generated
vendored
@ -1,147 +0,0 @@
|
|||||||
// Copyright 2014 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Milestone represents a GitHub repository milestone.
|
|
||||||
type Milestone struct {
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
LabelsURL *string `json:"labels_url,omitempty"`
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Number *int `json:"number,omitempty"`
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
Title *string `json:"title,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
Creator *User `json:"creator,omitempty"`
|
|
||||||
OpenIssues *int `json:"open_issues,omitempty"`
|
|
||||||
ClosedIssues *int `json:"closed_issues,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
ClosedAt *time.Time `json:"closed_at,omitempty"`
|
|
||||||
DueOn *time.Time `json:"due_on,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m Milestone) String() string {
|
|
||||||
return Stringify(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MilestoneListOptions specifies the optional parameters to the
|
|
||||||
// IssuesService.ListMilestones method.
|
|
||||||
type MilestoneListOptions struct {
|
|
||||||
// State filters milestones based on their state. Possible values are:
|
|
||||||
// open, closed, all. Default is "open".
|
|
||||||
State string `url:"state,omitempty"`
|
|
||||||
|
|
||||||
// Sort specifies how to sort milestones. Possible values are: due_on, completeness.
|
|
||||||
// Default value is "due_on".
|
|
||||||
Sort string `url:"sort,omitempty"`
|
|
||||||
|
|
||||||
// Direction in which to sort milestones. Possible values are: asc, desc.
|
|
||||||
// Default is "asc".
|
|
||||||
Direction string `url:"direction,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListMilestones lists all milestones for a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/milestones/#list-milestones-for-a-repository
|
|
||||||
func (s *IssuesService) ListMilestones(ctx context.Context, owner string, repo string, opt *MilestoneListOptions) ([]*Milestone, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/milestones", owner, repo)
|
|
||||||
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 milestones []*Milestone
|
|
||||||
resp, err := s.client.Do(ctx, req, &milestones)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return milestones, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetMilestone gets a single milestone.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/milestones/#get-a-single-milestone
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
milestone := new(Milestone)
|
|
||||||
resp, err := s.client.Do(ctx, req, milestone)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return milestone, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateMilestone creates a new milestone on the specified repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/milestones/#create-a-milestone
|
|
||||||
func (s *IssuesService) CreateMilestone(ctx context.Context, owner string, repo string, milestone *Milestone) (*Milestone, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/milestones", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("POST", u, milestone)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
m := new(Milestone)
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditMilestone edits a milestone.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/milestones/#update-a-milestone
|
|
||||||
func (s *IssuesService) EditMilestone(ctx context.Context, owner string, repo string, number int, milestone *Milestone) (*Milestone, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/milestones/%d", owner, repo, number)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, milestone)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
m := new(Milestone)
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteMilestone deletes a milestone.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/milestones/#delete-a-milestone
|
|
||||||
func (s *IssuesService) DeleteMilestone(ctx context.Context, owner string, repo string, number int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/milestones/%d", owner, repo, number)
|
|
||||||
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/github/issues_timeline.go
generated
vendored
149
vendor/github.com/google/go-github/github/issues_timeline.go
generated
vendored
@ -1,149 +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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Timeline represents an event that occurred around an Issue or Pull Request.
|
|
||||||
//
|
|
||||||
// It is similar to an IssueEvent but may contain more information.
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/timeline/
|
|
||||||
type Timeline struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
CommitURL *string `json:"commit_url,omitempty"`
|
|
||||||
|
|
||||||
// The User object that generated the event.
|
|
||||||
Actor *User `json:"actor,omitempty"`
|
|
||||||
|
|
||||||
// Event identifies the actual type of Event that occurred. Possible values
|
|
||||||
// are:
|
|
||||||
//
|
|
||||||
// assigned
|
|
||||||
// The issue was assigned to the assignee.
|
|
||||||
//
|
|
||||||
// closed
|
|
||||||
// The issue was closed by the actor. When the commit_id is present, it
|
|
||||||
// identifies the commit that closed the issue using "closes / fixes #NN"
|
|
||||||
// syntax.
|
|
||||||
//
|
|
||||||
// commented
|
|
||||||
// A comment was added to the issue.
|
|
||||||
//
|
|
||||||
// committed
|
|
||||||
// A commit was added to the pull request's 'HEAD' branch. Only provided
|
|
||||||
// for pull requests.
|
|
||||||
//
|
|
||||||
// cross-referenced
|
|
||||||
// The issue was referenced from another issue. The 'source' attribute
|
|
||||||
// contains the 'id', 'actor', and 'url' of the reference's source.
|
|
||||||
//
|
|
||||||
// demilestoned
|
|
||||||
// The issue was removed from a milestone.
|
|
||||||
//
|
|
||||||
// head_ref_deleted
|
|
||||||
// The pull request's branch was deleted.
|
|
||||||
//
|
|
||||||
// head_ref_restored
|
|
||||||
// The pull request's branch was restored.
|
|
||||||
//
|
|
||||||
// labeled
|
|
||||||
// A label was added to the issue.
|
|
||||||
//
|
|
||||||
// locked
|
|
||||||
// The issue was locked by the actor.
|
|
||||||
//
|
|
||||||
// mentioned
|
|
||||||
// The actor was @mentioned in an issue body.
|
|
||||||
//
|
|
||||||
// merged
|
|
||||||
// The issue was merged by the actor. The 'commit_id' attribute is the
|
|
||||||
// SHA1 of the HEAD commit that was merged.
|
|
||||||
//
|
|
||||||
// milestoned
|
|
||||||
// The issue was added to a milestone.
|
|
||||||
//
|
|
||||||
// referenced
|
|
||||||
// The issue was referenced from a commit message. The 'commit_id'
|
|
||||||
// attribute is the commit SHA1 of where that happened.
|
|
||||||
//
|
|
||||||
// renamed
|
|
||||||
// The issue title was changed.
|
|
||||||
//
|
|
||||||
// reopened
|
|
||||||
// The issue was reopened by the actor.
|
|
||||||
//
|
|
||||||
// subscribed
|
|
||||||
// The actor subscribed to receive notifications for an issue.
|
|
||||||
//
|
|
||||||
// unassigned
|
|
||||||
// The assignee was unassigned from the issue.
|
|
||||||
//
|
|
||||||
// unlabeled
|
|
||||||
// A label was removed from the issue.
|
|
||||||
//
|
|
||||||
// unlocked
|
|
||||||
// The issue was unlocked by the actor.
|
|
||||||
//
|
|
||||||
// unsubscribed
|
|
||||||
// The actor unsubscribed to stop receiving notifications for an issue.
|
|
||||||
//
|
|
||||||
Event *string `json:"event,omitempty"`
|
|
||||||
|
|
||||||
// The string SHA of a commit that referenced this Issue or Pull Request.
|
|
||||||
CommitID *string `json:"commit_id,omitempty"`
|
|
||||||
// The timestamp indicating when the event occurred.
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
// The Label object including `name` and `color` attributes. Only provided for
|
|
||||||
// 'labeled' and 'unlabeled' events.
|
|
||||||
Label *Label `json:"label,omitempty"`
|
|
||||||
// The User object which was assigned to (or unassigned from) this Issue or
|
|
||||||
// Pull Request. Only provided for 'assigned' and 'unassigned' events.
|
|
||||||
Assignee *User `json:"assignee,omitempty"`
|
|
||||||
// The Milestone object including a 'title' attribute.
|
|
||||||
// Only provided for 'milestoned' and 'demilestoned' events.
|
|
||||||
Milestone *Milestone `json:"milestone,omitempty"`
|
|
||||||
// The 'id', 'actor', and 'url' for the source of a reference from another issue.
|
|
||||||
// Only provided for 'cross-referenced' events.
|
|
||||||
Source *Source `json:"source,omitempty"`
|
|
||||||
// An object containing rename details including 'from' and 'to' attributes.
|
|
||||||
// Only provided for 'renamed' events.
|
|
||||||
Rename *Rename `json:"rename,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Source represents a reference's source.
|
|
||||||
type Source struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Actor *User `json:"actor,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListIssueTimeline lists events for the specified issue.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/issues/timeline/#list-events-for-an-issue
|
|
||||||
func (s *IssuesService) ListIssueTimeline(ctx context.Context, owner, repo string, number int, opt *ListOptions) ([]*Timeline, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%v/timeline", owner, repo, number)
|
|
||||||
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", mediaTypeTimelinePreview)
|
|
||||||
|
|
||||||
var events []*Timeline
|
|
||||||
resp, err := s.client.Do(ctx, req, &events)
|
|
||||||
return events, resp, err
|
|
||||||
}
|
|
103
vendor/github.com/google/go-github/github/licenses.go
generated
vendored
103
vendor/github.com/google/go-github/github/licenses.go
generated
vendored
@ -1,103 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// LicensesService handles communication with the license related
|
|
||||||
// methods of the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/licenses/
|
|
||||||
type LicensesService service
|
|
||||||
|
|
||||||
// RepositoryLicense represents the license for a repository.
|
|
||||||
type RepositoryLicense struct {
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Path *string `json:"path,omitempty"`
|
|
||||||
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Size *int `json:"size,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
GitURL *string `json:"git_url,omitempty"`
|
|
||||||
DownloadURL *string `json:"download_url,omitempty"`
|
|
||||||
Type *string `json:"type,omitempty"`
|
|
||||||
Content *string `json:"content,omitempty"`
|
|
||||||
Encoding *string `json:"encoding,omitempty"`
|
|
||||||
License *License `json:"license,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l RepositoryLicense) String() string {
|
|
||||||
return Stringify(l)
|
|
||||||
}
|
|
||||||
|
|
||||||
// License represents an open source license.
|
|
||||||
type License struct {
|
|
||||||
Key *string `json:"key,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
|
|
||||||
SPDXID *string `json:"spdx_id,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
Featured *bool `json:"featured,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
Implementation *string `json:"implementation,omitempty"`
|
|
||||||
Permissions *[]string `json:"permissions,omitempty"`
|
|
||||||
Conditions *[]string `json:"conditions,omitempty"`
|
|
||||||
Limitations *[]string `json:"limitations,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l License) String() string {
|
|
||||||
return Stringify(l)
|
|
||||||
}
|
|
||||||
|
|
||||||
// List popular open source licenses.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/licenses/#list-all-licenses
|
|
||||||
func (s *LicensesService) List(ctx context.Context) ([]*License, *Response, error) {
|
|
||||||
req, err := s.client.NewRequest("GET", "licenses", nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches
|
|
||||||
req.Header.Set("Accept", mediaTypeLicensesPreview)
|
|
||||||
|
|
||||||
var licenses []*License
|
|
||||||
resp, err := s.client.Do(ctx, req, &licenses)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return licenses, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get extended metadata for one license.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/licenses/#get-an-individual-license
|
|
||||||
func (s *LicensesService) Get(ctx context.Context, licenseName string) (*License, *Response, error) {
|
|
||||||
u := fmt.Sprintf("licenses/%s", licenseName)
|
|
||||||
|
|
||||||
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", mediaTypeLicensesPreview)
|
|
||||||
|
|
||||||
license := new(License)
|
|
||||||
resp, err := s.client.Do(ctx, req, license)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return license, resp, nil
|
|
||||||
}
|
|
211
vendor/github.com/google/go-github/github/messages.go
generated
vendored
211
vendor/github.com/google/go-github/github/messages.go
generated
vendored
@ -1,211 +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.
|
|
||||||
|
|
||||||
// This file provides functions for validating payloads from GitHub Webhooks.
|
|
||||||
// GitHub API docs: https://developer.github.com/webhooks/securing/#validating-payloads-from-github
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/hmac"
|
|
||||||
"crypto/sha1"
|
|
||||||
"crypto/sha256"
|
|
||||||
"crypto/sha512"
|
|
||||||
"encoding/hex"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"hash"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// sha1Prefix is the prefix used by GitHub before the HMAC hexdigest.
|
|
||||||
sha1Prefix = "sha1"
|
|
||||||
// sha256Prefix and sha512Prefix are provided for future compatibility.
|
|
||||||
sha256Prefix = "sha256"
|
|
||||||
sha512Prefix = "sha512"
|
|
||||||
// signatureHeader is the GitHub header key used to pass the HMAC hexdigest.
|
|
||||||
signatureHeader = "X-Hub-Signature"
|
|
||||||
// eventTypeHeader is the GitHub header key used to pass the event type.
|
|
||||||
eventTypeHeader = "X-Github-Event"
|
|
||||||
// deliveryIDHeader is the GitHub header key used to pass the unique ID for the webhook event.
|
|
||||||
deliveryIDHeader = "X-Github-Delivery"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// eventTypeMapping maps webhooks types to their corresponding go-github struct types.
|
|
||||||
eventTypeMapping = map[string]string{
|
|
||||||
"commit_comment": "CommitCommentEvent",
|
|
||||||
"create": "CreateEvent",
|
|
||||||
"delete": "DeleteEvent",
|
|
||||||
"deployment": "DeploymentEvent",
|
|
||||||
"deployment_status": "DeploymentStatusEvent",
|
|
||||||
"fork": "ForkEvent",
|
|
||||||
"gollum": "GollumEvent",
|
|
||||||
"installation": "InstallationEvent",
|
|
||||||
"installation_repositories": "InstallationRepositoriesEvent",
|
|
||||||
"issue_comment": "IssueCommentEvent",
|
|
||||||
"issues": "IssuesEvent",
|
|
||||||
"label": "LabelEvent",
|
|
||||||
"member": "MemberEvent",
|
|
||||||
"membership": "MembershipEvent",
|
|
||||||
"milestone": "MilestoneEvent",
|
|
||||||
"organization": "OrganizationEvent",
|
|
||||||
"org_block": "OrgBlockEvent",
|
|
||||||
"page_build": "PageBuildEvent",
|
|
||||||
"ping": "PingEvent",
|
|
||||||
"project": "ProjectEvent",
|
|
||||||
"project_card": "ProjectCardEvent",
|
|
||||||
"project_column": "ProjectColumnEvent",
|
|
||||||
"public": "PublicEvent",
|
|
||||||
"pull_request_review": "PullRequestReviewEvent",
|
|
||||||
"pull_request_review_comment": "PullRequestReviewCommentEvent",
|
|
||||||
"pull_request": "PullRequestEvent",
|
|
||||||
"push": "PushEvent",
|
|
||||||
"repository": "RepositoryEvent",
|
|
||||||
"release": "ReleaseEvent",
|
|
||||||
"status": "StatusEvent",
|
|
||||||
"team": "TeamEvent",
|
|
||||||
"team_add": "TeamAddEvent",
|
|
||||||
"watch": "WatchEvent",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
// genMAC generates the HMAC signature for a message provided the secret key
|
|
||||||
// and hashFunc.
|
|
||||||
func genMAC(message, key []byte, hashFunc func() hash.Hash) []byte {
|
|
||||||
mac := hmac.New(hashFunc, key)
|
|
||||||
mac.Write(message)
|
|
||||||
return mac.Sum(nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// checkMAC reports whether messageMAC is a valid HMAC tag for message.
|
|
||||||
func checkMAC(message, messageMAC, key []byte, hashFunc func() hash.Hash) bool {
|
|
||||||
expectedMAC := genMAC(message, key, hashFunc)
|
|
||||||
return hmac.Equal(messageMAC, expectedMAC)
|
|
||||||
}
|
|
||||||
|
|
||||||
// messageMAC returns the hex-decoded HMAC tag from the signature and its
|
|
||||||
// corresponding hash function.
|
|
||||||
func messageMAC(signature string) ([]byte, func() hash.Hash, error) {
|
|
||||||
if signature == "" {
|
|
||||||
return nil, nil, errors.New("missing signature")
|
|
||||||
}
|
|
||||||
sigParts := strings.SplitN(signature, "=", 2)
|
|
||||||
if len(sigParts) != 2 {
|
|
||||||
return nil, nil, fmt.Errorf("error parsing signature %q", signature)
|
|
||||||
}
|
|
||||||
|
|
||||||
var hashFunc func() hash.Hash
|
|
||||||
switch sigParts[0] {
|
|
||||||
case sha1Prefix:
|
|
||||||
hashFunc = sha1.New
|
|
||||||
case sha256Prefix:
|
|
||||||
hashFunc = sha256.New
|
|
||||||
case sha512Prefix:
|
|
||||||
hashFunc = sha512.New
|
|
||||||
default:
|
|
||||||
return nil, nil, fmt.Errorf("unknown hash type prefix: %q", sigParts[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
buf, err := hex.DecodeString(sigParts[1])
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, fmt.Errorf("error decoding signature %q: %v", signature, err)
|
|
||||||
}
|
|
||||||
return buf, hashFunc, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidatePayload validates an incoming GitHub Webhook event request
|
|
||||||
// and returns the (JSON) payload.
|
|
||||||
// secretKey is the GitHub Webhook secret message.
|
|
||||||
//
|
|
||||||
// Example usage:
|
|
||||||
//
|
|
||||||
// func (s *GitHubEventMonitor) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
||||||
// payload, err := github.ValidatePayload(r, s.webhookSecretKey)
|
|
||||||
// if err != nil { ... }
|
|
||||||
// // Process payload...
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
func ValidatePayload(r *http.Request, secretKey []byte) (payload []byte, err error) {
|
|
||||||
payload, err = ioutil.ReadAll(r.Body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
sig := r.Header.Get(signatureHeader)
|
|
||||||
if err := validateSignature(sig, payload, secretKey); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return payload, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// validateSignature validates the signature for the given payload.
|
|
||||||
// signature is the GitHub hash signature delivered in the X-Hub-Signature header.
|
|
||||||
// payload is the JSON payload sent by GitHub Webhooks.
|
|
||||||
// secretKey is the GitHub Webhook secret message.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/webhooks/securing/#validating-payloads-from-github
|
|
||||||
func validateSignature(signature string, payload, secretKey []byte) error {
|
|
||||||
messageMAC, hashFunc, err := messageMAC(signature)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !checkMAC(payload, messageMAC, secretKey, hashFunc) {
|
|
||||||
return errors.New("payload signature check failed")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// WebHookType returns the event type of webhook request r.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/hooks/#webhook-headers
|
|
||||||
func WebHookType(r *http.Request) string {
|
|
||||||
return r.Header.Get(eventTypeHeader)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeliveryID returns the unique delivery ID of webhook request r.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/hooks/#webhook-headers
|
|
||||||
func DeliveryID(r *http.Request) string {
|
|
||||||
return r.Header.Get(deliveryIDHeader)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParseWebHook parses the event payload. For recognized event types, a
|
|
||||||
// value of the corresponding struct type will be returned (as returned
|
|
||||||
// by Event.ParsePayload()). An error will be returned for unrecognized event
|
|
||||||
// types.
|
|
||||||
//
|
|
||||||
// Example usage:
|
|
||||||
//
|
|
||||||
// func (s *GitHubEventMonitor) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
||||||
// payload, err := github.ValidatePayload(r, s.webhookSecretKey)
|
|
||||||
// if err != nil { ... }
|
|
||||||
// event, err := github.ParseWebHook(github.WebHookType(r), payload)
|
|
||||||
// if err != nil { ... }
|
|
||||||
// switch event := event.(type) {
|
|
||||||
// case *github.CommitCommentEvent:
|
|
||||||
// processCommitCommentEvent(event)
|
|
||||||
// case *github.CreateEvent:
|
|
||||||
// processCreateEvent(event)
|
|
||||||
// ...
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
func ParseWebHook(messageType string, payload []byte) (interface{}, error) {
|
|
||||||
eventType, ok := eventTypeMapping[messageType]
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("unknown X-Github-Event in message: %v", messageType)
|
|
||||||
}
|
|
||||||
|
|
||||||
event := Event{
|
|
||||||
Type: &eventType,
|
|
||||||
RawPayload: (*json.RawMessage)(&payload),
|
|
||||||
}
|
|
||||||
return event.ParsePayload()
|
|
||||||
}
|
|
224
vendor/github.com/google/go-github/github/migrations.go
generated
vendored
224
vendor/github.com/google/go-github/github/migrations.go
generated
vendored
@ -1,224 +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"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MigrationService provides access to the migration related functions
|
|
||||||
// in the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/
|
|
||||||
type MigrationService service
|
|
||||||
|
|
||||||
// Migration represents a GitHub migration (archival).
|
|
||||||
type Migration struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
GUID *string `json:"guid,omitempty"`
|
|
||||||
// State is the current state of a migration.
|
|
||||||
// Possible values are:
|
|
||||||
// "pending" which means the migration hasn't started yet,
|
|
||||||
// "exporting" which means the migration is in progress,
|
|
||||||
// "exported" which means the migration finished successfully, or
|
|
||||||
// "failed" which means the migration failed.
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
// LockRepositories indicates whether repositories are locked (to prevent
|
|
||||||
// manipulation) while migrating data.
|
|
||||||
LockRepositories *bool `json:"lock_repositories,omitempty"`
|
|
||||||
// ExcludeAttachments indicates whether attachments should be excluded from
|
|
||||||
// the migration (to reduce migration archive file size).
|
|
||||||
ExcludeAttachments *bool `json:"exclude_attachments,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
CreatedAt *string `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *string `json:"updated_at,omitempty"`
|
|
||||||
Repositories []*Repository `json:"repositories,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m Migration) String() string {
|
|
||||||
return Stringify(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MigrationOptions specifies the optional parameters to Migration methods.
|
|
||||||
type MigrationOptions struct {
|
|
||||||
// LockRepositories indicates whether repositories should be locked (to prevent
|
|
||||||
// manipulation) while migrating data.
|
|
||||||
LockRepositories bool
|
|
||||||
|
|
||||||
// ExcludeAttachments indicates whether attachments should be excluded from
|
|
||||||
// the migration (to reduce migration archive file size).
|
|
||||||
ExcludeAttachments bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// startMigration represents the body of a StartMigration request.
|
|
||||||
type startMigration struct {
|
|
||||||
// Repositories is a slice of repository names to migrate.
|
|
||||||
Repositories []string `json:"repositories,omitempty"`
|
|
||||||
|
|
||||||
// LockRepositories indicates whether repositories should be locked (to prevent
|
|
||||||
// manipulation) while migrating data.
|
|
||||||
LockRepositories *bool `json:"lock_repositories,omitempty"`
|
|
||||||
|
|
||||||
// ExcludeAttachments indicates whether attachments should be excluded from
|
|
||||||
// the migration (to reduce migration archive file size).
|
|
||||||
ExcludeAttachments *bool `json:"exclude_attachments,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartMigration starts the generation of a migration archive.
|
|
||||||
// repos is a slice of repository names to migrate.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/migrations/#start-a-migration
|
|
||||||
func (s *MigrationService) StartMigration(ctx context.Context, org string, repos []string, opt *MigrationOptions) (*Migration, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/migrations", org)
|
|
||||||
|
|
||||||
body := &startMigration{Repositories: repos}
|
|
||||||
if opt != nil {
|
|
||||||
body.LockRepositories = Bool(opt.LockRepositories)
|
|
||||||
body.ExcludeAttachments = Bool(opt.ExcludeAttachments)
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", u, body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeMigrationsPreview)
|
|
||||||
|
|
||||||
m := &Migration{}
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListMigrations lists the most recent migrations.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/migrations/#get-a-list-of-migrations
|
|
||||||
func (s *MigrationService) ListMigrations(ctx context.Context, org string) ([]*Migration, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/migrations", org)
|
|
||||||
|
|
||||||
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", mediaTypeMigrationsPreview)
|
|
||||||
|
|
||||||
var m []*Migration
|
|
||||||
resp, err := s.client.Do(ctx, req, &m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MigrationStatus gets the status of a specific migration archive.
|
|
||||||
// id is the migration ID.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/migrations/#get-the-status-of-a-migration
|
|
||||||
func (s *MigrationService) MigrationStatus(ctx context.Context, org string, id int) (*Migration, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/migrations/%v", org, id)
|
|
||||||
|
|
||||||
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", mediaTypeMigrationsPreview)
|
|
||||||
|
|
||||||
m := &Migration{}
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MigrationArchiveURL fetches a migration archive URL.
|
|
||||||
// id is the migration ID.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/migrations/#download-a-migration-archive
|
|
||||||
func (s *MigrationService) MigrationArchiveURL(ctx context.Context, org string, id int) (url string, err error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/migrations/%v/archive", org, id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeMigrationsPreview)
|
|
||||||
|
|
||||||
s.client.clientMu.Lock()
|
|
||||||
defer s.client.clientMu.Unlock()
|
|
||||||
|
|
||||||
// Disable the redirect mechanism because AWS fails if the GitHub auth token is provided.
|
|
||||||
var loc string
|
|
||||||
saveRedirect := s.client.client.CheckRedirect
|
|
||||||
s.client.client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
|
|
||||||
loc = req.URL.String()
|
|
||||||
return errors.New("disable redirect")
|
|
||||||
}
|
|
||||||
defer func() { s.client.client.CheckRedirect = saveRedirect }()
|
|
||||||
|
|
||||||
_, err = s.client.Do(ctx, req, nil) // expect error from disable redirect
|
|
||||||
if err == nil {
|
|
||||||
return "", errors.New("expected redirect, none provided")
|
|
||||||
}
|
|
||||||
if !strings.Contains(err.Error(), "disable redirect") {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return loc, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteMigration deletes a previous migration archive.
|
|
||||||
// id is the migration ID.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/migrations/#delete-a-migration-archive
|
|
||||||
func (s *MigrationService) DeleteMigration(ctx context.Context, org string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/migrations/%v/archive", org, 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", mediaTypeMigrationsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnlockRepo unlocks a repository that was locked for migration.
|
|
||||||
// id is the migration ID.
|
|
||||||
// You should unlock each migrated repository and delete them when the migration
|
|
||||||
// is complete and you no longer need the source data.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/migrations/#unlock-a-repository
|
|
||||||
func (s *MigrationService) UnlockRepo(ctx context.Context, org string, id int, repo string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/migrations/%v/repos/%v/lock", org, id, 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", mediaTypeMigrationsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
329
vendor/github.com/google/go-github/github/migrations_source_import.go
generated
vendored
329
vendor/github.com/google/go-github/github/migrations_source_import.go
generated
vendored
@ -1,329 +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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Import represents a repository import request.
|
|
||||||
type Import struct {
|
|
||||||
// The URL of the originating repository.
|
|
||||||
VCSURL *string `json:"vcs_url,omitempty"`
|
|
||||||
// The originating VCS type. Can be one of 'subversion', 'git',
|
|
||||||
// 'mercurial', or 'tfvc'. Without this parameter, the import job will
|
|
||||||
// take additional time to detect the VCS type before beginning the
|
|
||||||
// import. This detection step will be reflected in the response.
|
|
||||||
VCS *string `json:"vcs,omitempty"`
|
|
||||||
// VCSUsername and VCSPassword are only used for StartImport calls that
|
|
||||||
// are importing a password-protected repository.
|
|
||||||
VCSUsername *string `json:"vcs_username,omitempty"`
|
|
||||||
VCSPassword *string `json:"vcs_password,omitempty"`
|
|
||||||
// For a tfvc import, the name of the project that is being imported.
|
|
||||||
TFVCProject *string `json:"tfvc_project,omitempty"`
|
|
||||||
|
|
||||||
// LFS related fields that may be preset in the Import Progress response
|
|
||||||
|
|
||||||
// Describes whether the import has been opted in or out of using Git
|
|
||||||
// LFS. The value can be 'opt_in', 'opt_out', or 'undecided' if no
|
|
||||||
// action has been taken.
|
|
||||||
UseLFS *string `json:"use_lfs,omitempty"`
|
|
||||||
// Describes whether files larger than 100MB were found during the
|
|
||||||
// importing step.
|
|
||||||
HasLargeFiles *bool `json:"has_large_files,omitempty"`
|
|
||||||
// The total size in gigabytes of files larger than 100MB found in the
|
|
||||||
// originating repository.
|
|
||||||
LargeFilesSize *int `json:"large_files_size,omitempty"`
|
|
||||||
// The total number of files larger than 100MB found in the originating
|
|
||||||
// repository. To see a list of these files, call LargeFiles.
|
|
||||||
LargeFilesCount *int `json:"large_files_count,omitempty"`
|
|
||||||
|
|
||||||
// Identifies the current status of an import. An import that does not
|
|
||||||
// have errors will progress through these steps:
|
|
||||||
//
|
|
||||||
// detecting - the "detection" step of the import is in progress
|
|
||||||
// because the request did not include a VCS parameter. The
|
|
||||||
// import is identifying the type of source control present at
|
|
||||||
// the URL.
|
|
||||||
// importing - the "raw" step of the import is in progress. This is
|
|
||||||
// where commit data is fetched from the original repository.
|
|
||||||
// The import progress response will include CommitCount (the
|
|
||||||
// total number of raw commits that will be imported) and
|
|
||||||
// Percent (0 - 100, the current progress through the import).
|
|
||||||
// mapping - the "rewrite" step of the import is in progress. This
|
|
||||||
// is where SVN branches are converted to Git branches, and
|
|
||||||
// where author updates are applied. The import progress
|
|
||||||
// response does not include progress information.
|
|
||||||
// pushing - the "push" step of the import is in progress. This is
|
|
||||||
// where the importer updates the repository on GitHub. The
|
|
||||||
// import progress response will include PushPercent, which is
|
|
||||||
// the percent value reported by git push when it is "Writing
|
|
||||||
// objects".
|
|
||||||
// complete - the import is complete, and the repository is ready
|
|
||||||
// on GitHub.
|
|
||||||
//
|
|
||||||
// If there are problems, you will see one of these in the status field:
|
|
||||||
//
|
|
||||||
// auth_failed - the import requires authentication in order to
|
|
||||||
// connect to the original repository. Make an UpdateImport
|
|
||||||
// request, and include VCSUsername and VCSPassword.
|
|
||||||
// error - the import encountered an error. The import progress
|
|
||||||
// response will include the FailedStep and an error message.
|
|
||||||
// Contact GitHub support for more information.
|
|
||||||
// detection_needs_auth - the importer requires authentication for
|
|
||||||
// the originating repository to continue detection. Make an
|
|
||||||
// UpdatImport request, and include VCSUsername and
|
|
||||||
// VCSPassword.
|
|
||||||
// detection_found_nothing - the importer didn't recognize any
|
|
||||||
// source control at the URL.
|
|
||||||
// detection_found_multiple - the importer found several projects
|
|
||||||
// or repositories at the provided URL. When this is the case,
|
|
||||||
// the Import Progress response will also include a
|
|
||||||
// ProjectChoices field with the possible project choices as
|
|
||||||
// values. Make an UpdateImport request, and include VCS and
|
|
||||||
// (if applicable) TFVCProject.
|
|
||||||
Status *string `json:"status,omitempty"`
|
|
||||||
CommitCount *int `json:"commit_count,omitempty"`
|
|
||||||
StatusText *string `json:"status_text,omitempty"`
|
|
||||||
AuthorsCount *int `json:"authors_count,omitempty"`
|
|
||||||
Percent *int `json:"percent,omitempty"`
|
|
||||||
PushPercent *int `json:"push_percent,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
AuthorsURL *string `json:"authors_url,omitempty"`
|
|
||||||
RepositoryURL *string `json:"repository_url,omitempty"`
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
FailedStep *string `json:"failed_step,omitempty"`
|
|
||||||
|
|
||||||
// Human readable display name, provided when the Import appears as
|
|
||||||
// part of ProjectChoices.
|
|
||||||
HumanName *string `json:"human_name,omitempty"`
|
|
||||||
|
|
||||||
// When the importer finds several projects or repositories at the
|
|
||||||
// provided URLs, this will identify the available choices. Call
|
|
||||||
// UpdateImport with the selected Import value.
|
|
||||||
ProjectChoices []Import `json:"project_choices,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (i Import) String() string {
|
|
||||||
return Stringify(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SourceImportAuthor identifies an author imported from a source repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/source_imports/#get-commit-authors
|
|
||||||
type SourceImportAuthor struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
RemoteID *string `json:"remote_id,omitempty"`
|
|
||||||
RemoteName *string `json:"remote_name,omitempty"`
|
|
||||||
Email *string `json:"email,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
ImportURL *string `json:"import_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a SourceImportAuthor) String() string {
|
|
||||||
return Stringify(a)
|
|
||||||
}
|
|
||||||
|
|
||||||
// LargeFile identifies a file larger than 100MB found during a repository import.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/source_imports/#get-large-files
|
|
||||||
type LargeFile struct {
|
|
||||||
RefName *string `json:"ref_name,omitempty"`
|
|
||||||
Path *string `json:"path,omitempty"`
|
|
||||||
OID *string `json:"oid,omitempty"`
|
|
||||||
Size *int `json:"size,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f LargeFile) String() string {
|
|
||||||
return Stringify(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartImport initiates a repository import.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/source_imports/#start-an-import
|
|
||||||
func (s *MigrationService) StartImport(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/import", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("PUT", u, in)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches
|
|
||||||
req.Header.Set("Accept", mediaTypeImportPreview)
|
|
||||||
|
|
||||||
out := new(Import)
|
|
||||||
resp, err := s.client.Do(ctx, req, out)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return out, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *MigrationService) ImportProgress(ctx context.Context, owner, repo string) (*Import, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/import", owner, repo)
|
|
||||||
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", mediaTypeImportPreview)
|
|
||||||
|
|
||||||
out := new(Import)
|
|
||||||
resp, err := s.client.Do(ctx, req, out)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return out, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateImport initiates a repository import.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/source_imports/#update-existing-import
|
|
||||||
func (s *MigrationService) UpdateImport(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/import", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, in)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches
|
|
||||||
req.Header.Set("Accept", mediaTypeImportPreview)
|
|
||||||
|
|
||||||
out := new(Import)
|
|
||||||
resp, err := s.client.Do(ctx, req, out)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return out, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommitAuthors gets the authors mapped from the original repository.
|
|
||||||
//
|
|
||||||
// Each type of source control system represents authors in a different way.
|
|
||||||
// For example, a Git commit author has a display name and an email address,
|
|
||||||
// but a Subversion commit author just has a username. The GitHub Importer will
|
|
||||||
// make the author information valid, but the author might not be correct. For
|
|
||||||
// example, it will change the bare Subversion username "hubot" into something
|
|
||||||
// like "hubot <hubot@12341234-abab-fefe-8787-fedcba987654>".
|
|
||||||
//
|
|
||||||
// This method and MapCommitAuthor allow you to provide correct Git author
|
|
||||||
// information.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/source_imports/#get-commit-authors
|
|
||||||
func (s *MigrationService) CommitAuthors(ctx context.Context, owner, repo string) ([]*SourceImportAuthor, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/import/authors", owner, repo)
|
|
||||||
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", mediaTypeImportPreview)
|
|
||||||
|
|
||||||
var authors []*SourceImportAuthor
|
|
||||||
resp, err := s.client.Do(ctx, req, &authors)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return authors, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MapCommitAuthor updates an author's identity for the import. Your
|
|
||||||
// application can continue updating authors any time before you push new
|
|
||||||
// commits to the repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/source_imports/#map-a-commit-author
|
|
||||||
func (s *MigrationService) MapCommitAuthor(ctx context.Context, owner, repo string, id int, author *SourceImportAuthor) (*SourceImportAuthor, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/import/authors/%v", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, author)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches
|
|
||||||
req.Header.Set("Accept", mediaTypeImportPreview)
|
|
||||||
|
|
||||||
out := new(SourceImportAuthor)
|
|
||||||
resp, err := s.client.Do(ctx, req, out)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return out, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetLFSPreference sets whether imported repositories should use Git LFS for
|
|
||||||
// files larger than 100MB. Only the UseLFS field on the provided Import is
|
|
||||||
// used.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/source_imports/#set-git-lfs-preference
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, in)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches
|
|
||||||
req.Header.Set("Accept", mediaTypeImportPreview)
|
|
||||||
|
|
||||||
out := new(Import)
|
|
||||||
resp, err := s.client.Do(ctx, req, out)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return out, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// LargeFiles lists files larger than 100MB found during the import.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/source_imports/#get-large-files
|
|
||||||
func (s *MigrationService) LargeFiles(ctx context.Context, owner, repo string) ([]*LargeFile, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/import/large_files", owner, repo)
|
|
||||||
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", mediaTypeImportPreview)
|
|
||||||
|
|
||||||
var files []*LargeFile
|
|
||||||
resp, err := s.client.Do(ctx, req, &files)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return files, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CancelImport stops an import for a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/migration/source_imports/#cancel-an-import
|
|
||||||
func (s *MigrationService) CancelImport(ctx context.Context, owner, repo string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/import", 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", mediaTypeImportPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
253
vendor/github.com/google/go-github/github/misc.go
generated
vendored
253
vendor/github.com/google/go-github/github/misc.go
generated
vendored
@ -1,253 +0,0 @@
|
|||||||
// Copyright 2014 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 (
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MarkdownOptions specifies optional parameters to the Markdown method.
|
|
||||||
type MarkdownOptions struct {
|
|
||||||
// Mode identifies the rendering mode. Possible values are:
|
|
||||||
// markdown - render a document as plain Markdown, just like
|
|
||||||
// README files are rendered.
|
|
||||||
//
|
|
||||||
// gfm - to render a document as user-content, e.g. like user
|
|
||||||
// comments or issues are rendered. In GFM mode, hard line breaks are
|
|
||||||
// always taken into account, and issue and user mentions are linked
|
|
||||||
// accordingly.
|
|
||||||
//
|
|
||||||
// Default is "markdown".
|
|
||||||
Mode string
|
|
||||||
|
|
||||||
// Context identifies the repository context. Only taken into account
|
|
||||||
// when rendering as "gfm".
|
|
||||||
Context string
|
|
||||||
}
|
|
||||||
|
|
||||||
type markdownRequest struct {
|
|
||||||
Text *string `json:"text,omitempty"`
|
|
||||||
Mode *string `json:"mode,omitempty"`
|
|
||||||
Context *string `json:"context,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Markdown renders an arbitrary Markdown document.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/markdown/
|
|
||||||
func (c *Client) Markdown(ctx context.Context, text string, opt *MarkdownOptions) (string, *Response, error) {
|
|
||||||
request := &markdownRequest{Text: String(text)}
|
|
||||||
if opt != nil {
|
|
||||||
if opt.Mode != "" {
|
|
||||||
request.Mode = String(opt.Mode)
|
|
||||||
}
|
|
||||||
if opt.Context != "" {
|
|
||||||
request.Context = String(opt.Context)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := c.NewRequest("POST", "markdown", request)
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
buf := new(bytes.Buffer)
|
|
||||||
resp, err := c.Do(ctx, req, buf)
|
|
||||||
if err != nil {
|
|
||||||
return "", resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return buf.String(), resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEmojis returns the emojis available to use on GitHub.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/emojis/
|
|
||||||
func (c *Client) ListEmojis(ctx context.Context) (map[string]string, *Response, error) {
|
|
||||||
req, err := c.NewRequest("GET", "emojis", nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var emoji map[string]string
|
|
||||||
resp, err := c.Do(ctx, req, &emoji)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return emoji, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CodeOfConduct represents a code of conduct.
|
|
||||||
type CodeOfConduct struct {
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Key *string `json:"key,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CodeOfConduct) String() string {
|
|
||||||
return Stringify(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListCodesOfConduct returns all codes of conduct.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/codes_of_conduct/#list-all-codes-of-conduct
|
|
||||||
func (c *Client) ListCodesOfConduct(ctx context.Context) ([]*CodeOfConduct, *Response, error) {
|
|
||||||
req, err := c.NewRequest("GET", "codes_of_conduct", nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeCodesOfConductPreview)
|
|
||||||
|
|
||||||
var cs []*CodeOfConduct
|
|
||||||
resp, err := c.Do(ctx, req, &cs)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return cs, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCodeOfConduct returns an individual code of conduct.
|
|
||||||
//
|
|
||||||
// https://developer.github.com/v3/codes_of_conduct/#get-an-individual-code-of-conduct
|
|
||||||
func (c *Client) GetCodeOfConduct(ctx context.Context, key string) (*CodeOfConduct, *Response, error) {
|
|
||||||
u := fmt.Sprintf("codes_of_conduct/%s", key)
|
|
||||||
req, err := c.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", mediaTypeCodesOfConductPreview)
|
|
||||||
|
|
||||||
coc := new(CodeOfConduct)
|
|
||||||
resp, err := c.Do(ctx, req, coc)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return coc, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// APIMeta represents metadata about the GitHub API.
|
|
||||||
type APIMeta struct {
|
|
||||||
// An Array of IP addresses in CIDR format specifying the addresses
|
|
||||||
// that incoming service hooks will originate from on GitHub.com.
|
|
||||||
Hooks []string `json:"hooks,omitempty"`
|
|
||||||
|
|
||||||
// An Array of IP addresses in CIDR format specifying the Git servers
|
|
||||||
// for GitHub.com.
|
|
||||||
Git []string `json:"git,omitempty"`
|
|
||||||
|
|
||||||
// Whether authentication with username and password is supported.
|
|
||||||
// (GitHub Enterprise instances using CAS or OAuth for authentication
|
|
||||||
// will return false. Features like Basic Authentication with a
|
|
||||||
// username and password, sudo mode, and two-factor authentication are
|
|
||||||
// not supported on these servers.)
|
|
||||||
VerifiablePasswordAuthentication *bool `json:"verifiable_password_authentication,omitempty"`
|
|
||||||
|
|
||||||
// An array of IP addresses in CIDR format specifying the addresses
|
|
||||||
// which serve GitHub Pages websites.
|
|
||||||
Pages []string `json:"pages,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// APIMeta returns information about GitHub.com, the service. Or, if you access
|
|
||||||
// this endpoint on your organization’s GitHub Enterprise installation, this
|
|
||||||
// endpoint provides information about that installation.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/meta/
|
|
||||||
func (c *Client) APIMeta(ctx context.Context) (*APIMeta, *Response, error) {
|
|
||||||
req, err := c.NewRequest("GET", "meta", nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
meta := new(APIMeta)
|
|
||||||
resp, err := c.Do(ctx, req, meta)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return meta, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Octocat returns an ASCII art octocat with the specified message in a speech
|
|
||||||
// bubble. If message is empty, a random zen phrase is used.
|
|
||||||
func (c *Client) Octocat(ctx context.Context, message string) (string, *Response, error) {
|
|
||||||
u := "octocat"
|
|
||||||
if message != "" {
|
|
||||||
u = fmt.Sprintf("%s?s=%s", u, url.QueryEscape(message))
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := c.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
buf := new(bytes.Buffer)
|
|
||||||
resp, err := c.Do(ctx, req, buf)
|
|
||||||
if err != nil {
|
|
||||||
return "", resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return buf.String(), resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zen returns a random line from The Zen of GitHub.
|
|
||||||
//
|
|
||||||
// see also: http://warpspire.com/posts/taste/
|
|
||||||
func (c *Client) Zen(ctx context.Context) (string, *Response, error) {
|
|
||||||
req, err := c.NewRequest("GET", "zen", nil)
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
buf := new(bytes.Buffer)
|
|
||||||
resp, err := c.Do(ctx, req, buf)
|
|
||||||
if err != nil {
|
|
||||||
return "", resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return buf.String(), resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ServiceHook represents a hook that has configuration settings, a list of
|
|
||||||
// available events, and default events.
|
|
||||||
type ServiceHook struct {
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Events []string `json:"events,omitempty"`
|
|
||||||
SupportedEvents []string `json:"supported_events,omitempty"`
|
|
||||||
Schema [][]string `json:"schema,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *ServiceHook) String() string {
|
|
||||||
return Stringify(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListServiceHooks lists all of the available service hooks.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/webhooks/#services
|
|
||||||
func (c *Client) ListServiceHooks(ctx context.Context) ([]*ServiceHook, *Response, error) {
|
|
||||||
u := "hooks"
|
|
||||||
req, err := c.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var hooks []*ServiceHook
|
|
||||||
resp, err := c.Do(ctx, req, &hooks)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return hooks, resp, nil
|
|
||||||
}
|
|
193
vendor/github.com/google/go-github/github/orgs.go
generated
vendored
193
vendor/github.com/google/go-github/github/orgs.go
generated
vendored
@ -1,193 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// OrganizationsService provides access to the organization related functions
|
|
||||||
// in the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/
|
|
||||||
type OrganizationsService service
|
|
||||||
|
|
||||||
// Organization represents a GitHub organization account.
|
|
||||||
type Organization struct {
|
|
||||||
Login *string `json:"login,omitempty"`
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
AvatarURL *string `json:"avatar_url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Company *string `json:"company,omitempty"`
|
|
||||||
Blog *string `json:"blog,omitempty"`
|
|
||||||
Location *string `json:"location,omitempty"`
|
|
||||||
Email *string `json:"email,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
PublicRepos *int `json:"public_repos,omitempty"`
|
|
||||||
PublicGists *int `json:"public_gists,omitempty"`
|
|
||||||
Followers *int `json:"followers,omitempty"`
|
|
||||||
Following *int `json:"following,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
TotalPrivateRepos *int `json:"total_private_repos,omitempty"`
|
|
||||||
OwnedPrivateRepos *int `json:"owned_private_repos,omitempty"`
|
|
||||||
PrivateGists *int `json:"private_gists,omitempty"`
|
|
||||||
DiskUsage *int `json:"disk_usage,omitempty"`
|
|
||||||
Collaborators *int `json:"collaborators,omitempty"`
|
|
||||||
BillingEmail *string `json:"billing_email,omitempty"`
|
|
||||||
Type *string `json:"type,omitempty"`
|
|
||||||
Plan *Plan `json:"plan,omitempty"`
|
|
||||||
|
|
||||||
// API URLs
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
EventsURL *string `json:"events_url,omitempty"`
|
|
||||||
HooksURL *string `json:"hooks_url,omitempty"`
|
|
||||||
IssuesURL *string `json:"issues_url,omitempty"`
|
|
||||||
MembersURL *string `json:"members_url,omitempty"`
|
|
||||||
PublicMembersURL *string `json:"public_members_url,omitempty"`
|
|
||||||
ReposURL *string `json:"repos_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o Organization) String() string {
|
|
||||||
return Stringify(o)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Plan represents the payment plan for an account. See plans at https://github.com/plans.
|
|
||||||
type Plan struct {
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Space *int `json:"space,omitempty"`
|
|
||||||
Collaborators *int `json:"collaborators,omitempty"`
|
|
||||||
PrivateRepos *int `json:"private_repos,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p Plan) String() string {
|
|
||||||
return Stringify(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// OrganizationsListOptions specifies the optional parameters to the
|
|
||||||
// OrganizationsService.ListAll method.
|
|
||||||
type OrganizationsListOptions struct {
|
|
||||||
// Since filters Organizations by ID.
|
|
||||||
Since int `url:"since,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListAll lists all organizations, in the order that they were created on GitHub.
|
|
||||||
//
|
|
||||||
// Note: Pagination is powered exclusively by the since parameter. To continue
|
|
||||||
// listing the next set of organizations, use the ID of the last-returned organization
|
|
||||||
// as the opts.Since parameter for the next call.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/#list-all-organizations
|
|
||||||
func (s *OrganizationsService) ListAll(ctx context.Context, opt *OrganizationsListOptions) ([]*Organization, *Response, error) {
|
|
||||||
u, err := addOptions("organizations", opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
orgs := []*Organization{}
|
|
||||||
resp, err := s.client.Do(ctx, req, &orgs)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return orgs, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// List the organizations for a user. Passing the empty string will list
|
|
||||||
// organizations for the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/#list-user-organizations
|
|
||||||
func (s *OrganizationsService) List(ctx context.Context, user string, opt *ListOptions) ([]*Organization, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if user != "" {
|
|
||||||
u = fmt.Sprintf("users/%v/orgs", user)
|
|
||||||
} else {
|
|
||||||
u = "user/orgs"
|
|
||||||
}
|
|
||||||
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 orgs []*Organization
|
|
||||||
resp, err := s.client.Do(ctx, req, &orgs)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return orgs, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get fetches an organization by name.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/#get-an-organization
|
|
||||||
func (s *OrganizationsService) Get(ctx context.Context, org string) (*Organization, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v", org)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
organization := new(Organization)
|
|
||||||
resp, err := s.client.Do(ctx, req, organization)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return organization, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetByID fetches an organization.
|
|
||||||
//
|
|
||||||
// Note: GetByID uses the undocumented GitHub API endpoint /organizations/:id.
|
|
||||||
func (s *OrganizationsService) GetByID(ctx context.Context, id int) (*Organization, *Response, error) {
|
|
||||||
u := fmt.Sprintf("organizations/%d", id)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
organization := new(Organization)
|
|
||||||
resp, err := s.client.Do(ctx, req, organization)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return organization, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edit an organization.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/#edit-an-organization
|
|
||||||
func (s *OrganizationsService) Edit(ctx context.Context, name string, org *Organization) (*Organization, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v", name)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, org)
|
|
||||||
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
|
|
||||||
}
|
|
107
vendor/github.com/google/go-github/github/orgs_hooks.go
generated
vendored
107
vendor/github.com/google/go-github/github/orgs_hooks.go
generated
vendored
@ -1,107 +0,0 @@
|
|||||||
// Copyright 2015 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ListHooks lists all Hooks for the specified organization.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/hooks/#list-hooks
|
|
||||||
func (s *OrganizationsService) ListHooks(ctx context.Context, org string, opt *ListOptions) ([]*Hook, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/hooks", 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
|
|
||||||
}
|
|
||||||
|
|
||||||
var hooks []*Hook
|
|
||||||
resp, err := s.client.Do(ctx, req, &hooks)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return hooks, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetHook returns a single specified Hook.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/hooks/#get-single-hook
|
|
||||||
func (s *OrganizationsService) GetHook(ctx context.Context, org string, id int) (*Hook, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/hooks/%d", org, id)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
hook := new(Hook)
|
|
||||||
resp, err := s.client.Do(ctx, req, hook)
|
|
||||||
return hook, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateHook creates a Hook for the specified org.
|
|
||||||
// Name and Config are required fields.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/hooks/#create-a-hook
|
|
||||||
func (s *OrganizationsService) CreateHook(ctx context.Context, org string, hook *Hook) (*Hook, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/hooks", org)
|
|
||||||
req, err := s.client.NewRequest("POST", u, hook)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
h := new(Hook)
|
|
||||||
resp, err := s.client.Do(ctx, req, h)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return h, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditHook updates a specified Hook.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/hooks/#edit-a-hook
|
|
||||||
func (s *OrganizationsService) EditHook(ctx context.Context, org string, id int, hook *Hook) (*Hook, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/hooks/%d", org, id)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, hook)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
h := new(Hook)
|
|
||||||
resp, err := s.client.Do(ctx, req, h)
|
|
||||||
return h, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// PingHook triggers a 'ping' event to be sent to the Hook.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/hooks/#ping-a-hook
|
|
||||||
func (s *OrganizationsService) PingHook(ctx context.Context, org string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/hooks/%d/pings", org, id)
|
|
||||||
req, err := s.client.NewRequest("POST", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteHook deletes a specified Hook.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/hooks/#delete-a-hook
|
|
||||||
func (s *OrganizationsService) DeleteHook(ctx context.Context, org string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/hooks/%d", org, id)
|
|
||||||
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/github/orgs_members.go
generated
vendored
299
vendor/github.com/google/go-github/github/orgs_members.go
generated
vendored
@ -1,299 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Membership represents the status of a user's membership in an organization or team.
|
|
||||||
type Membership struct {
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
|
|
||||||
// State is the user's status within the organization or team.
|
|
||||||
// Possible values are: "active", "pending"
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
|
|
||||||
// Role identifies the user's role within the organization or team.
|
|
||||||
// Possible values for organization membership:
|
|
||||||
// member - non-owner organization member
|
|
||||||
// admin - organization owner
|
|
||||||
//
|
|
||||||
// Possible values for team membership 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
|
|
||||||
Role *string `json:"role,omitempty"`
|
|
||||||
|
|
||||||
// For organization membership, the API URL of the organization.
|
|
||||||
OrganizationURL *string `json:"organization_url,omitempty"`
|
|
||||||
|
|
||||||
// For organization membership, the organization the membership is for.
|
|
||||||
Organization *Organization `json:"organization,omitempty"`
|
|
||||||
|
|
||||||
// For organization membership, the user the membership is for.
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m Membership) String() string {
|
|
||||||
return Stringify(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListMembersOptions specifies optional parameters to the
|
|
||||||
// OrganizationsService.ListMembers method.
|
|
||||||
type ListMembersOptions struct {
|
|
||||||
// If true (or if the authenticated user is not an owner of the
|
|
||||||
// organization), list only publicly visible members.
|
|
||||||
PublicOnly bool `url:"-"`
|
|
||||||
|
|
||||||
// Filter members returned in the list. Possible values are:
|
|
||||||
// 2fa_disabled, all. Default is "all".
|
|
||||||
Filter string `url:"filter,omitempty"`
|
|
||||||
|
|
||||||
// Role filters members returned by their role in the organization.
|
|
||||||
// Possible values are:
|
|
||||||
// all - all members of the organization, regardless of role
|
|
||||||
// admin - organization owners
|
|
||||||
// member - non-organization members
|
|
||||||
//
|
|
||||||
// Default is "all".
|
|
||||||
Role string `url:"role,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListMembers lists the members for an organization. If the authenticated
|
|
||||||
// user is an owner of the organization, this will return both concealed and
|
|
||||||
// public members, otherwise it will only return public members.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/members/#members-list
|
|
||||||
func (s *OrganizationsService) ListMembers(ctx context.Context, org string, opt *ListMembersOptions) ([]*User, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if opt != nil && opt.PublicOnly {
|
|
||||||
u = fmt.Sprintf("orgs/%v/public_members", org)
|
|
||||||
} else {
|
|
||||||
u = fmt.Sprintf("orgs/%v/members", 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
|
|
||||||
}
|
|
||||||
|
|
||||||
var members []*User
|
|
||||||
resp, err := s.client.Do(ctx, req, &members)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return members, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsMember checks if a user is a member of an organization.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/members/#check-membership
|
|
||||||
func (s *OrganizationsService) IsMember(ctx context.Context, org, user string) (bool, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/members/%v", org, 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
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *OrganizationsService) IsPublicMember(ctx context.Context, org, user string) (bool, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/public_members/%v", org, 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
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveMember removes a user from all teams of an organization.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/members/#remove-a-member
|
|
||||||
func (s *OrganizationsService) RemoveMember(ctx context.Context, org, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/members/%v", org, user)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicizeMembership publicizes a user's membership in an organization. (A
|
|
||||||
// user cannot publicize the membership for another user.)
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/members/#publicize-a-users-membership
|
|
||||||
func (s *OrganizationsService) PublicizeMembership(ctx context.Context, org, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/public_members/%v", org, user)
|
|
||||||
req, err := s.client.NewRequest("PUT", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ConcealMembership conceals a user's membership in an organization.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/members/#conceal-a-users-membership
|
|
||||||
func (s *OrganizationsService) ConcealMembership(ctx context.Context, org, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/public_members/%v", org, user)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListOrgMembershipsOptions specifies optional parameters to the
|
|
||||||
// OrganizationsService.ListOrgMemberships method.
|
|
||||||
type ListOrgMembershipsOptions struct {
|
|
||||||
// Filter memberships to include only those with the specified state.
|
|
||||||
// Possible values are: "active", "pending".
|
|
||||||
State string `url:"state,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListOrgMemberships lists the organization memberships for the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/members/#list-your-organization-memberships
|
|
||||||
func (s *OrganizationsService) ListOrgMemberships(ctx context.Context, opt *ListOrgMembershipsOptions) ([]*Membership, *Response, error) {
|
|
||||||
u := "user/memberships/orgs"
|
|
||||||
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 memberships []*Membership
|
|
||||||
resp, err := s.client.Do(ctx, req, &memberships)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return memberships, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetOrgMembership gets the membership for a user in a specified organization.
|
|
||||||
// Passing an empty string for user will get the membership for the
|
|
||||||
// authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs:
|
|
||||||
// https://developer.github.com/v3/orgs/members/#get-organization-membership
|
|
||||||
// https://developer.github.com/v3/orgs/members/#get-your-organization-membership
|
|
||||||
func (s *OrganizationsService) GetOrgMembership(ctx context.Context, user, org string) (*Membership, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if user != "" {
|
|
||||||
u = fmt.Sprintf("orgs/%v/memberships/%v", org, user)
|
|
||||||
} else {
|
|
||||||
u = fmt.Sprintf("user/memberships/orgs/%v", org)
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
membership := new(Membership)
|
|
||||||
resp, err := s.client.Do(ctx, req, membership)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return membership, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditOrgMembership edits the membership for user in specified organization.
|
|
||||||
// Passing an empty string for user will edit the membership for the
|
|
||||||
// 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/#edit-your-organization-membership
|
|
||||||
func (s *OrganizationsService) EditOrgMembership(ctx context.Context, user, org string, membership *Membership) (*Membership, *Response, error) {
|
|
||||||
var u, method string
|
|
||||||
if user != "" {
|
|
||||||
u = fmt.Sprintf("orgs/%v/memberships/%v", org, user)
|
|
||||||
method = "PUT"
|
|
||||||
} else {
|
|
||||||
u = fmt.Sprintf("user/memberships/orgs/%v", org)
|
|
||||||
method = "PATCH"
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest(method, u, membership)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
m := new(Membership)
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveOrgMembership removes user from the specified organization. If the
|
|
||||||
// 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
|
|
||||||
func (s *OrganizationsService) RemoveOrgMembership(ctx context.Context, user, org string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/memberships/%v", org, user)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListPendingOrgInvitations returns a list of pending invitations.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/members/#list-pending-organization-invitations
|
|
||||||
func (s *OrganizationsService) ListPendingOrgInvitations(ctx context.Context, org int, opt *ListOptions) ([]*Invitation, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/invitations", 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
|
|
||||||
}
|
|
||||||
|
|
||||||
var pendingInvitations []*Invitation
|
|
||||||
resp, err := s.client.Do(ctx, req, &pendingInvitations)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return pendingInvitations, resp, nil
|
|
||||||
}
|
|
50
vendor/github.com/google/go-github/github/orgs_outside_collaborators.go
generated
vendored
50
vendor/github.com/google/go-github/github/orgs_outside_collaborators.go
generated
vendored
@ -1,50 +0,0 @@
|
|||||||
// Copyright 2017 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ListOutsideCollaboratorsOptions specifies optional parameters to the
|
|
||||||
// OrganizationsService.ListOutsideCollaborators method.
|
|
||||||
type ListOutsideCollaboratorsOptions struct {
|
|
||||||
// Filter outside collaborators returned in the list. Possible values are:
|
|
||||||
// 2fa_disabled, all. Default is "all".
|
|
||||||
Filter string `url:"filter,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListOutsideCollaborators lists outside collaborators of organization's repositories.
|
|
||||||
// This will only work if the authenticated
|
|
||||||
// user is an owner of the organization.
|
|
||||||
//
|
|
||||||
// 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/orgs/outside_collaborators/#list-outside-collaborators
|
|
||||||
func (s *OrganizationsService) ListOutsideCollaborators(ctx context.Context, org string, opt *ListOutsideCollaboratorsOptions) ([]*User, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/outside_collaborators", 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
|
|
||||||
}
|
|
||||||
|
|
||||||
var members []*User
|
|
||||||
resp, err := s.client.Do(ctx, req, &members)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return members, resp, nil
|
|
||||||
}
|
|
60
vendor/github.com/google/go-github/github/orgs_projects.go
generated
vendored
60
vendor/github.com/google/go-github/github/orgs_projects.go
generated
vendored
@ -1,60 +0,0 @@
|
|||||||
// Copyright 2017 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ListProjects lists the projects for an organization.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/projects", 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", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
var projects []*Project
|
|
||||||
resp, err := s.client.Do(ctx, req, &projects)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return projects, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateProject creates a GitHub Project for the specified organization.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/projects", org)
|
|
||||||
req, err := s.client.NewRequest("POST", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
project := &Project{}
|
|
||||||
resp, err := s.client.Do(ctx, req, project)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return project, resp, nil
|
|
||||||
}
|
|
431
vendor/github.com/google/go-github/github/orgs_teams.go
generated
vendored
431
vendor/github.com/google/go-github/github/orgs_teams.go
generated
vendored
@ -1,431 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Team represents a team within a GitHub organization. Teams are used to
|
|
||||||
// manage access to an organization's repositories.
|
|
||||||
type Team struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Slug *string `json:"slug,omitempty"`
|
|
||||||
|
|
||||||
// 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"`
|
|
||||||
|
|
||||||
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"`
|
|
||||||
|
|
||||||
// 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 *int `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"`
|
|
||||||
}
|
|
||||||
|
|
||||||
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/orgs/teams/#list-teams
|
|
||||||
func (s *OrganizationsService) 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
|
|
||||||
}
|
|
||||||
|
|
||||||
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/orgs/teams/#get-team
|
|
||||||
func (s *OrganizationsService) GetTeam(ctx context.Context, team int) (*Team, *Response, error) {
|
|
||||||
u := fmt.Sprintf("teams/%v", team)
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateTeam creates a new team within an organization.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/teams/#create-team
|
|
||||||
func (s *OrganizationsService) CreateTeam(ctx context.Context, org string, team *Team) (*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
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditTeam edits a team.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/teams/#edit-team
|
|
||||||
func (s *OrganizationsService) EditTeam(ctx context.Context, id int, team *Team) (*Team, *Response, error) {
|
|
||||||
u := fmt.Sprintf("teams/%v", id)
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteTeam deletes a team.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/teams/#delete-team
|
|
||||||
func (s *OrganizationsService) DeleteTeam(ctx context.Context, team int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("teams/%v", team)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// OrganizationListTeamMembersOptions specifies the optional parameters to the
|
|
||||||
// OrganizationsService.ListTeamMembers method.
|
|
||||||
type OrganizationListTeamMembersOptions 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/orgs/teams/#list-team-members
|
|
||||||
func (s *OrganizationsService) ListTeamMembers(ctx context.Context, team int, opt *OrganizationListTeamMembersOptions) ([]*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
|
|
||||||
}
|
|
||||||
|
|
||||||
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/orgs/teams/#get-team-member
|
|
||||||
func (s *OrganizationsService) IsTeamMember(ctx context.Context, team int, 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
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListTeamRepos lists the repositories that the specified team has access to.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/teams/#list-team-repos
|
|
||||||
func (s *OrganizationsService) ListTeamRepos(ctx context.Context, team int, 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.
|
|
||||||
req.Header.Set("Accept", mediaTypeTopicsPreview)
|
|
||||||
|
|
||||||
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/orgs/teams/#check-if-a-team-manages-a-repository
|
|
||||||
func (s *OrganizationsService) IsTeamRepo(ctx context.Context, team int, 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
|
|
||||||
}
|
|
||||||
|
|
||||||
req.Header.Set("Accept", mediaTypeOrgPermissionRepo)
|
|
||||||
|
|
||||||
repository := new(Repository)
|
|
||||||
resp, err := s.client.Do(ctx, req, repository)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return repository, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// OrganizationAddTeamRepoOptions specifies the optional parameters to the
|
|
||||||
// OrganizationsService.AddTeamRepo method.
|
|
||||||
type OrganizationAddTeamRepoOptions 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/orgs/teams/#add-team-repo
|
|
||||||
func (s *OrganizationsService) AddTeamRepo(ctx context.Context, team int, owner string, repo string, opt *OrganizationAddTeamRepoOptions) (*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/orgs/teams/#remove-team-repo
|
|
||||||
func (s *OrganizationsService) RemoveTeamRepo(ctx context.Context, team int, 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/orgs/teams/#list-user-teams
|
|
||||||
func (s *OrganizationsService) 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
|
|
||||||
}
|
|
||||||
|
|
||||||
var teams []*Team
|
|
||||||
resp, err := s.client.Do(ctx, req, &teams)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return teams, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetTeamMembership returns the membership status for a user in a team.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/teams/#get-team-membership
|
|
||||||
func (s *OrganizationsService) GetTeamMembership(ctx context.Context, team int, 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
|
|
||||||
}
|
|
||||||
|
|
||||||
t := new(Membership)
|
|
||||||
resp, err := s.client.Do(ctx, req, t)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return t, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// OrganizationAddTeamMembershipOptions does stuff specifies the optional
|
|
||||||
// parameters to the OrganizationsService.AddTeamMembership method.
|
|
||||||
type OrganizationAddTeamMembershipOptions 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/orgs/teams/#add-team-membership
|
|
||||||
func (s *OrganizationsService) AddTeamMembership(ctx context.Context, team int, user string, opt *OrganizationAddTeamMembershipOptions) (*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/orgs/teams/#remove-team-membership
|
|
||||||
func (s *OrganizationsService) RemoveTeamMembership(ctx context.Context, team int, 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/orgs/teams/#list-pending-team-invitations
|
|
||||||
func (s *OrganizationsService) ListPendingTeamInvitations(ctx context.Context, team int, 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
|
|
||||||
}
|
|
91
vendor/github.com/google/go-github/github/orgs_users_blocking.go
generated
vendored
91
vendor/github.com/google/go-github/github/orgs_users_blocking.go
generated
vendored
@ -1,91 +0,0 @@
|
|||||||
// Copyright 2017 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ListBlockedUsers lists all the users blocked by an organization.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/blocking/#list-blocked-users
|
|
||||||
func (s *OrganizationsService) ListBlockedUsers(ctx context.Context, org string, opt *ListOptions) ([]*User, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/blocks", 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", mediaTypeBlockUsersPreview)
|
|
||||||
|
|
||||||
var blockedUsers []*User
|
|
||||||
resp, err := s.client.Do(ctx, req, &blockedUsers)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return blockedUsers, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *OrganizationsService) IsBlocked(ctx context.Context, org string, user string) (bool, *Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/blocks/%v", org, user)
|
|
||||||
|
|
||||||
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", mediaTypeBlockUsersPreview)
|
|
||||||
|
|
||||||
resp, err := s.client.Do(ctx, req, nil)
|
|
||||||
isBlocked, err := parseBoolResponse(err)
|
|
||||||
return isBlocked, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// BlockUser blocks specified user from an organization.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/blocking/#block-a-user
|
|
||||||
func (s *OrganizationsService) BlockUser(ctx context.Context, org string, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/blocks/%v", org, user)
|
|
||||||
|
|
||||||
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", mediaTypeBlockUsersPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnblockUser unblocks specified user from an organization.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/orgs/blocking/#unblock-a-user
|
|
||||||
func (s *OrganizationsService) UnblockUser(ctx context.Context, org string, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("orgs/%v/blocks/%v", org, user)
|
|
||||||
|
|
||||||
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", mediaTypeBlockUsersPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
425
vendor/github.com/google/go-github/github/projects.go
generated
vendored
425
vendor/github.com/google/go-github/github/projects.go
generated
vendored
@ -1,425 +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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ProjectsService provides access to the projects functions in the
|
|
||||||
// GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/
|
|
||||||
type ProjectsService service
|
|
||||||
|
|
||||||
// Project represents a GitHub Project.
|
|
||||||
type Project struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
OwnerURL *string `json:"owner_url,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
Number *int `json:"number,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
|
|
||||||
// The User object that generated the project.
|
|
||||||
Creator *User `json:"creator,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p Project) String() string {
|
|
||||||
return Stringify(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetProject gets a GitHub Project for a repo.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/#get-a-project
|
|
||||||
func (s *ProjectsService) GetProject(ctx context.Context, id int) (*Project, *Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/%v", id)
|
|
||||||
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", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
project := &Project{}
|
|
||||||
resp, err := s.client.Do(ctx, req, project)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return project, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectOptions specifies the parameters to the
|
|
||||||
// RepositoriesService.CreateProject and
|
|
||||||
// ProjectsService.UpdateProject methods.
|
|
||||||
type ProjectOptions struct {
|
|
||||||
// The name of the project. (Required for creation; optional for update.)
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
// The body of the project. (Optional.)
|
|
||||||
Body string `json:"body,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateProject updates a repository project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/#update-a-project
|
|
||||||
func (s *ProjectsService) UpdateProject(ctx context.Context, id int, opt *ProjectOptions) (*Project, *Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/%v", id)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
project := &Project{}
|
|
||||||
resp, err := s.client.Do(ctx, req, project)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return project, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteProject deletes a GitHub Project from a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/#delete-a-project
|
|
||||||
func (s *ProjectsService) DeleteProject(ctx context.Context, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/%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", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectColumn represents a column of a GitHub Project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/projects/
|
|
||||||
type ProjectColumn struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
ProjectURL *string `json:"project_url,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListProjectColumns lists the columns of a GitHub Project for a repo.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/columns/#list-project-columns
|
|
||||||
func (s *ProjectsService) ListProjectColumns(ctx context.Context, projectID int, opt *ListOptions) ([]*ProjectColumn, *Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/%v/columns", projectID)
|
|
||||||
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", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
columns := []*ProjectColumn{}
|
|
||||||
resp, err := s.client.Do(ctx, req, &columns)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return columns, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetProjectColumn gets a column of a GitHub Project for a repo.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/columns/#get-a-project-column
|
|
||||||
func (s *ProjectsService) GetProjectColumn(ctx context.Context, id int) (*ProjectColumn, *Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/columns/%v", id)
|
|
||||||
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", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
column := &ProjectColumn{}
|
|
||||||
resp, err := s.client.Do(ctx, req, column)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return column, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectColumnOptions specifies the parameters to the
|
|
||||||
// ProjectsService.CreateProjectColumn and
|
|
||||||
// ProjectsService.UpdateProjectColumn methods.
|
|
||||||
type ProjectColumnOptions struct {
|
|
||||||
// The name of the project column. (Required for creation and update.)
|
|
||||||
Name string `json:"name"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateProjectColumn creates a column for the specified (by number) project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/columns/#create-a-project-column
|
|
||||||
func (s *ProjectsService) CreateProjectColumn(ctx context.Context, projectID int, opt *ProjectColumnOptions) (*ProjectColumn, *Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/%v/columns", projectID)
|
|
||||||
req, err := s.client.NewRequest("POST", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
column := &ProjectColumn{}
|
|
||||||
resp, err := s.client.Do(ctx, req, column)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return column, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateProjectColumn updates a column of a GitHub Project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/columns/#update-a-project-column
|
|
||||||
func (s *ProjectsService) UpdateProjectColumn(ctx context.Context, columnID int, opt *ProjectColumnOptions) (*ProjectColumn, *Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/columns/%v", columnID)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
column := &ProjectColumn{}
|
|
||||||
resp, err := s.client.Do(ctx, req, column)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return column, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteProjectColumn deletes a column from a GitHub Project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/columns/#delete-a-project-column
|
|
||||||
func (s *ProjectsService) DeleteProjectColumn(ctx context.Context, columnID int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/columns/%v", columnID)
|
|
||||||
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", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectColumnMoveOptions specifies the parameters to the
|
|
||||||
// ProjectsService.MoveProjectColumn method.
|
|
||||||
type ProjectColumnMoveOptions struct {
|
|
||||||
// Position can be one of "first", "last", or "after:<column-id>", where
|
|
||||||
// <column-id> is the ID of a column in the same project. (Required.)
|
|
||||||
Position string `json:"position"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// MoveProjectColumn moves a column within a GitHub Project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/columns/#move-a-project-column
|
|
||||||
func (s *ProjectsService) MoveProjectColumn(ctx context.Context, columnID int, opt *ProjectColumnMoveOptions) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/columns/%v/moves", columnID)
|
|
||||||
req, err := s.client.NewRequest("POST", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectCard represents a card in a column of a GitHub Project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/cards/#get-a-project-card
|
|
||||||
type ProjectCard struct {
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
ColumnURL *string `json:"column_url,omitempty"`
|
|
||||||
ContentURL *string `json:"content_url,omitempty"`
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Note *string `json:"note,omitempty"`
|
|
||||||
Creator *User `json:"creator,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
|
|
||||||
// The following fields are only populated by Webhook events.
|
|
||||||
ColumnID *int `json:"column_id,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListProjectCards lists the cards in a column of a GitHub Project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/cards/#list-project-cards
|
|
||||||
func (s *ProjectsService) ListProjectCards(ctx context.Context, columnID int, opt *ListOptions) ([]*ProjectCard, *Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/columns/%v/cards", columnID)
|
|
||||||
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", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
cards := []*ProjectCard{}
|
|
||||||
resp, err := s.client.Do(ctx, req, &cards)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return cards, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *ProjectsService) GetProjectCard(ctx context.Context, columnID int) (*ProjectCard, *Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/columns/cards/%v", columnID)
|
|
||||||
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", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
card := &ProjectCard{}
|
|
||||||
resp, err := s.client.Do(ctx, req, card)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return card, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectCardOptions specifies the parameters to the
|
|
||||||
// ProjectsService.CreateProjectCard and
|
|
||||||
// ProjectsService.UpdateProjectCard methods.
|
|
||||||
type ProjectCardOptions struct {
|
|
||||||
// The note of the card. Note and ContentID are mutually exclusive.
|
|
||||||
Note string `json:"note,omitempty"`
|
|
||||||
// The ID (not Number) of the Issue to associate with this card.
|
|
||||||
// Note and ContentID are mutually exclusive.
|
|
||||||
ContentID int `json:"content_id,omitempty"`
|
|
||||||
// The type of content to associate with this card. Possible values are: "Issue".
|
|
||||||
ContentType string `json:"content_type,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *ProjectsService) CreateProjectCard(ctx context.Context, columnID int, opt *ProjectCardOptions) (*ProjectCard, *Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/columns/%v/cards", columnID)
|
|
||||||
req, err := s.client.NewRequest("POST", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
card := &ProjectCard{}
|
|
||||||
resp, err := s.client.Do(ctx, req, card)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return card, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateProjectCard updates a card of a GitHub Project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/cards/#update-a-project-card
|
|
||||||
func (s *ProjectsService) UpdateProjectCard(ctx context.Context, cardID int, opt *ProjectCardOptions) (*ProjectCard, *Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/columns/cards/%v", cardID)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
card := &ProjectCard{}
|
|
||||||
resp, err := s.client.Do(ctx, req, card)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return card, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteProjectCard deletes a card from a GitHub Project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/cards/#delete-a-project-card
|
|
||||||
func (s *ProjectsService) DeleteProjectCard(ctx context.Context, cardID int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/columns/cards/%v", cardID)
|
|
||||||
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", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ProjectCardMoveOptions specifies the parameters to the
|
|
||||||
// ProjectsService.MoveProjectCard method.
|
|
||||||
type ProjectCardMoveOptions struct {
|
|
||||||
// Position can be one of "top", "bottom", or "after:<card-id>", where
|
|
||||||
// <card-id> is the ID of a card in the same project.
|
|
||||||
Position string `json:"position"`
|
|
||||||
// ColumnID is the ID of a column in the same project. Note that ColumnID
|
|
||||||
// is required when using Position "after:<card-id>" when that card is in
|
|
||||||
// another column; otherwise it is optional.
|
|
||||||
ColumnID int `json:"column_id,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// MoveProjectCard moves a card within a GitHub Project.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/projects/cards/#move-a-project-card
|
|
||||||
func (s *ProjectsService) MoveProjectCard(ctx context.Context, cardID int, opt *ProjectCardMoveOptions) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("projects/columns/cards/%v/moves", cardID)
|
|
||||||
req, err := s.client.NewRequest("POST", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
356
vendor/github.com/google/go-github/github/pulls.go
generated
vendored
356
vendor/github.com/google/go-github/github/pulls.go
generated
vendored
@ -1,356 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PullRequestsService handles communication with the pull request related
|
|
||||||
// methods of the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/pulls/
|
|
||||||
type PullRequestsService service
|
|
||||||
|
|
||||||
// PullRequest represents a GitHub pull request on a repository.
|
|
||||||
type PullRequest struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Number *int `json:"number,omitempty"`
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
Title *string `json:"title,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
ClosedAt *time.Time `json:"closed_at,omitempty"`
|
|
||||||
MergedAt *time.Time `json:"merged_at,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
Merged *bool `json:"merged,omitempty"`
|
|
||||||
Mergeable *bool `json:"mergeable,omitempty"`
|
|
||||||
MergedBy *User `json:"merged_by,omitempty"`
|
|
||||||
MergeCommitSHA *string `json:"merge_commit_sha,omitempty"`
|
|
||||||
Comments *int `json:"comments,omitempty"`
|
|
||||||
Commits *int `json:"commits,omitempty"`
|
|
||||||
Additions *int `json:"additions,omitempty"`
|
|
||||||
Deletions *int `json:"deletions,omitempty"`
|
|
||||||
ChangedFiles *int `json:"changed_files,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
IssueURL *string `json:"issue_url,omitempty"`
|
|
||||||
StatusesURL *string `json:"statuses_url,omitempty"`
|
|
||||||
DiffURL *string `json:"diff_url,omitempty"`
|
|
||||||
PatchURL *string `json:"patch_url,omitempty"`
|
|
||||||
ReviewCommentsURL *string `json:"review_comments_url,omitempty"`
|
|
||||||
ReviewCommentURL *string `json:"review_comment_url,omitempty"`
|
|
||||||
Assignee *User `json:"assignee,omitempty"`
|
|
||||||
Assignees []*User `json:"assignees,omitempty"`
|
|
||||||
Milestone *Milestone `json:"milestone,omitempty"`
|
|
||||||
MaintainerCanModify *bool `json:"maintainer_can_modify,omitempty"`
|
|
||||||
|
|
||||||
Head *PullRequestBranch `json:"head,omitempty"`
|
|
||||||
Base *PullRequestBranch `json:"base,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p PullRequest) String() string {
|
|
||||||
return Stringify(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestBranch represents a base or head branch in a GitHub pull request.
|
|
||||||
type PullRequestBranch struct {
|
|
||||||
Label *string `json:"label,omitempty"`
|
|
||||||
Ref *string `json:"ref,omitempty"`
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Repo *Repository `json:"repo,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestListOptions specifies the optional parameters to the
|
|
||||||
// PullRequestsService.List method.
|
|
||||||
type PullRequestListOptions struct {
|
|
||||||
// State filters pull requests based on their state. Possible values are:
|
|
||||||
// open, closed. Default is "open".
|
|
||||||
State string `url:"state,omitempty"`
|
|
||||||
|
|
||||||
// Head filters pull requests by head user and branch name in the format of:
|
|
||||||
// "user:ref-name".
|
|
||||||
Head string `url:"head,omitempty"`
|
|
||||||
|
|
||||||
// Base filters pull requests by base branch name.
|
|
||||||
Base string `url:"base,omitempty"`
|
|
||||||
|
|
||||||
// Sort specifies how to sort pull requests. Possible values are: created,
|
|
||||||
// updated, popularity, long-running. Default is "created".
|
|
||||||
Sort string `url:"sort,omitempty"`
|
|
||||||
|
|
||||||
// Direction in which to sort pull requests. Possible values are: asc, desc.
|
|
||||||
// If Sort is "created" or not specified, Default is "desc", otherwise Default
|
|
||||||
// is "asc"
|
|
||||||
Direction string `url:"direction,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// List the pull requests for the specified repository.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls", owner, repo)
|
|
||||||
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 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/pulls/#get-a-single-pull-request
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
pull := new(PullRequest)
|
|
||||||
resp, err := s.client.Do(ctx, req, pull)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return pull, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRaw gets raw (diff or patch) format of a pull request.
|
|
||||||
func (s *PullRequestsService) GetRaw(ctx context.Context, owner string, repo string, number int, opt RawOptions) (string, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d", owner, repo, number)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
switch opt.Type {
|
|
||||||
case Diff:
|
|
||||||
req.Header.Set("Accept", mediaTypeV3Diff)
|
|
||||||
case Patch:
|
|
||||||
req.Header.Set("Accept", mediaTypeV3Patch)
|
|
||||||
default:
|
|
||||||
return "", nil, fmt.Errorf("unsupported raw type %d", opt.Type)
|
|
||||||
}
|
|
||||||
|
|
||||||
ret := new(bytes.Buffer)
|
|
||||||
resp, err := s.client.Do(ctx, req, ret)
|
|
||||||
if err != nil {
|
|
||||||
return "", resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret.String(), resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewPullRequest represents a new pull request to be created.
|
|
||||||
type NewPullRequest struct {
|
|
||||||
Title *string `json:"title,omitempty"`
|
|
||||||
Head *string `json:"head,omitempty"`
|
|
||||||
Base *string `json:"base,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
Issue *int `json:"issue,omitempty"`
|
|
||||||
MaintainerCanModify *bool `json:"maintainer_can_modify,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new pull request on the specified repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/pulls/#create-a-pull-request
|
|
||||||
func (s *PullRequestsService) Create(ctx context.Context, owner string, repo string, pull *NewPullRequest) (*PullRequest, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("POST", u, pull)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
p := new(PullRequest)
|
|
||||||
resp, err := s.client.Do(ctx, req, p)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return p, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type pullRequestUpdate struct {
|
|
||||||
Title *string `json:"title,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
Base *string `json:"base,omitempty"`
|
|
||||||
MaintainerCanModify *bool `json:"maintainer_can_modify,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edit a pull request.
|
|
||||||
// pull must not be nil.
|
|
||||||
//
|
|
||||||
// The following fields are editable: Title, Body, State, Base.Ref and MaintainerCanModify.
|
|
||||||
// Base.Ref updates the base branch of the pull request.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/pulls/#update-a-pull-request
|
|
||||||
func (s *PullRequestsService) Edit(ctx context.Context, owner string, repo string, number int, pull *PullRequest) (*PullRequest, *Response, error) {
|
|
||||||
if pull == nil {
|
|
||||||
return nil, nil, fmt.Errorf("pull must be provided")
|
|
||||||
}
|
|
||||||
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d", owner, repo, number)
|
|
||||||
|
|
||||||
update := &pullRequestUpdate{
|
|
||||||
Title: pull.Title,
|
|
||||||
Body: pull.Body,
|
|
||||||
State: pull.State,
|
|
||||||
MaintainerCanModify: pull.MaintainerCanModify,
|
|
||||||
}
|
|
||||||
if pull.Base != nil {
|
|
||||||
update.Base = pull.Base.Ref
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, update)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
p := new(PullRequest)
|
|
||||||
resp, err := s.client.Do(ctx, req, p)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return p, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListCommits lists the commits in 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d/commits", owner, repo, number)
|
|
||||||
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", mediaTypeGitSigningPreview)
|
|
||||||
|
|
||||||
var commits []*RepositoryCommit
|
|
||||||
resp, err := s.client.Do(ctx, req, &commits)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return commits, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListFiles lists the files in a pull request.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d/files", owner, repo, number)
|
|
||||||
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 commitFiles []*CommitFile
|
|
||||||
resp, err := s.client.Do(ctx, req, &commitFiles)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return commitFiles, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return false, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := s.client.Do(ctx, req, nil)
|
|
||||||
merged, err := parseBoolResponse(err)
|
|
||||||
return merged, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestMergeResult represents the result of merging a pull request.
|
|
||||||
type PullRequestMergeResult struct {
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Merged *bool `json:"merged,omitempty"`
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestOptions lets you define how a pull request will be merged.
|
|
||||||
type PullRequestOptions struct {
|
|
||||||
CommitTitle string // Extra detail to append to automatic commit message. (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.)
|
|
||||||
MergeMethod string
|
|
||||||
}
|
|
||||||
|
|
||||||
type pullRequestMergeRequest struct {
|
|
||||||
CommitMessage string `json:"commit_message"`
|
|
||||||
CommitTitle string `json:"commit_title,omitempty"`
|
|
||||||
MergeMethod string `json:"merge_method,omitempty"`
|
|
||||||
SHA string `json:"sha,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Merge a pull request (Merge Button™).
|
|
||||||
// commitMessage is the title for the automatic commit message.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-buttontrade
|
|
||||||
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)
|
|
||||||
|
|
||||||
pullRequestBody := &pullRequestMergeRequest{CommitMessage: commitMessage}
|
|
||||||
if options != nil {
|
|
||||||
pullRequestBody.CommitTitle = options.CommitTitle
|
|
||||||
pullRequestBody.MergeMethod = options.MergeMethod
|
|
||||||
pullRequestBody.SHA = options.SHA
|
|
||||||
}
|
|
||||||
req, err := s.client.NewRequest("PUT", u, pullRequestBody)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
mergeResult := new(PullRequestMergeResult)
|
|
||||||
resp, err := s.client.Do(ctx, req, mergeResult)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return mergeResult, resp, nil
|
|
||||||
}
|
|
157
vendor/github.com/google/go-github/github/pulls_comments.go
generated
vendored
157
vendor/github.com/google/go-github/github/pulls_comments.go
generated
vendored
@ -1,157 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PullRequestComment represents a comment left on a pull request.
|
|
||||||
type PullRequestComment struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
InReplyTo *int `json:"in_reply_to,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
Path *string `json:"path,omitempty"`
|
|
||||||
DiffHunk *string `json:"diff_hunk,omitempty"`
|
|
||||||
Position *int `json:"position,omitempty"`
|
|
||||||
OriginalPosition *int `json:"original_position,omitempty"`
|
|
||||||
CommitID *string `json:"commit_id,omitempty"`
|
|
||||||
OriginalCommitID *string `json:"original_commit_id,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
Reactions *Reactions `json:"reactions,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
PullRequestURL *string `json:"pull_request_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p PullRequestComment) String() string {
|
|
||||||
return Stringify(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestListCommentsOptions specifies the optional parameters to the
|
|
||||||
// PullRequestsService.ListComments method.
|
|
||||||
type PullRequestListCommentsOptions struct {
|
|
||||||
// Sort specifies how to sort comments. Possible values are: created, updated.
|
|
||||||
Sort string `url:"sort,omitempty"`
|
|
||||||
|
|
||||||
// Direction in which to sort comments. Possible values are: asc, desc.
|
|
||||||
Direction string `url:"direction,omitempty"`
|
|
||||||
|
|
||||||
// Since filters comments by time.
|
|
||||||
Since time.Time `url:"since,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListComments lists all comments on the specified pull request. Specifying a
|
|
||||||
// pull request number of 0 will return all comments on all pull requests for
|
|
||||||
// the repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/pulls/comments/#list-comments-on-a-pull-request
|
|
||||||
func (s *PullRequestsService) ListComments(ctx context.Context, owner string, repo string, number int, opt *PullRequestListCommentsOptions) ([]*PullRequestComment, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if number == 0 {
|
|
||||||
u = fmt.Sprintf("repos/%v/%v/pulls/comments", owner, repo)
|
|
||||||
} else {
|
|
||||||
u = fmt.Sprintf("repos/%v/%v/pulls/%d/comments", owner, repo, number)
|
|
||||||
}
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
var comments []*PullRequestComment
|
|
||||||
resp, err := s.client.Do(ctx, req, &comments)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return comments, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetComment fetches the specified pull request comment.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/pulls/comments/#get-a-single-comment
|
|
||||||
func (s *PullRequestsService) GetComment(ctx context.Context, owner string, repo string, number int) (*PullRequestComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, number)
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
comment := new(PullRequestComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, comment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return comment, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateComment creates a new comment on the specified pull request.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/pulls/comments/#create-a-comment
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("POST", u, comment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c := new(PullRequestComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditComment updates a pull request comment.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/pulls/comments/#edit-a-comment
|
|
||||||
func (s *PullRequestsService) EditComment(ctx context.Context, owner string, repo string, number int, comment *PullRequestComment) (*PullRequestComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, number)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, comment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c := new(PullRequestComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteComment deletes a pull request comment.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/pulls/comments/#delete-a-comment
|
|
||||||
func (s *PullRequestsService) DeleteComment(ctx context.Context, owner string, repo string, number int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, number)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
88
vendor/github.com/google/go-github/github/pulls_reviewers.go
generated
vendored
88
vendor/github.com/google/go-github/github/pulls_reviewers.go
generated
vendored
@ -1,88 +0,0 @@
|
|||||||
// Copyright 2017 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ReviewersRequest specifies users and teams for a pull request review request.
|
|
||||||
type ReviewersRequest struct {
|
|
||||||
Reviewers []string `json:"reviewers,omitempty"`
|
|
||||||
TeamReviewers []string `json:"team_reviewers,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reviewers represents reviewers of a pull request.
|
|
||||||
type Reviewers struct {
|
|
||||||
Users []*User `json:"users,omitempty"`
|
|
||||||
Teams []*Team `json:"teams,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("POST", u, &reviewers)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeTeamReviewPreview)
|
|
||||||
|
|
||||||
r := new(PullRequest)
|
|
||||||
resp, err := s.client.Do(ctx, req, r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return r, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *PullRequestsService) ListReviewers(ctx context.Context, owner, repo string, number int, opt *ListOptions) (*Reviewers, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d/requested_reviewers", owner, repo, number)
|
|
||||||
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", mediaTypeTeamReviewPreview)
|
|
||||||
|
|
||||||
reviewers := new(Reviewers)
|
|
||||||
resp, err := s.client.Do(ctx, req, reviewers)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return reviewers, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, &reviewers)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeTeamReviewPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, reviewers)
|
|
||||||
}
|
|
236
vendor/github.com/google/go-github/github/pulls_reviews.go
generated
vendored
236
vendor/github.com/google/go-github/github/pulls_reviews.go
generated
vendored
@ -1,236 +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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PullRequestReview represents a review of a pull request.
|
|
||||||
type PullRequestReview struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
SubmittedAt *time.Time `json:"submitted_at,omitempty"`
|
|
||||||
CommitID *string `json:"commit_id,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
PullRequestURL *string `json:"pull_request_url,omitempty"`
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p PullRequestReview) String() string {
|
|
||||||
return Stringify(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DraftReviewComment represents a comment part of the review.
|
|
||||||
type DraftReviewComment struct {
|
|
||||||
Path *string `json:"path,omitempty"`
|
|
||||||
Position *int `json:"position,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c DraftReviewComment) String() string {
|
|
||||||
return Stringify(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestReviewRequest represents a request to create a review.
|
|
||||||
type PullRequestReviewRequest struct {
|
|
||||||
CommitID *string `json:"commit_id,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
Event *string `json:"event,omitempty"`
|
|
||||||
Comments []*DraftReviewComment `json:"comments,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r PullRequestReviewRequest) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PullRequestReviewDismissalRequest represents a request to dismiss a review.
|
|
||||||
type PullRequestReviewDismissalRequest struct {
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r PullRequestReviewDismissalRequest) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListReviews lists all reviews on the specified pull request.
|
|
||||||
//
|
|
||||||
// TODO: Follow up with GitHub support about an issue with this method's
|
|
||||||
// returned error format and remove this comment once it's fixed.
|
|
||||||
// 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
|
|
||||||
func (s *PullRequestsService) ListReviews(ctx context.Context, owner, repo string, number int, opt *ListOptions) ([]*PullRequestReview, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews", owner, repo, number)
|
|
||||||
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 reviews []*PullRequestReview
|
|
||||||
resp, err := s.client.Do(ctx, req, &reviews)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return reviews, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetReview fetches the specified pull request review.
|
|
||||||
//
|
|
||||||
// TODO: Follow up with GitHub support about an issue with this method's
|
|
||||||
// returned error format and remove this comment once it's fixed.
|
|
||||||
// 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
|
|
||||||
func (s *PullRequestsService) GetReview(ctx context.Context, owner, repo string, number, reviewID int) (*PullRequestReview, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d", owner, repo, number, reviewID)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
review := new(PullRequestReview)
|
|
||||||
resp, err := s.client.Do(ctx, req, review)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return review, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeletePendingReview deletes the specified pull request pending review.
|
|
||||||
//
|
|
||||||
// TODO: Follow up with GitHub support about an issue with this method's
|
|
||||||
// returned error format and remove this comment once it's fixed.
|
|
||||||
// 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
|
|
||||||
func (s *PullRequestsService) DeletePendingReview(ctx context.Context, owner, repo string, number, reviewID int) (*PullRequestReview, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d", owner, repo, number, reviewID)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
review := new(PullRequestReview)
|
|
||||||
resp, err := s.client.Do(ctx, req, review)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return review, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListReviewComments lists all the comments for the specified review.
|
|
||||||
//
|
|
||||||
// TODO: Follow up with GitHub support about an issue with this method's
|
|
||||||
// returned error format and remove this comment once it's fixed.
|
|
||||||
// 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
|
|
||||||
func (s *PullRequestsService) ListReviewComments(ctx context.Context, owner, repo string, number, reviewID int, opt *ListOptions) ([]*PullRequestComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/comments", owner, repo, number, reviewID)
|
|
||||||
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 comments []*PullRequestComment
|
|
||||||
resp, err := s.client.Do(ctx, req, &comments)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return comments, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateReview creates a new review on the specified pull request.
|
|
||||||
//
|
|
||||||
// TODO: Follow up with GitHub support about an issue with this method's
|
|
||||||
// returned error format and remove this comment once it's fixed.
|
|
||||||
// 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
|
|
||||||
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)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", u, review)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
r := new(PullRequestReview)
|
|
||||||
resp, err := s.client.Do(ctx, req, r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return r, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SubmitReview submits a specified review on the specified pull request.
|
|
||||||
//
|
|
||||||
// TODO: Follow up with GitHub support about an issue with this method's
|
|
||||||
// returned error format and remove this comment once it's fixed.
|
|
||||||
// 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
|
|
||||||
func (s *PullRequestsService) SubmitReview(ctx context.Context, owner, repo string, number, reviewID int, review *PullRequestReviewRequest) (*PullRequestReview, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/events", owner, repo, number, reviewID)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", u, review)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
r := new(PullRequestReview)
|
|
||||||
resp, err := s.client.Do(ctx, req, r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return r, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DismissReview dismisses a specified review on the specified pull request.
|
|
||||||
//
|
|
||||||
// TODO: Follow up with GitHub support about an issue with this method's
|
|
||||||
// returned error format and remove this comment once it's fixed.
|
|
||||||
// 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
|
|
||||||
func (s *PullRequestsService) DismissReview(ctx context.Context, owner, repo string, number, reviewID int, review *PullRequestReviewDismissalRequest) (*PullRequestReview, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/dismissals", owner, repo, number, reviewID)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("PUT", u, review)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
r := new(PullRequestReview)
|
|
||||||
resp, err := s.client.Do(ctx, req, r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return r, resp, nil
|
|
||||||
}
|
|
273
vendor/github.com/google/go-github/github/reactions.go
generated
vendored
273
vendor/github.com/google/go-github/github/reactions.go
generated
vendored
@ -1,273 +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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ReactionsService provides access to the reactions-related functions in the
|
|
||||||
// GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/reactions/
|
|
||||||
type ReactionsService service
|
|
||||||
|
|
||||||
// Reaction represents a GitHub reaction.
|
|
||||||
type Reaction struct {
|
|
||||||
// ID is the Reaction ID.
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
// Content is the type of reaction.
|
|
||||||
// Possible values are:
|
|
||||||
// "+1", "-1", "laugh", "confused", "heart", "hooray".
|
|
||||||
Content *string `json:"content,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reactions represents a summary of GitHub reactions.
|
|
||||||
type Reactions struct {
|
|
||||||
TotalCount *int `json:"total_count,omitempty"`
|
|
||||||
PlusOne *int `json:"+1,omitempty"`
|
|
||||||
MinusOne *int `json:"-1,omitempty"`
|
|
||||||
Laugh *int `json:"laugh,omitempty"`
|
|
||||||
Confused *int `json:"confused,omitempty"`
|
|
||||||
Heart *int `json:"heart,omitempty"`
|
|
||||||
Hooray *int `json:"hooray,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r Reaction) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListCommentReactions lists the 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 int, opt *ListOptions) ([]*Reaction, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id)
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
var m []*Reaction
|
|
||||||
resp, err := s.client.Do(ctx, req, &m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateCommentReaction creates a reaction for a commit comment.
|
|
||||||
// Note that if you have already created a reaction of type content, the
|
|
||||||
// previously created reaction will be returned with Status: 200 OK.
|
|
||||||
//
|
|
||||||
// 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 int, content string) (*Reaction, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id)
|
|
||||||
|
|
||||||
body := &Reaction{Content: String(content)}
|
|
||||||
req, err := s.client.NewRequest("POST", u, body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
m := &Reaction{}
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListIssueReactions lists the 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number)
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
var m []*Reaction
|
|
||||||
resp, err := s.client.Do(ctx, req, &m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateIssueReaction creates a reaction for an issue.
|
|
||||||
// Note that if you have already created a reaction of type content, the
|
|
||||||
// previously created reaction will be returned with Status: 200 OK.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number)
|
|
||||||
|
|
||||||
body := &Reaction{Content: String(content)}
|
|
||||||
req, err := s.client.NewRequest("POST", u, body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
m := &Reaction{}
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListIssueCommentReactions lists the 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 int, opt *ListOptions) ([]*Reaction, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id)
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
var m []*Reaction
|
|
||||||
resp, err := s.client.Do(ctx, req, &m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateIssueCommentReaction creates a reaction for an issue comment.
|
|
||||||
// Note that if you have already created a reaction of type content, the
|
|
||||||
// previously created reaction will be returned with Status: 200 OK.
|
|
||||||
//
|
|
||||||
// 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 int, content string) (*Reaction, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id)
|
|
||||||
|
|
||||||
body := &Reaction{Content: String(content)}
|
|
||||||
req, err := s.client.NewRequest("POST", u, body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
m := &Reaction{}
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *ReactionsService) ListPullRequestCommentReactions(ctx context.Context, owner, repo string, id int, opt *ListOptions) ([]*Reaction, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id)
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
var m []*Reaction
|
|
||||||
resp, err := s.client.Do(ctx, req, &m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreatePullRequestCommentReaction creates a reaction for a pull request review comment.
|
|
||||||
// Note that if you have already created a reaction of type content, the
|
|
||||||
// previously created reaction will be returned with Status: 200 OK.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/reactions/#create-reaction-for-an-issue-comment
|
|
||||||
func (s ReactionsService) CreatePullRequestCommentReaction(ctx context.Context, owner, repo string, id int, content string) (*Reaction, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id)
|
|
||||||
|
|
||||||
body := &Reaction{Content: String(content)}
|
|
||||||
req, err := s.client.NewRequest("POST", u, body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
m := &Reaction{}
|
|
||||||
resp, err := s.client.Do(ctx, req, m)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return m, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteReaction deletes a reaction.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/reaction/reactions/#delete-a-reaction-archive
|
|
||||||
func (s *ReactionsService) DeleteReaction(ctx context.Context, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("reactions/%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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
1023
vendor/github.com/google/go-github/github/repos.go
generated
vendored
1023
vendor/github.com/google/go-github/github/repos.go
generated
vendored
File diff suppressed because it is too large
Load Diff
122
vendor/github.com/google/go-github/github/repos_collaborators.go
generated
vendored
122
vendor/github.com/google/go-github/github/repos_collaborators.go
generated
vendored
@ -1,122 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ListCollaborators lists the GitHub users that have access to the repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/collaborators/#list
|
|
||||||
func (s *RepositoriesService) ListCollaborators(ctx context.Context, owner, repo string, opt *ListOptions) ([]*User, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/collaborators", owner, repo)
|
|
||||||
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 users []*User
|
|
||||||
resp, err := s.client.Do(ctx, req, &users)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return users, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsCollaborator checks whether the specified GitHub user has collaborator
|
|
||||||
// access to the given repo.
|
|
||||||
// Note: This will return false if the user is not a collaborator OR the user
|
|
||||||
// is not a GitHub user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/collaborators/#get
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return false, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
resp, err := s.client.Do(ctx, req, nil)
|
|
||||||
isCollab, err := parseBoolResponse(err)
|
|
||||||
return isCollab, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// RepositoryPermissionLevel represents the permission level an organization
|
|
||||||
// member has for a given repository.
|
|
||||||
type RepositoryPermissionLevel struct {
|
|
||||||
// Possible values: "admin", "write", "read", "none"
|
|
||||||
Permission *string `json:"permission,omitempty"`
|
|
||||||
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
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)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
rpl := new(RepositoryPermissionLevel)
|
|
||||||
resp, err := s.client.Do(ctx, req, rpl)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return rpl, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RepositoryAddCollaboratorOptions specifies the optional parameters to the
|
|
||||||
// RepositoriesService.AddCollaborator method.
|
|
||||||
type RepositoryAddCollaboratorOptions struct {
|
|
||||||
// Permission specifies the permission to grant the user 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
|
|
||||||
//
|
|
||||||
// Default value is "push". This option is only valid for organization-owned repositories.
|
|
||||||
Permission string `json:"permission,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddCollaborator sends an invitation to the specified GitHub user
|
|
||||||
// to become a collaborator to the given repo.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/collaborators/#add-user-as-a-collaborator
|
|
||||||
func (s *RepositoriesService) AddCollaborator(ctx context.Context, owner, repo, user string, opt *RepositoryAddCollaboratorOptions) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user)
|
|
||||||
req, err := s.client.NewRequest("PUT", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeRepositoryInvitationsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/collaborators/#remove-collaborator
|
|
||||||
func (s *RepositoriesService) RemoveCollaborator(ctx context.Context, owner, repo, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
161
vendor/github.com/google/go-github/github/repos_comments.go
generated
vendored
161
vendor/github.com/google/go-github/github/repos_comments.go
generated
vendored
@ -1,161 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RepositoryComment represents a comment for a commit, file, or line in a repository.
|
|
||||||
type RepositoryComment struct {
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
CommitID *string `json:"commit_id,omitempty"`
|
|
||||||
User *User `json:"user,omitempty"`
|
|
||||||
Reactions *Reactions `json:"reactions,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
|
|
||||||
// User-mutable fields
|
|
||||||
Body *string `json:"body"`
|
|
||||||
// User-initialized fields
|
|
||||||
Path *string `json:"path,omitempty"`
|
|
||||||
Position *int `json:"position,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r RepositoryComment) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListComments lists all the comments for the 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/comments", owner, repo)
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
var comments []*RepositoryComment
|
|
||||||
resp, err := s.client.Do(ctx, req, &comments)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return comments, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *RepositoriesService) ListCommitComments(ctx context.Context, owner, repo, sha string, opt *ListOptions) ([]*RepositoryComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/commits/%v/comments", owner, repo, sha)
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
var comments []*RepositoryComment
|
|
||||||
resp, err := s.client.Do(ctx, req, &comments)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return comments, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateComment creates a comment for the given commit.
|
|
||||||
// Note: GitHub allows for comments to be created for non-existing files and positions.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/comments/#create-a-commit-comment
|
|
||||||
func (s *RepositoriesService) CreateComment(ctx context.Context, owner, repo, sha string, comment *RepositoryComment) (*RepositoryComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/commits/%v/comments", owner, repo, sha)
|
|
||||||
req, err := s.client.NewRequest("POST", u, comment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c := new(RepositoryComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetComment gets a single comment from a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/comments/#get-a-single-commit-comment
|
|
||||||
func (s *RepositoriesService) GetComment(ctx context.Context, owner, repo string, id int) (*RepositoryComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/comments/%v", owner, repo, id)
|
|
||||||
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", mediaTypeReactionsPreview)
|
|
||||||
|
|
||||||
c := new(RepositoryComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateComment updates the body of a single comment.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/comments/#update-a-commit-comment
|
|
||||||
func (s *RepositoriesService) UpdateComment(ctx context.Context, owner, repo string, id int, comment *RepositoryComment) (*RepositoryComment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/comments/%v", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, comment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c := new(RepositoryComment)
|
|
||||||
resp, err := s.client.Do(ctx, req, c)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return c, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteComment deletes a single comment from a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/comments/#delete-a-commit-comment
|
|
||||||
func (s *RepositoriesService) DeleteComment(ctx context.Context, owner, repo string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/comments/%v", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
212
vendor/github.com/google/go-github/github/repos_commits.go
generated
vendored
212
vendor/github.com/google/go-github/github/repos_commits.go
generated
vendored
@ -1,212 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RepositoryCommit represents a commit in a repo.
|
|
||||||
// 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".
|
|
||||||
type RepositoryCommit struct {
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Commit *Commit `json:"commit,omitempty"`
|
|
||||||
Author *User `json:"author,omitempty"`
|
|
||||||
Committer *User `json:"committer,omitempty"`
|
|
||||||
Parents []Commit `json:"parents,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_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!
|
|
||||||
Stats *CommitStats `json:"stats,omitempty"`
|
|
||||||
// Details about which files, and how this commit touched. Only filled in during GetCommit!
|
|
||||||
Files []CommitFile `json:"files,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r RepositoryCommit) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommitStats represents the number of additions / deletions from a file in a given RepositoryCommit or GistCommit.
|
|
||||||
type CommitStats struct {
|
|
||||||
Additions *int `json:"additions,omitempty"`
|
|
||||||
Deletions *int `json:"deletions,omitempty"`
|
|
||||||
Total *int `json:"total,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c CommitStats) String() string {
|
|
||||||
return Stringify(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommitFile represents a file modified in a commit.
|
|
||||||
type CommitFile struct {
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Filename *string `json:"filename,omitempty"`
|
|
||||||
Additions *int `json:"additions,omitempty"`
|
|
||||||
Deletions *int `json:"deletions,omitempty"`
|
|
||||||
Changes *int `json:"changes,omitempty"`
|
|
||||||
Status *string `json:"status,omitempty"`
|
|
||||||
Patch *string `json:"patch,omitempty"`
|
|
||||||
BlobURL *string `json:"blob_url,omitempty"`
|
|
||||||
RawURL *string `json:"raw_url,omitempty"`
|
|
||||||
ContentsURL *string `json:"contents_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c CommitFile) String() string {
|
|
||||||
return Stringify(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommitsComparison is the result of comparing two commits.
|
|
||||||
// See CompareCommits() for details.
|
|
||||||
type CommitsComparison struct {
|
|
||||||
BaseCommit *RepositoryCommit `json:"base_commit,omitempty"`
|
|
||||||
MergeBaseCommit *RepositoryCommit `json:"merge_base_commit,omitempty"`
|
|
||||||
|
|
||||||
// Head can be 'behind' or 'ahead'
|
|
||||||
Status *string `json:"status,omitempty"`
|
|
||||||
AheadBy *int `json:"ahead_by,omitempty"`
|
|
||||||
BehindBy *int `json:"behind_by,omitempty"`
|
|
||||||
TotalCommits *int `json:"total_commits,omitempty"`
|
|
||||||
|
|
||||||
Commits []RepositoryCommit `json:"commits,omitempty"`
|
|
||||||
|
|
||||||
Files []CommitFile `json:"files,omitempty"`
|
|
||||||
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
PermalinkURL *string `json:"permalink_url,omitempty"`
|
|
||||||
DiffURL *string `json:"diff_url,omitempty"`
|
|
||||||
PatchURL *string `json:"patch_url,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"` // API URL.
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c CommitsComparison) String() string {
|
|
||||||
return Stringify(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommitsListOptions specifies the optional parameters to the
|
|
||||||
// RepositoriesService.ListCommits method.
|
|
||||||
type CommitsListOptions struct {
|
|
||||||
// SHA or branch to start listing Commits from.
|
|
||||||
SHA string `url:"sha,omitempty"`
|
|
||||||
|
|
||||||
// Path that should be touched by the returned Commits.
|
|
||||||
Path string `url:"path,omitempty"`
|
|
||||||
|
|
||||||
// Author of by which to filter Commits.
|
|
||||||
Author string `url:"author,omitempty"`
|
|
||||||
|
|
||||||
// Since when should Commits be included in the response.
|
|
||||||
Since time.Time `url:"since,omitempty"`
|
|
||||||
|
|
||||||
// Until when should Commits be included in the response.
|
|
||||||
Until time.Time `url:"until,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListCommits lists the commits of a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/commits/#list
|
|
||||||
func (s *RepositoriesService) ListCommits(ctx context.Context, owner, repo string, opt *CommitsListOptions) ([]*RepositoryCommit, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/commits", owner, repo)
|
|
||||||
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", mediaTypeGitSigningPreview)
|
|
||||||
|
|
||||||
var commits []*RepositoryCommit
|
|
||||||
resp, err := s.client.Do(ctx, req, &commits)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return commits, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCommit fetches the specified commit, including all details about it.
|
|
||||||
// todo: support media formats - https://github.com/google/go-github/issues/6
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
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)
|
|
||||||
|
|
||||||
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", mediaTypeGitSigningPreview)
|
|
||||||
|
|
||||||
commit := new(RepositoryCommit)
|
|
||||||
resp, err := s.client.Do(ctx, req, commit)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return commit, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/commits/#get-the-sha-1-of-a-commit-reference
|
|
||||||
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, ref)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return "", nil, err
|
|
||||||
}
|
|
||||||
if lastSHA != "" {
|
|
||||||
req.Header.Set("If-None-Match", `"`+lastSHA+`"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
req.Header.Set("Accept", mediaTypeV3SHA)
|
|
||||||
|
|
||||||
var buf bytes.Buffer
|
|
||||||
resp, err := s.client.Do(ctx, req, &buf)
|
|
||||||
if err != nil {
|
|
||||||
return "", resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return buf.String(), resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareCommits compares a range of commits with each other.
|
|
||||||
// todo: support media formats - https://github.com/google/go-github/issues/6
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/commits/index.html#compare-two-commits
|
|
||||||
func (s *RepositoriesService) CompareCommits(ctx context.Context, owner, repo string, base, head string) (*CommitsComparison, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/compare/%v...%v", owner, repo, base, head)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
comp := new(CommitsComparison)
|
|
||||||
resp, err := s.client.Do(ctx, req, comp)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return comp, resp, nil
|
|
||||||
}
|
|
57
vendor/github.com/google/go-github/github/repos_community_health.go
generated
vendored
57
vendor/github.com/google/go-github/github/repos_community_health.go
generated
vendored
@ -1,57 +0,0 @@
|
|||||||
// Copyright 2017 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Metric represents the different fields for one file in community health files.
|
|
||||||
type Metric struct {
|
|
||||||
Name *string `json:"name"`
|
|
||||||
Key *string `json:"key"`
|
|
||||||
URL *string `json:"url"`
|
|
||||||
HTMLURL *string `json:"html_url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommunityHealthFiles represents the different files in the community health metrics response.
|
|
||||||
type CommunityHealthFiles struct {
|
|
||||||
CodeOfConduct *Metric `json:"code_of_conduct"`
|
|
||||||
Contributing *Metric `json:"contributing"`
|
|
||||||
License *Metric `json:"license"`
|
|
||||||
Readme *Metric `json:"readme"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommunityHealthMetrics represents a response containing the community metrics of a repository.
|
|
||||||
type CommunityHealthMetrics struct {
|
|
||||||
HealthPercentage *int `json:"health_percentage"`
|
|
||||||
Files *CommunityHealthFiles `json:"files"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCommunityHealthMetrics retrieves all the community health metrics for a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/community/#retrieve-community-health-metrics
|
|
||||||
func (s *RepositoriesService) GetCommunityHealthMetrics(ctx context.Context, owner, repo string) (*CommunityHealthMetrics, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/community/profile", owner, repo)
|
|
||||||
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", mediaTypeRepositoryCommunityHealthMetricsPreview)
|
|
||||||
|
|
||||||
metrics := &CommunityHealthMetrics{}
|
|
||||||
resp, err := s.client.Do(ctx, req, metrics)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return metrics, resp, nil
|
|
||||||
}
|
|
266
vendor/github.com/google/go-github/github/repos_contents.go
generated
vendored
266
vendor/github.com/google/go-github/github/repos_contents.go
generated
vendored
@ -1,266 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Repository contents API methods.
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/contents/
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/base64"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
"path"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RepositoryContent represents a file or directory in a github repository.
|
|
||||||
type RepositoryContent struct {
|
|
||||||
Type *string `json:"type,omitempty"`
|
|
||||||
Encoding *string `json:"encoding,omitempty"`
|
|
||||||
Size *int `json:"size,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Path *string `json:"path,omitempty"`
|
|
||||||
// Content contains the actual file content, which may be encoded.
|
|
||||||
// Callers should call GetContent which will decode the content if
|
|
||||||
// necessary.
|
|
||||||
Content *string `json:"content,omitempty"`
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
GitURL *string `json:"git_url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
DownloadURL *string `json:"download_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RepositoryContentResponse holds the parsed response from CreateFile, UpdateFile, and DeleteFile.
|
|
||||||
type RepositoryContentResponse struct {
|
|
||||||
Content *RepositoryContent `json:"content,omitempty"`
|
|
||||||
Commit `json:"commit,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RepositoryContentFileOptions specifies optional parameters for CreateFile, UpdateFile, and DeleteFile.
|
|
||||||
type RepositoryContentFileOptions struct {
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
Content []byte `json:"content,omitempty"` // unencoded
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Branch *string `json:"branch,omitempty"`
|
|
||||||
Author *CommitAuthor `json:"author,omitempty"`
|
|
||||||
Committer *CommitAuthor `json:"committer,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RepositoryContentGetOptions represents an optional ref parameter, which can be a SHA,
|
|
||||||
// branch, or tag
|
|
||||||
type RepositoryContentGetOptions struct {
|
|
||||||
Ref string `url:"ref,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// String converts RepositoryContent to a string. It's primarily for testing.
|
|
||||||
func (r RepositoryContent) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetContent returns the content of r, decoding it if necessary.
|
|
||||||
func (r *RepositoryContent) GetContent() (string, error) {
|
|
||||||
var encoding string
|
|
||||||
if r.Encoding != nil {
|
|
||||||
encoding = *r.Encoding
|
|
||||||
}
|
|
||||||
|
|
||||||
switch encoding {
|
|
||||||
case "base64":
|
|
||||||
c, err := base64.StdEncoding.DecodeString(*r.Content)
|
|
||||||
return string(c), err
|
|
||||||
case "":
|
|
||||||
if r.Content == nil {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
return *r.Content, nil
|
|
||||||
default:
|
|
||||||
return "", fmt.Errorf("unsupported content encoding: %v", encoding)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetReadme gets the Readme file for the repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/contents/#get-the-readme
|
|
||||||
func (s *RepositoriesService) GetReadme(ctx context.Context, owner, repo string, opt *RepositoryContentGetOptions) (*RepositoryContent, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/readme", owner, repo)
|
|
||||||
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
|
|
||||||
}
|
|
||||||
readme := new(RepositoryContent)
|
|
||||||
resp, err := s.client.Do(ctx, req, readme)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return readme, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DownloadContents returns an io.ReadCloser that reads the contents of the
|
|
||||||
// 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
|
|
||||||
// responsibility to close the ReadCloser.
|
|
||||||
func (s *RepositoriesService) DownloadContents(ctx context.Context, owner, repo, filepath string, opt *RepositoryContentGetOptions) (io.ReadCloser, error) {
|
|
||||||
dir := path.Dir(filepath)
|
|
||||||
filename := path.Base(filepath)
|
|
||||||
_, dirContents, _, err := s.GetContents(ctx, owner, repo, dir, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, contents := range dirContents {
|
|
||||||
if *contents.Name == filename {
|
|
||||||
if contents.DownloadURL == nil || *contents.DownloadURL == "" {
|
|
||||||
return nil, fmt.Errorf("No download link found for %s", filepath)
|
|
||||||
}
|
|
||||||
resp, err := s.client.client.Get(*contents.DownloadURL)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return resp.Body, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("No file named %s found in %s", filename, dir)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetContents can return either the metadata and content of a single file
|
|
||||||
// (when path references a file) or the metadata of all the files and/or
|
|
||||||
// subdirectories of a directory (when path references a directory). To make it
|
|
||||||
// easy to distinguish between both result types and to mimic the API as much
|
|
||||||
// as possible, both result types will be returned but only one will contain a
|
|
||||||
// value and the other will be nil.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/contents/#get-contents
|
|
||||||
func (s *RepositoriesService) GetContents(ctx context.Context, owner, repo, path string, opt *RepositoryContentGetOptions) (fileContent *RepositoryContent, directoryContent []*RepositoryContent, resp *Response, err error) {
|
|
||||||
escapedPath := (&url.URL{Path: path}).String()
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, escapedPath)
|
|
||||||
u, err = addOptions(u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, nil, err
|
|
||||||
}
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, nil, err
|
|
||||||
}
|
|
||||||
var rawJSON json.RawMessage
|
|
||||||
resp, err = s.client.Do(ctx, req, &rawJSON)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, resp, err
|
|
||||||
}
|
|
||||||
fileUnmarshalError := json.Unmarshal(rawJSON, &fileContent)
|
|
||||||
if fileUnmarshalError == nil {
|
|
||||||
return fileContent, nil, resp, nil
|
|
||||||
}
|
|
||||||
directoryUnmarshalError := json.Unmarshal(rawJSON, &directoryContent)
|
|
||||||
if directoryUnmarshalError == nil {
|
|
||||||
return nil, directoryContent, resp, nil
|
|
||||||
}
|
|
||||||
return nil, nil, resp, fmt.Errorf("unmarshalling failed for both file and directory content: %s and %s", fileUnmarshalError, directoryUnmarshalError)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFile creates a new file in a repository at the given path and returns
|
|
||||||
// the commit and file metadata.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/contents/#create-a-file
|
|
||||||
func (s *RepositoriesService) CreateFile(ctx context.Context, owner, repo, path string, opt *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path)
|
|
||||||
req, err := s.client.NewRequest("PUT", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
createResponse := new(RepositoryContentResponse)
|
|
||||||
resp, err := s.client.Do(ctx, req, createResponse)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return createResponse, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/contents/#update-a-file
|
|
||||||
func (s *RepositoriesService) UpdateFile(ctx context.Context, owner, repo, path string, opt *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path)
|
|
||||||
req, err := s.client.NewRequest("PUT", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
updateResponse := new(RepositoryContentResponse)
|
|
||||||
resp, err := s.client.Do(ctx, req, updateResponse)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return updateResponse, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteFile deletes a file from a repository and returns the commit.
|
|
||||||
// Requires the blob SHA of the file to be deleted.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
deleteResponse := new(RepositoryContentResponse)
|
|
||||||
resp, err := s.client.Do(ctx, req, deleteResponse)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return deleteResponse, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// archiveFormat is used to define the archive type when calling GetArchiveLink.
|
|
||||||
type archiveFormat string
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Tarball specifies an archive in gzipped tar format.
|
|
||||||
Tarball archiveFormat = "tarball"
|
|
||||||
|
|
||||||
// Zipball specifies an archive in zip format.
|
|
||||||
Zipball archiveFormat = "zipball"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetArchiveLink returns an URL to download a tarball or zipball archive for a
|
|
||||||
// repository. The archiveFormat can be specified by either the github.Tarball
|
|
||||||
// or github.Zipball constant.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/%s", owner, repo, archiveformat)
|
|
||||||
if opt != nil && opt.Ref != "" {
|
|
||||||
u += fmt.Sprintf("/%s", opt.Ref)
|
|
||||||
}
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, 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, nil, err
|
|
||||||
}
|
|
||||||
resp.Body.Close()
|
|
||||||
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
|
|
||||||
}
|
|
222
vendor/github.com/google/go-github/github/repos_deployments.go
generated
vendored
222
vendor/github.com/google/go-github/github/repos_deployments.go
generated
vendored
@ -1,222 +0,0 @@
|
|||||||
// Copyright 2014 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"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Deployment represents a deployment in a repo
|
|
||||||
type Deployment struct {
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Ref *string `json:"ref,omitempty"`
|
|
||||||
Task *string `json:"task,omitempty"`
|
|
||||||
Payload json.RawMessage `json:"payload,omitempty"`
|
|
||||||
Environment *string `json:"environment,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
Creator *User `json:"creator,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"pushed_at,omitempty"`
|
|
||||||
StatusesURL *string `json:"statuses_url,omitempty"`
|
|
||||||
RepositoryURL *string `json:"repository_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeploymentRequest represents a deployment request
|
|
||||||
type DeploymentRequest struct {
|
|
||||||
Ref *string `json:"ref,omitempty"`
|
|
||||||
Task *string `json:"task,omitempty"`
|
|
||||||
AutoMerge *bool `json:"auto_merge,omitempty"`
|
|
||||||
RequiredContexts *[]string `json:"required_contexts,omitempty"`
|
|
||||||
Payload *string `json:"payload,omitempty"`
|
|
||||||
Environment *string `json:"environment,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
TransientEnvironment *bool `json:"transient_environment,omitempty"`
|
|
||||||
ProductionEnvironment *bool `json:"production_environment,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeploymentsListOptions specifies the optional parameters to the
|
|
||||||
// RepositoriesService.ListDeployments method.
|
|
||||||
type DeploymentsListOptions struct {
|
|
||||||
// SHA of the Deployment.
|
|
||||||
SHA string `url:"sha,omitempty"`
|
|
||||||
|
|
||||||
// List deployments for a given ref.
|
|
||||||
Ref string `url:"ref,omitempty"`
|
|
||||||
|
|
||||||
// List deployments for a given task.
|
|
||||||
Task string `url:"task,omitempty"`
|
|
||||||
|
|
||||||
// List deployments for a given environment.
|
|
||||||
Environment string `url:"environment,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListDeployments lists the deployments of a repository.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/deployments", owner, repo)
|
|
||||||
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 deployments []*Deployment
|
|
||||||
resp, err := s.client.Do(ctx, req, &deployments)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return deployments, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetDeployment returns a single deployment of a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/deployments/#get-a-single-deployment
|
|
||||||
func (s *RepositoriesService) GetDeployment(ctx context.Context, owner, repo string, deploymentID int) (*Deployment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/deployments/%v", owner, repo, deploymentID)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
deployment := new(Deployment)
|
|
||||||
resp, err := s.client.Do(ctx, req, deployment)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return deployment, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateDeployment creates a new deployment for a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/deployments/#create-a-deployment
|
|
||||||
func (s *RepositoriesService) CreateDeployment(ctx context.Context, owner, repo string, request *DeploymentRequest) (*Deployment, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/deployments", owner, repo)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", u, request)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when deployment support fully launches
|
|
||||||
req.Header.Set("Accept", mediaTypeDeploymentStatusPreview)
|
|
||||||
|
|
||||||
d := new(Deployment)
|
|
||||||
resp, err := s.client.Do(ctx, req, d)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return d, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeploymentStatus represents the status of a
|
|
||||||
// particular deployment.
|
|
||||||
type DeploymentStatus struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
// State is the deployment state.
|
|
||||||
// Possible values are: "pending", "success", "failure", "error", "inactive".
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
Creator *User `json:"creator,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
TargetURL *string `json:"target_url,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"pushed_at,omitempty"`
|
|
||||||
DeploymentURL *string `json:"deployment_url,omitempty"`
|
|
||||||
RepositoryURL *string `json:"repository_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeploymentStatusRequest represents a deployment request
|
|
||||||
type DeploymentStatusRequest struct {
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
LogURL *string `json:"log_url,omitempty"`
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
EnvironmentURL *string `json:"environment_url,omitempty"`
|
|
||||||
AutoInactive *bool `json:"auto_inactive,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListDeploymentStatuses lists the statuses of a given deployment of a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/deployments/#list-deployment-statuses
|
|
||||||
func (s *RepositoriesService) ListDeploymentStatuses(ctx context.Context, owner, repo string, deployment int, opt *ListOptions) ([]*DeploymentStatus, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/deployments/%v/statuses", owner, repo, deployment)
|
|
||||||
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 statuses []*DeploymentStatus
|
|
||||||
resp, err := s.client.Do(ctx, req, &statuses)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return statuses, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetDeploymentStatus returns a single deployment status of a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/deployments/#get-a-single-deployment-status
|
|
||||||
func (s *RepositoriesService) GetDeploymentStatus(ctx context.Context, owner, repo string, deploymentID, deploymentStatusID int) (*DeploymentStatus, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/deployments/%v/statuses/%v", owner, repo, deploymentID, deploymentStatusID)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when deployment support fully launches
|
|
||||||
req.Header.Set("Accept", mediaTypeDeploymentStatusPreview)
|
|
||||||
|
|
||||||
d := new(DeploymentStatus)
|
|
||||||
resp, err := s.client.Do(ctx, req, d)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return d, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateDeploymentStatus creates a new status for a deployment.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/deployments/#create-a-deployment-status
|
|
||||||
func (s *RepositoriesService) CreateDeploymentStatus(ctx context.Context, owner, repo string, deployment int, request *DeploymentStatusRequest) (*DeploymentStatus, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/deployments/%v/statuses", owner, repo, deployment)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", u, request)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when deployment support fully launches
|
|
||||||
req.Header.Set("Accept", mediaTypeDeploymentStatusPreview)
|
|
||||||
|
|
||||||
d := new(DeploymentStatus)
|
|
||||||
resp, err := s.client.Do(ctx, req, d)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return d, resp, nil
|
|
||||||
}
|
|
85
vendor/github.com/google/go-github/github/repos_forks.go
generated
vendored
85
vendor/github.com/google/go-github/github/repos_forks.go
generated
vendored
@ -1,85 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RepositoryListForksOptions specifies the optional parameters to the
|
|
||||||
// RepositoriesService.ListForks method.
|
|
||||||
type RepositoryListForksOptions struct {
|
|
||||||
// How to sort the forks list. Possible values are: newest, oldest,
|
|
||||||
// watchers. Default is "newest".
|
|
||||||
Sort string `url:"sort,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListForks lists the forks of the specified repository.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/forks", owner, repo)
|
|
||||||
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.
|
|
||||||
req.Header.Set("Accept", mediaTypeTopicsPreview)
|
|
||||||
|
|
||||||
var repos []*Repository
|
|
||||||
resp, err := s.client.Do(ctx, req, &repos)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return repos, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// RepositoryCreateForkOptions specifies the optional parameters to the
|
|
||||||
// RepositoriesService.CreateFork method.
|
|
||||||
type RepositoryCreateForkOptions struct {
|
|
||||||
// The organization to fork the repository into.
|
|
||||||
Organization string `url:"organization,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFork creates a fork of the specified repository.
|
|
||||||
//
|
|
||||||
// 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 is now computing creating the fork 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/repos/forks/#create-a-fork
|
|
||||||
func (s *RepositoriesService) CreateFork(ctx context.Context, owner, repo string, opt *RepositoryCreateForkOptions) (*Repository, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/forks", owner, repo)
|
|
||||||
u, err := addOptions(u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
fork := new(Repository)
|
|
||||||
resp, err := s.client.Do(ctx, req, fork)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return fork, resp, nil
|
|
||||||
}
|
|
192
vendor/github.com/google/go-github/github/repos_hooks.go
generated
vendored
192
vendor/github.com/google/go-github/github/repos_hooks.go
generated
vendored
@ -1,192 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// WebHookPayload represents the data that is received from GitHub when a push
|
|
||||||
// event hook is triggered. The format of these payloads pre-date most of the
|
|
||||||
// GitHub v3 API, so there are lots of minor incompatibilities with the types
|
|
||||||
// defined in the rest of the API. Therefore, several types are duplicated
|
|
||||||
// here to account for these differences.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://help.github.com/articles/post-receive-hooks
|
|
||||||
type WebHookPayload struct {
|
|
||||||
After *string `json:"after,omitempty"`
|
|
||||||
Before *string `json:"before,omitempty"`
|
|
||||||
Commits []WebHookCommit `json:"commits,omitempty"`
|
|
||||||
Compare *string `json:"compare,omitempty"`
|
|
||||||
Created *bool `json:"created,omitempty"`
|
|
||||||
Deleted *bool `json:"deleted,omitempty"`
|
|
||||||
Forced *bool `json:"forced,omitempty"`
|
|
||||||
HeadCommit *WebHookCommit `json:"head_commit,omitempty"`
|
|
||||||
Pusher *User `json:"pusher,omitempty"`
|
|
||||||
Ref *string `json:"ref,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Sender *User `json:"sender,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WebHookPayload) String() string {
|
|
||||||
return Stringify(w)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WebHookCommit represents the commit variant we receive from GitHub in a
|
|
||||||
// WebHookPayload.
|
|
||||||
type WebHookCommit struct {
|
|
||||||
Added []string `json:"added,omitempty"`
|
|
||||||
Author *WebHookAuthor `json:"author,omitempty"`
|
|
||||||
Committer *WebHookAuthor `json:"committer,omitempty"`
|
|
||||||
Distinct *bool `json:"distinct,omitempty"`
|
|
||||||
ID *string `json:"id,omitempty"`
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
Modified []string `json:"modified,omitempty"`
|
|
||||||
Removed []string `json:"removed,omitempty"`
|
|
||||||
Timestamp *time.Time `json:"timestamp,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WebHookCommit) String() string {
|
|
||||||
return Stringify(w)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WebHookAuthor represents the author or committer of a commit, as specified
|
|
||||||
// in a WebHookCommit. The commit author may not correspond to a GitHub User.
|
|
||||||
type WebHookAuthor struct {
|
|
||||||
Email *string `json:"email,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Username *string `json:"username,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WebHookAuthor) String() string {
|
|
||||||
return Stringify(w)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hook represents a GitHub (web and service) hook for a repository.
|
|
||||||
type Hook struct {
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Events []string `json:"events,omitempty"`
|
|
||||||
Active *bool `json:"active,omitempty"`
|
|
||||||
Config map[string]interface{} `json:"config,omitempty"`
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h Hook) String() string {
|
|
||||||
return Stringify(h)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateHook creates a Hook for the specified repository.
|
|
||||||
// Name and Config are required fields.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/hooks/#create-a-hook
|
|
||||||
func (s *RepositoriesService) CreateHook(ctx context.Context, owner, repo string, hook *Hook) (*Hook, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/hooks", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("POST", u, hook)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
h := new(Hook)
|
|
||||||
resp, err := s.client.Do(ctx, req, h)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return h, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListHooks lists all Hooks for the specified repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/hooks/#list
|
|
||||||
func (s *RepositoriesService) ListHooks(ctx context.Context, owner, repo string, opt *ListOptions) ([]*Hook, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/hooks", owner, repo)
|
|
||||||
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 hooks []*Hook
|
|
||||||
resp, err := s.client.Do(ctx, req, &hooks)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return hooks, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetHook returns a single specified Hook.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/hooks/#get-single-hook
|
|
||||||
func (s *RepositoriesService) GetHook(ctx context.Context, owner, repo string, id int) (*Hook, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
hook := new(Hook)
|
|
||||||
resp, err := s.client.Do(ctx, req, hook)
|
|
||||||
return hook, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditHook updates a specified Hook.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/hooks/#edit-a-hook
|
|
||||||
func (s *RepositoriesService) EditHook(ctx context.Context, owner, repo string, id int, hook *Hook) (*Hook, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, hook)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
h := new(Hook)
|
|
||||||
resp, err := s.client.Do(ctx, req, h)
|
|
||||||
return h, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteHook deletes a specified Hook.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/hooks/#delete-a-hook
|
|
||||||
func (s *RepositoriesService) DeleteHook(ctx context.Context, owner, repo string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PingHook triggers a 'ping' event to be sent to the Hook.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/hooks/#ping-a-hook
|
|
||||||
func (s *RepositoriesService) PingHook(ctx context.Context, owner, repo string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/hooks/%d/pings", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("POST", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TestHook triggers a test Hook by github.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/hooks/#test-a-push-hook
|
|
||||||
func (s *RepositoriesService) TestHook(ctx context.Context, owner, repo string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/hooks/%d/tests", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("POST", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
98
vendor/github.com/google/go-github/github/repos_invitations.go
generated
vendored
98
vendor/github.com/google/go-github/github/repos_invitations.go
generated
vendored
@ -1,98 +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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RepositoryInvitation represents an invitation to collaborate on a repo.
|
|
||||||
type RepositoryInvitation struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
Repo *Repository `json:"repository,omitempty"`
|
|
||||||
Invitee *User `json:"invitee,omitempty"`
|
|
||||||
Inviter *User `json:"inviter,omitempty"`
|
|
||||||
|
|
||||||
// Permissions represents the permissions that the associated user will have
|
|
||||||
// on the repository. Possible values are: "read", "write", "admin".
|
|
||||||
Permissions *string `json:"permissions,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListInvitations lists all currently-open repository invitations.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/invitations/#list-invitations-for-a-repository
|
|
||||||
func (s *RepositoriesService) ListInvitations(ctx context.Context, owner, repo string, opt *ListOptions) ([]*RepositoryInvitation, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/invitations", owner, repo)
|
|
||||||
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", mediaTypeRepositoryInvitationsPreview)
|
|
||||||
|
|
||||||
invites := []*RepositoryInvitation{}
|
|
||||||
resp, err := s.client.Do(ctx, req, &invites)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return invites, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteInvitation deletes a repository invitation.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/invitations/#delete-a-repository-invitation
|
|
||||||
func (s *RepositoriesService) DeleteInvitation(ctx context.Context, owner, repo string, invitationID int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/invitations/%v", owner, repo, invitationID)
|
|
||||||
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", mediaTypeRepositoryInvitationsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateInvitation updates the permissions associated with a repository
|
|
||||||
// invitation.
|
|
||||||
//
|
|
||||||
// permissions represents the permissions that the associated user will have
|
|
||||||
// on the repository. Possible values are: "read", "write", "admin".
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/invitations/#update-a-repository-invitation
|
|
||||||
func (s *RepositoriesService) UpdateInvitation(ctx context.Context, owner, repo string, invitationID int, permissions string) (*RepositoryInvitation, *Response, error) {
|
|
||||||
opts := &struct {
|
|
||||||
Permissions string `json:"permissions"`
|
|
||||||
}{Permissions: permissions}
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/invitations/%v", owner, repo, invitationID)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, opts)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeRepositoryInvitationsPreview)
|
|
||||||
|
|
||||||
invite := &RepositoryInvitation{}
|
|
||||||
resp, err := s.client.Do(ctx, req, invite)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return invite, resp, nil
|
|
||||||
}
|
|
111
vendor/github.com/google/go-github/github/repos_keys.go
generated
vendored
111
vendor/github.com/google/go-github/github/repos_keys.go
generated
vendored
@ -1,111 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// The Key type is defined in users_keys.go
|
|
||||||
|
|
||||||
// ListKeys lists the deploy keys for a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/keys/#list
|
|
||||||
func (s *RepositoriesService) ListKeys(ctx context.Context, owner string, repo string, opt *ListOptions) ([]*Key, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/keys", owner, repo)
|
|
||||||
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 keys []*Key
|
|
||||||
resp, err := s.client.Do(ctx, req, &keys)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return keys, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetKey fetches a single deploy key.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/keys/#get
|
|
||||||
func (s *RepositoriesService) GetKey(ctx context.Context, owner string, repo string, id int) (*Key, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
key := new(Key)
|
|
||||||
resp, err := s.client.Do(ctx, req, key)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return key, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateKey adds a deploy key for a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/keys/#create
|
|
||||||
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)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", 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
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 int, 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/keys/#delete
|
|
||||||
func (s *RepositoriesService) DeleteKey(ctx context.Context, owner string, repo string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
38
vendor/github.com/google/go-github/github/repos_merging.go
generated
vendored
38
vendor/github.com/google/go-github/github/repos_merging.go
generated
vendored
@ -1,38 +0,0 @@
|
|||||||
// Copyright 2014 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RepositoryMergeRequest represents a request to merge a branch in a
|
|
||||||
// repository.
|
|
||||||
type RepositoryMergeRequest struct {
|
|
||||||
Base *string `json:"base,omitempty"`
|
|
||||||
Head *string `json:"head,omitempty"`
|
|
||||||
CommitMessage *string `json:"commit_message,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Merge a branch in the specified repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/merging/#perform-a-merge
|
|
||||||
func (s *RepositoriesService) Merge(ctx context.Context, owner, repo string, request *RepositoryMergeRequest) (*RepositoryCommit, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/merges", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("POST", u, request)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
commit := new(RepositoryCommit)
|
|
||||||
resp, err := s.client.Do(ctx, req, commit)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return commit, resp, nil
|
|
||||||
}
|
|
143
vendor/github.com/google/go-github/github/repos_pages.go
generated
vendored
143
vendor/github.com/google/go-github/github/repos_pages.go
generated
vendored
@ -1,143 +0,0 @@
|
|||||||
// Copyright 2014 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Pages represents a GitHub Pages site configuration.
|
|
||||||
type Pages struct {
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Status *string `json:"status,omitempty"`
|
|
||||||
CNAME *string `json:"cname,omitempty"`
|
|
||||||
Custom404 *bool `json:"custom_404,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PagesError represents a build error for a GitHub Pages site.
|
|
||||||
type PagesError struct {
|
|
||||||
Message *string `json:"message,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PagesBuild represents the build information for a GitHub Pages site.
|
|
||||||
type PagesBuild struct {
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Status *string `json:"status,omitempty"`
|
|
||||||
Error *PagesError `json:"error,omitempty"`
|
|
||||||
Pusher *User `json:"pusher,omitempty"`
|
|
||||||
Commit *string `json:"commit,omitempty"`
|
|
||||||
Duration *int `json:"duration,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetPagesInfo fetches information about a GitHub Pages site.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/pages/#get-information-about-a-pages-site
|
|
||||||
func (s *RepositoriesService) GetPagesInfo(ctx context.Context, owner, repo string) (*Pages, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pages", owner, repo)
|
|
||||||
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", mediaTypePagesPreview)
|
|
||||||
|
|
||||||
site := new(Pages)
|
|
||||||
resp, err := s.client.Do(ctx, req, site)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return site, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListPagesBuilds lists the builds for a GitHub Pages site.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/pages/#list-pages-builds
|
|
||||||
func (s *RepositoriesService) ListPagesBuilds(ctx context.Context, owner, repo string, opt *ListOptions) ([]*PagesBuild, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pages/builds", owner, repo)
|
|
||||||
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 pages []*PagesBuild
|
|
||||||
resp, err := s.client.Do(ctx, req, &pages)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return pages, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *RepositoriesService) GetLatestPagesBuild(ctx context.Context, owner, repo string) (*PagesBuild, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pages/builds/latest", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
build := new(PagesBuild)
|
|
||||||
resp, err := s.client.Do(ctx, req, build)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return build, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *RepositoriesService) GetPageBuild(ctx context.Context, owner, repo string, id int) (*PagesBuild, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pages/builds/%v", owner, repo, id)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
build := new(PagesBuild)
|
|
||||||
resp, err := s.client.Do(ctx, req, build)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return build, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *RepositoriesService) RequestPageBuild(ctx context.Context, owner, repo string) (*PagesBuild, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/pages/builds", owner, repo)
|
|
||||||
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", mediaTypePagesPreview)
|
|
||||||
|
|
||||||
build := new(PagesBuild)
|
|
||||||
resp, err := s.client.Do(ctx, req, build)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return build, resp, nil
|
|
||||||
}
|
|
69
vendor/github.com/google/go-github/github/repos_projects.go
generated
vendored
69
vendor/github.com/google/go-github/github/repos_projects.go
generated
vendored
@ -1,69 +0,0 @@
|
|||||||
// Copyright 2017 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ProjectListOptions specifies the optional parameters to the
|
|
||||||
// OrganizationsService.ListProjects and RepositoriesService.ListProjects methods.
|
|
||||||
type ProjectListOptions struct {
|
|
||||||
// Indicates the state of the projects to return. Can be either open, closed, or all. Default: open
|
|
||||||
State string `url:"state,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListProjects lists the projects for a repo.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/projects", owner, repo)
|
|
||||||
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", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
var projects []*Project
|
|
||||||
resp, err := s.client.Do(ctx, req, &projects)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return projects, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateProject creates a GitHub Project for the specified repository.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/projects", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("POST", u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeProjectsPreview)
|
|
||||||
|
|
||||||
project := &Project{}
|
|
||||||
resp, err := s.client.Do(ctx, req, project)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return project, resp, nil
|
|
||||||
}
|
|
327
vendor/github.com/google/go-github/github/repos_releases.go
generated
vendored
327
vendor/github.com/google/go-github/github/repos_releases.go
generated
vendored
@ -1,327 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"mime"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RepositoryRelease represents a GitHub release in a repository.
|
|
||||||
type RepositoryRelease struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
TagName *string `json:"tag_name,omitempty"`
|
|
||||||
TargetCommitish *string `json:"target_commitish,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Body *string `json:"body,omitempty"`
|
|
||||||
Draft *bool `json:"draft,omitempty"`
|
|
||||||
Prerelease *bool `json:"prerelease,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
PublishedAt *Timestamp `json:"published_at,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
AssetsURL *string `json:"assets_url,omitempty"`
|
|
||||||
Assets []ReleaseAsset `json:"assets,omitempty"`
|
|
||||||
UploadURL *string `json:"upload_url,omitempty"`
|
|
||||||
ZipballURL *string `json:"zipball_url,omitempty"`
|
|
||||||
TarballURL *string `json:"tarball_url,omitempty"`
|
|
||||||
Author *User `json:"author,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r RepositoryRelease) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReleaseAsset represents a GitHub release asset in a repository.
|
|
||||||
type ReleaseAsset struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Label *string `json:"label,omitempty"`
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
ContentType *string `json:"content_type,omitempty"`
|
|
||||||
Size *int `json:"size,omitempty"`
|
|
||||||
DownloadCount *int `json:"download_count,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
BrowserDownloadURL *string `json:"browser_download_url,omitempty"`
|
|
||||||
Uploader *User `json:"uploader,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r ReleaseAsset) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListReleases lists the releases for a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository
|
|
||||||
func (s *RepositoriesService) ListReleases(ctx context.Context, owner, repo string, opt *ListOptions) ([]*RepositoryRelease, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases", owner, repo)
|
|
||||||
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 releases []*RepositoryRelease
|
|
||||||
resp, err := s.client.Do(ctx, req, &releases)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return releases, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRelease fetches a single release.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release
|
|
||||||
func (s *RepositoriesService) GetRelease(ctx context.Context, owner, repo string, id int) (*RepositoryRelease, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id)
|
|
||||||
return s.getSingleRelease(ctx, u)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLatestRelease fetches the latest published release for the repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#get-the-latest-release
|
|
||||||
func (s *RepositoriesService) GetLatestRelease(ctx context.Context, owner, repo string) (*RepositoryRelease, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/latest", owner, repo)
|
|
||||||
return s.getSingleRelease(ctx, u)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetReleaseByTag fetches a release with the specified tag.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name
|
|
||||||
func (s *RepositoriesService) GetReleaseByTag(ctx context.Context, owner, repo, tag string) (*RepositoryRelease, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/tags/%s", owner, repo, tag)
|
|
||||||
return s.getSingleRelease(ctx, u)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *RepositoriesService) getSingleRelease(ctx context.Context, url string) (*RepositoryRelease, *Response, error) {
|
|
||||||
req, err := s.client.NewRequest("GET", url, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
release := new(RepositoryRelease)
|
|
||||||
resp, err := s.client.Do(ctx, req, release)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return release, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateRelease adds a new release for a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#create-a-release
|
|
||||||
func (s *RepositoriesService) CreateRelease(ctx context.Context, owner, repo string, release *RepositoryRelease) (*RepositoryRelease, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases", owner, repo)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", u, release)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
r := new(RepositoryRelease)
|
|
||||||
resp, err := s.client.Do(ctx, req, r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return r, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditRelease edits a repository release.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#edit-a-release
|
|
||||||
func (s *RepositoriesService) EditRelease(ctx context.Context, owner, repo string, id int, release *RepositoryRelease) (*RepositoryRelease, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, release)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
r := new(RepositoryRelease)
|
|
||||||
resp, err := s.client.Do(ctx, req, r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return r, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteRelease delete a single release from a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#delete-a-release
|
|
||||||
func (s *RepositoriesService) DeleteRelease(ctx context.Context, owner, repo string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListReleaseAssets lists the release's assets.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#list-assets-for-a-release
|
|
||||||
func (s *RepositoriesService) ListReleaseAssets(ctx context.Context, owner, repo string, id int, opt *ListOptions) ([]*ReleaseAsset, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/%d/assets", owner, repo, id)
|
|
||||||
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 assets []*ReleaseAsset
|
|
||||||
resp, err := s.client.Do(ctx, req, &assets)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return assets, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetReleaseAsset fetches a single release asset.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
|
|
||||||
func (s *RepositoriesService) GetReleaseAsset(ctx context.Context, owner, repo string, id int) (*ReleaseAsset, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
asset := new(ReleaseAsset)
|
|
||||||
resp, err := s.client.Do(ctx, req, asset)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return asset, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DownloadReleaseAsset downloads a release asset or returns a redirect URL.
|
|
||||||
//
|
|
||||||
// DownloadReleaseAsset returns an io.ReadCloser that reads the contents of the
|
|
||||||
// specified release asset. It is the caller's responsibility to close the ReadCloser.
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
|
|
||||||
func (s *RepositoriesService) DownloadReleaseAsset(ctx context.Context, owner, repo string, id int) (rc io.ReadCloser, redirectURL string, err error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
req.Header.Set("Accept", defaultMediaType)
|
|
||||||
|
|
||||||
s.client.clientMu.Lock()
|
|
||||||
defer s.client.clientMu.Unlock()
|
|
||||||
|
|
||||||
var loc string
|
|
||||||
saveRedirect := s.client.client.CheckRedirect
|
|
||||||
s.client.client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
|
|
||||||
loc = req.URL.String()
|
|
||||||
return errors.New("disable redirect")
|
|
||||||
}
|
|
||||||
defer func() { s.client.client.CheckRedirect = saveRedirect }()
|
|
||||||
|
|
||||||
req = withContext(ctx, req)
|
|
||||||
resp, err := s.client.client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
if !strings.Contains(err.Error(), "disable redirect") {
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
return nil, loc, nil // Intentionally return no error with valid redirect URL.
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := CheckResponse(resp); err != nil {
|
|
||||||
resp.Body.Close()
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return resp.Body, "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// EditReleaseAsset edits a repository release asset.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#edit-a-release-asset
|
|
||||||
func (s *RepositoriesService) EditReleaseAsset(ctx context.Context, owner, repo string, id int, release *ReleaseAsset) (*ReleaseAsset, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, release)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
asset := new(ReleaseAsset)
|
|
||||||
resp, err := s.client.Do(ctx, req, asset)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return asset, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteReleaseAsset delete a single release asset from a repository.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/releases/#delete-a-release-asset
|
|
||||||
func (s *RepositoriesService) DeleteReleaseAsset(ctx context.Context, owner, repo string, id int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UploadReleaseAsset creates an asset by uploading a file into a release repository.
|
|
||||||
// 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
|
|
||||||
func (s *RepositoriesService) UploadReleaseAsset(ctx context.Context, owner, repo string, id int, opt *UploadOptions, file *os.File) (*ReleaseAsset, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%s/%s/releases/%d/assets", owner, repo, id)
|
|
||||||
u, err := addOptions(u, opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
stat, err := file.Stat()
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
if stat.IsDir() {
|
|
||||||
return nil, nil, errors.New("the asset to upload can't be a directory")
|
|
||||||
}
|
|
||||||
|
|
||||||
mediaType := mime.TypeByExtension(filepath.Ext(file.Name()))
|
|
||||||
req, err := s.client.NewUploadRequest(u, file, stat.Size(), mediaType)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
asset := new(ReleaseAsset)
|
|
||||||
resp, err := s.client.Do(ctx, req, asset)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
return asset, resp, nil
|
|
||||||
}
|
|
226
vendor/github.com/google/go-github/github/repos_stats.go
generated
vendored
226
vendor/github.com/google/go-github/github/repos_stats.go
generated
vendored
@ -1,226 +0,0 @@
|
|||||||
// Copyright 2014 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ContributorStats represents a contributor to a repository and their
|
|
||||||
// weekly contributions to a given repo.
|
|
||||||
type ContributorStats struct {
|
|
||||||
Author *Contributor `json:"author,omitempty"`
|
|
||||||
Total *int `json:"total,omitempty"`
|
|
||||||
Weeks []WeeklyStats `json:"weeks,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c ContributorStats) String() string {
|
|
||||||
return Stringify(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WeeklyStats represents the number of additions, deletions and commits
|
|
||||||
// a Contributor made in a given week.
|
|
||||||
type WeeklyStats struct {
|
|
||||||
Week *Timestamp `json:"w,omitempty"`
|
|
||||||
Additions *int `json:"a,omitempty"`
|
|
||||||
Deletions *int `json:"d,omitempty"`
|
|
||||||
Commits *int `json:"c,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WeeklyStats) String() string {
|
|
||||||
return Stringify(w)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListContributorsStats gets a repo's contributor list with additions,
|
|
||||||
// deletions and commit counts.
|
|
||||||
//
|
|
||||||
// If this is the first time these statistics are requested for the given
|
|
||||||
// repository, this method will return an *AcceptedError and a status code of
|
|
||||||
// 202. This is because this is the status that GitHub returns to signify that
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/statistics/#contributors
|
|
||||||
func (s *RepositoriesService) ListContributorsStats(ctx context.Context, owner, repo string) ([]*ContributorStats, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/stats/contributors", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var contributorStats []*ContributorStats
|
|
||||||
resp, err := s.client.Do(ctx, req, &contributorStats)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return contributorStats, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// WeeklyCommitActivity represents the weekly commit activity for a repository.
|
|
||||||
// The days array is a group of commits per day, starting on Sunday.
|
|
||||||
type WeeklyCommitActivity struct {
|
|
||||||
Days []int `json:"days,omitempty"`
|
|
||||||
Total *int `json:"total,omitempty"`
|
|
||||||
Week *Timestamp `json:"week,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WeeklyCommitActivity) String() string {
|
|
||||||
return Stringify(w)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListCommitActivity returns the last year of commit activity
|
|
||||||
// grouped by week. The days array is a group of commits per day,
|
|
||||||
// starting on Sunday.
|
|
||||||
//
|
|
||||||
// If this is the first time these statistics are requested for the given
|
|
||||||
// repository, this method will return an *AcceptedError and a status code of
|
|
||||||
// 202. This is because this is the status that GitHub returns to signify that
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/statistics/#commit-activity
|
|
||||||
func (s *RepositoriesService) ListCommitActivity(ctx context.Context, owner, repo string) ([]*WeeklyCommitActivity, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/stats/commit_activity", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var weeklyCommitActivity []*WeeklyCommitActivity
|
|
||||||
resp, err := s.client.Do(ctx, req, &weeklyCommitActivity)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return weeklyCommitActivity, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListCodeFrequency returns a weekly aggregate of the number of additions and
|
|
||||||
// deletions pushed to a repository. Returned WeeklyStats will contain
|
|
||||||
// additions and deletions, but not total commits.
|
|
||||||
//
|
|
||||||
// If this is the first time these statistics are requested for the given
|
|
||||||
// repository, this method will return an *AcceptedError and a status code of
|
|
||||||
// 202. This is because this is the status that GitHub returns to signify that
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/statistics/#code-frequency
|
|
||||||
func (s *RepositoriesService) ListCodeFrequency(ctx context.Context, owner, repo string) ([]*WeeklyStats, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/stats/code_frequency", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var weeks [][]int
|
|
||||||
resp, err := s.client.Do(ctx, req, &weeks)
|
|
||||||
|
|
||||||
// convert int slices into WeeklyStats
|
|
||||||
var stats []*WeeklyStats
|
|
||||||
for _, week := range weeks {
|
|
||||||
if len(week) != 3 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
stat := &WeeklyStats{
|
|
||||||
Week: &Timestamp{time.Unix(int64(week[0]), 0)},
|
|
||||||
Additions: Int(week[1]),
|
|
||||||
Deletions: Int(week[2]),
|
|
||||||
}
|
|
||||||
stats = append(stats, stat)
|
|
||||||
}
|
|
||||||
|
|
||||||
return stats, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// RepositoryParticipation is the number of commits by everyone
|
|
||||||
// who has contributed to the repository (including the owner)
|
|
||||||
// as well as the number of commits by the owner themself.
|
|
||||||
type RepositoryParticipation struct {
|
|
||||||
All []int `json:"all,omitempty"`
|
|
||||||
Owner []int `json:"owner,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r RepositoryParticipation) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListParticipation returns the total commit counts for the 'owner'
|
|
||||||
// and total commit counts in 'all'. 'all' is everyone combined,
|
|
||||||
// including the 'owner' in the last 52 weeks. If you’d like to get
|
|
||||||
// the commit counts for non-owners, you can subtract 'all' from 'owner'.
|
|
||||||
//
|
|
||||||
// The array order is oldest week (index 0) to most recent week.
|
|
||||||
//
|
|
||||||
// If this is the first time these statistics are requested for the given
|
|
||||||
// repository, this method will return an *AcceptedError and a status code of
|
|
||||||
// 202. This is because this is the status that GitHub returns to signify that
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/statistics/#participation
|
|
||||||
func (s *RepositoriesService) ListParticipation(ctx context.Context, owner, repo string) (*RepositoryParticipation, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/stats/participation", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
participation := new(RepositoryParticipation)
|
|
||||||
resp, err := s.client.Do(ctx, req, participation)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return participation, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PunchCard represents the number of commits made during a given hour of a
|
|
||||||
// day of thew eek.
|
|
||||||
type PunchCard struct {
|
|
||||||
Day *int // Day of the week (0-6: =Sunday - Saturday).
|
|
||||||
Hour *int // Hour of day (0-23).
|
|
||||||
Commits *int // Number of commits.
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListPunchCard returns the number of commits per hour in each day.
|
|
||||||
//
|
|
||||||
// If this is the first time these statistics are requested for the given
|
|
||||||
// repository, this method will return an *AcceptedError and a status code of
|
|
||||||
// 202. This is because this is the status that GitHub returns to signify that
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/statistics/#punch-card
|
|
||||||
func (s *RepositoriesService) ListPunchCard(ctx context.Context, owner, repo string) ([]*PunchCard, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/stats/punch_card", owner, repo)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var results [][]int
|
|
||||||
resp, err := s.client.Do(ctx, req, &results)
|
|
||||||
|
|
||||||
// convert int slices into Punchcards
|
|
||||||
var cards []*PunchCard
|
|
||||||
for _, result := range results {
|
|
||||||
if len(result) != 3 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
card := &PunchCard{
|
|
||||||
Day: Int(result[0]),
|
|
||||||
Hour: Int(result[1]),
|
|
||||||
Commits: Int(result[2]),
|
|
||||||
}
|
|
||||||
cards = append(cards, card)
|
|
||||||
}
|
|
||||||
|
|
||||||
return cards, resp, err
|
|
||||||
}
|
|
129
vendor/github.com/google/go-github/github/repos_statuses.go
generated
vendored
129
vendor/github.com/google/go-github/github/repos_statuses.go
generated
vendored
@ -1,129 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// RepoStatus represents the status of a repository at a particular reference.
|
|
||||||
type RepoStatus struct {
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
|
|
||||||
// State is the current state of the repository. Possible values are:
|
|
||||||
// pending, success, error, or failure.
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
|
|
||||||
// TargetURL is the URL of the page representing this status. It will be
|
|
||||||
// linked from the GitHub UI to allow users to see the source of the status.
|
|
||||||
TargetURL *string `json:"target_url,omitempty"`
|
|
||||||
|
|
||||||
// Description is a short high level summary of the status.
|
|
||||||
Description *string `json:"description,omitempty"`
|
|
||||||
|
|
||||||
// A string label to differentiate this status from the statuses of other systems.
|
|
||||||
Context *string `json:"context,omitempty"`
|
|
||||||
|
|
||||||
Creator *User `json:"creator,omitempty"`
|
|
||||||
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r RepoStatus) String() string {
|
|
||||||
return Stringify(r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListStatuses lists the statuses of a repository at the specified
|
|
||||||
// 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
|
|
||||||
func (s *RepositoriesService) ListStatuses(ctx context.Context, owner, repo, ref string, opt *ListOptions) ([]*RepoStatus, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/commits/%v/statuses", owner, repo, ref)
|
|
||||||
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 statuses []*RepoStatus
|
|
||||||
resp, err := s.client.Do(ctx, req, &statuses)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return statuses, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateStatus creates a new status for a repository at the specified
|
|
||||||
// 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
|
|
||||||
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, ref)
|
|
||||||
req, err := s.client.NewRequest("POST", u, status)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
repoStatus := new(RepoStatus)
|
|
||||||
resp, err := s.client.Do(ctx, req, repoStatus)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return repoStatus, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CombinedStatus represents the combined status of a repository at a particular reference.
|
|
||||||
type CombinedStatus struct {
|
|
||||||
// State is the combined state of the repository. Possible values are:
|
|
||||||
// failure, pending, or success.
|
|
||||||
State *string `json:"state,omitempty"`
|
|
||||||
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
TotalCount *int `json:"total_count,omitempty"`
|
|
||||||
Statuses []RepoStatus `json:"statuses,omitempty"`
|
|
||||||
|
|
||||||
CommitURL *string `json:"commit_url,omitempty"`
|
|
||||||
RepositoryURL *string `json:"repository_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s CombinedStatus) String() string {
|
|
||||||
return Stringify(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCombinedStatus returns the combined status of a repository at the specified
|
|
||||||
// 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
|
|
||||||
func (s *RepositoriesService) GetCombinedStatus(ctx context.Context, owner, repo, ref string, opt *ListOptions) (*CombinedStatus, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/commits/%v/status", owner, repo, ref)
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
status := new(CombinedStatus)
|
|
||||||
resp, err := s.client.Do(ctx, req, status)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return status, resp, nil
|
|
||||||
}
|
|
141
vendor/github.com/google/go-github/github/repos_traffic.go
generated
vendored
141
vendor/github.com/google/go-github/github/repos_traffic.go
generated
vendored
@ -1,141 +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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TrafficReferrer represent information about traffic from a referrer .
|
|
||||||
type TrafficReferrer struct {
|
|
||||||
Referrer *string `json:"referrer,omitempty"`
|
|
||||||
Count *int `json:"count,omitempty"`
|
|
||||||
Uniques *int `json:"uniques,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TrafficPath represent information about the traffic on a path of the repo.
|
|
||||||
type TrafficPath struct {
|
|
||||||
Path *string `json:"path,omitempty"`
|
|
||||||
Title *string `json:"title,omitempty"`
|
|
||||||
Count *int `json:"count,omitempty"`
|
|
||||||
Uniques *int `json:"uniques,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TrafficData represent information about a specific timestamp in views or clones list.
|
|
||||||
type TrafficData struct {
|
|
||||||
Timestamp *Timestamp `json:"timestamp,omitempty"`
|
|
||||||
Count *int `json:"count,omitempty"`
|
|
||||||
Uniques *int `json:"uniques,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TrafficViews represent information about the number of views in the last 14 days.
|
|
||||||
type TrafficViews struct {
|
|
||||||
Views []*TrafficData `json:"views,omitempty"`
|
|
||||||
Count *int `json:"count,omitempty"`
|
|
||||||
Uniques *int `json:"uniques,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TrafficClones represent information about the number of clones in the last 14 days.
|
|
||||||
type TrafficClones struct {
|
|
||||||
Clones []*TrafficData `json:"clones,omitempty"`
|
|
||||||
Count *int `json:"count,omitempty"`
|
|
||||||
Uniques *int `json:"uniques,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TrafficBreakdownOptions specifies the parameters to methods that support breakdown per day or week.
|
|
||||||
// Can be one of: day, week. Default: day.
|
|
||||||
type TrafficBreakdownOptions struct {
|
|
||||||
Per string `url:"per,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListTrafficReferrers list the top 10 referrers over the last 14 days.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/traffic/#list-referrers
|
|
||||||
func (s *RepositoriesService) ListTrafficReferrers(ctx context.Context, owner, repo string) ([]*TrafficReferrer, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/traffic/popular/referrers", owner, repo)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var trafficReferrers []*TrafficReferrer
|
|
||||||
resp, err := s.client.Do(ctx, req, &trafficReferrers)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return trafficReferrers, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListTrafficPaths list the top 10 popular content over the last 14 days.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/traffic/#list-paths
|
|
||||||
func (s *RepositoriesService) ListTrafficPaths(ctx context.Context, owner, repo string) ([]*TrafficPath, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/traffic/popular/paths", owner, repo)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var paths []*TrafficPath
|
|
||||||
resp, err := s.client.Do(ctx, req, &paths)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return paths, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *RepositoriesService) ListTrafficViews(ctx context.Context, owner, repo string, opt *TrafficBreakdownOptions) (*TrafficViews, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/traffic/views", owner, repo)
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
trafficViews := new(TrafficViews)
|
|
||||||
resp, err := s.client.Do(ctx, req, &trafficViews)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return trafficViews, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
func (s *RepositoriesService) ListTrafficClones(ctx context.Context, owner, repo string, opt *TrafficBreakdownOptions) (*TrafficClones, *Response, error) {
|
|
||||||
u := fmt.Sprintf("repos/%v/%v/traffic/clones", owner, repo)
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
trafficClones := new(TrafficClones)
|
|
||||||
resp, err := s.client.Do(ctx, req, &trafficClones)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return trafficClones, resp, nil
|
|
||||||
}
|
|
202
vendor/github.com/google/go-github/github/search.go
generated
vendored
202
vendor/github.com/google/go-github/github/search.go
generated
vendored
@ -1,202 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
qs "github.com/google/go-querystring/query"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SearchService provides access to the search related functions
|
|
||||||
// in the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/search/
|
|
||||||
type SearchService service
|
|
||||||
|
|
||||||
// SearchOptions specifies optional parameters to the SearchService methods.
|
|
||||||
type SearchOptions struct {
|
|
||||||
// How to sort the search results. Possible values are:
|
|
||||||
// - for repositories: stars, fork, updated
|
|
||||||
// - for commits: author-date, committer-date
|
|
||||||
// - for code: indexed
|
|
||||||
// - for issues: comments, created, updated
|
|
||||||
// - for users: followers, repositories, joined
|
|
||||||
//
|
|
||||||
// Default is to sort by best match.
|
|
||||||
Sort string `url:"sort,omitempty"`
|
|
||||||
|
|
||||||
// Sort order if sort parameter is provided. Possible values are: asc,
|
|
||||||
// desc. Default is desc.
|
|
||||||
Order string `url:"order,omitempty"`
|
|
||||||
|
|
||||||
// Whether to retrieve text match metadata with a query
|
|
||||||
TextMatch bool `url:"-"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// RepositoriesSearchResult represents the result of a repositories search.
|
|
||||||
type RepositoriesSearchResult struct {
|
|
||||||
Total *int `json:"total_count,omitempty"`
|
|
||||||
IncompleteResults *bool `json:"incomplete_results,omitempty"`
|
|
||||||
Repositories []Repository `json:"items,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Repositories searches repositories via various criteria.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
result := new(RepositoriesSearchResult)
|
|
||||||
resp, err := s.search(ctx, "repositories", query, opt, result)
|
|
||||||
return result, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommitsSearchResult represents the result of a commits search.
|
|
||||||
type CommitsSearchResult struct {
|
|
||||||
Total *int `json:"total_count,omitempty"`
|
|
||||||
IncompleteResults *bool `json:"incomplete_results,omitempty"`
|
|
||||||
Commits []*CommitResult `json:"items,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CommitResult represents a commit object as returned in commit search endpoint response.
|
|
||||||
type CommitResult struct {
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
Commit *Commit `json:"commit,omitempty"`
|
|
||||||
Author *User `json:"author,omitempty"`
|
|
||||||
Committer *User `json:"committer,omitempty"`
|
|
||||||
Parents []*Commit `json:"parents,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
CommentsURL *string `json:"comments_url,omitempty"`
|
|
||||||
|
|
||||||
Repository *Repository `json:"repository,omitempty"`
|
|
||||||
Score *float64 `json:"score,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Commits searches commits via various criteria.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
result := new(CommitsSearchResult)
|
|
||||||
resp, err := s.search(ctx, "commits", query, opt, result)
|
|
||||||
return result, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// IssuesSearchResult represents the result of an issues search.
|
|
||||||
type IssuesSearchResult struct {
|
|
||||||
Total *int `json:"total_count,omitempty"`
|
|
||||||
IncompleteResults *bool `json:"incomplete_results,omitempty"`
|
|
||||||
Issues []Issue `json:"items,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Issues searches issues via various criteria.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/search/#search-issues
|
|
||||||
func (s *SearchService) Issues(ctx context.Context, query string, opt *SearchOptions) (*IssuesSearchResult, *Response, error) {
|
|
||||||
result := new(IssuesSearchResult)
|
|
||||||
resp, err := s.search(ctx, "issues", query, opt, result)
|
|
||||||
return result, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// UsersSearchResult represents the result of a users search.
|
|
||||||
type UsersSearchResult struct {
|
|
||||||
Total *int `json:"total_count,omitempty"`
|
|
||||||
IncompleteResults *bool `json:"incomplete_results,omitempty"`
|
|
||||||
Users []User `json:"items,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Users searches users via various criteria.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
result := new(UsersSearchResult)
|
|
||||||
resp, err := s.search(ctx, "users", query, opt, result)
|
|
||||||
return result, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match represents a single text match.
|
|
||||||
type Match struct {
|
|
||||||
Text *string `json:"text,omitempty"`
|
|
||||||
Indices []int `json:"indices,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TextMatch represents a text match for a SearchResult
|
|
||||||
type TextMatch struct {
|
|
||||||
ObjectURL *string `json:"object_url,omitempty"`
|
|
||||||
ObjectType *string `json:"object_type,omitempty"`
|
|
||||||
Property *string `json:"property,omitempty"`
|
|
||||||
Fragment *string `json:"fragment,omitempty"`
|
|
||||||
Matches []Match `json:"matches,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tm TextMatch) String() string {
|
|
||||||
return Stringify(tm)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CodeSearchResult represents the result of a code search.
|
|
||||||
type CodeSearchResult struct {
|
|
||||||
Total *int `json:"total_count,omitempty"`
|
|
||||||
IncompleteResults *bool `json:"incomplete_results,omitempty"`
|
|
||||||
CodeResults []CodeResult `json:"items,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// CodeResult represents a single search result.
|
|
||||||
type CodeResult struct {
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Path *string `json:"path,omitempty"`
|
|
||||||
SHA *string `json:"sha,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
Repository *Repository `json:"repository,omitempty"`
|
|
||||||
TextMatches []TextMatch `json:"text_matches,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c CodeResult) String() string {
|
|
||||||
return Stringify(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Code searches code via various criteria.
|
|
||||||
//
|
|
||||||
// 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) {
|
|
||||||
result := new(CodeSearchResult)
|
|
||||||
resp, err := s.search(ctx, "code", query, opt, result)
|
|
||||||
return result, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper function that executes search queries against different
|
|
||||||
// GitHub search types (repositories, commits, code, issues, users)
|
|
||||||
func (s *SearchService) search(ctx context.Context, searchType string, query string, opt *SearchOptions, result interface{}) (*Response, error) {
|
|
||||||
params, err := qs.Values(opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
params.Set("q", query)
|
|
||||||
u := fmt.Sprintf("search/%s?%s", searchType, params.Encode())
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case searchType == "commits":
|
|
||||||
// Accept header for search commits preview endpoint
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeCommitSearchPreview)
|
|
||||||
case searchType == "repositories":
|
|
||||||
// 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 opt != nil && opt.TextMatch:
|
|
||||||
// Accept header defaults to "application/vnd.github.v3+json"
|
|
||||||
// We change it here to fetch back text-match metadata
|
|
||||||
req.Header.Set("Accept", "application/vnd.github.v3.text-match+json")
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, result)
|
|
||||||
}
|
|
93
vendor/github.com/google/go-github/github/strings.go
generated
vendored
93
vendor/github.com/google/go-github/github/strings.go
generated
vendored
@ -1,93 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
var timestampType = reflect.TypeOf(Timestamp{})
|
|
||||||
|
|
||||||
// Stringify attempts to create a reasonable string representation of types in
|
|
||||||
// the GitHub library. It does things like resolve pointers to their values
|
|
||||||
// and omits struct fields with nil values.
|
|
||||||
func Stringify(message interface{}) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
v := reflect.ValueOf(message)
|
|
||||||
stringifyValue(&buf, v)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// stringifyValue was heavily inspired by the goprotobuf library.
|
|
||||||
|
|
||||||
func stringifyValue(w io.Writer, val reflect.Value) {
|
|
||||||
if val.Kind() == reflect.Ptr && val.IsNil() {
|
|
||||||
w.Write([]byte("<nil>"))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
v := reflect.Indirect(val)
|
|
||||||
|
|
||||||
switch v.Kind() {
|
|
||||||
case reflect.String:
|
|
||||||
fmt.Fprintf(w, `"%s"`, v)
|
|
||||||
case reflect.Slice:
|
|
||||||
w.Write([]byte{'['})
|
|
||||||
for i := 0; i < v.Len(); i++ {
|
|
||||||
if i > 0 {
|
|
||||||
w.Write([]byte{' '})
|
|
||||||
}
|
|
||||||
|
|
||||||
stringifyValue(w, v.Index(i))
|
|
||||||
}
|
|
||||||
|
|
||||||
w.Write([]byte{']'})
|
|
||||||
return
|
|
||||||
case reflect.Struct:
|
|
||||||
if v.Type().Name() != "" {
|
|
||||||
w.Write([]byte(v.Type().String()))
|
|
||||||
}
|
|
||||||
|
|
||||||
// special handling of Timestamp values
|
|
||||||
if v.Type() == timestampType {
|
|
||||||
fmt.Fprintf(w, "{%s}", v.Interface())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
w.Write([]byte{'{'})
|
|
||||||
|
|
||||||
var sep bool
|
|
||||||
for i := 0; i < v.NumField(); i++ {
|
|
||||||
fv := v.Field(i)
|
|
||||||
if fv.Kind() == reflect.Ptr && fv.IsNil() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if fv.Kind() == reflect.Slice && fv.IsNil() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if sep {
|
|
||||||
w.Write([]byte(", "))
|
|
||||||
} else {
|
|
||||||
sep = true
|
|
||||||
}
|
|
||||||
|
|
||||||
w.Write([]byte(v.Type().Field(i).Name))
|
|
||||||
w.Write([]byte{':'})
|
|
||||||
stringifyValue(w, fv)
|
|
||||||
}
|
|
||||||
|
|
||||||
w.Write([]byte{'}'})
|
|
||||||
default:
|
|
||||||
if v.CanInterface() {
|
|
||||||
fmt.Fprint(w, v.Interface())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
41
vendor/github.com/google/go-github/github/timestamp.go
generated
vendored
41
vendor/github.com/google/go-github/github/timestamp.go
generated
vendored
@ -1,41 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Timestamp represents a time that can be unmarshalled from a JSON string
|
|
||||||
// formatted as either an RFC3339 or Unix timestamp. This is necessary for some
|
|
||||||
// fields since the GitHub API is inconsistent in how it represents times. All
|
|
||||||
// exported methods of time.Time can be called on Timestamp.
|
|
||||||
type Timestamp struct {
|
|
||||||
time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t Timestamp) String() string {
|
|
||||||
return t.Time.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON implements the json.Unmarshaler interface.
|
|
||||||
// Time is expected in RFC3339 or Unix format.
|
|
||||||
func (t *Timestamp) UnmarshalJSON(data []byte) (err error) {
|
|
||||||
str := string(data)
|
|
||||||
i, err := strconv.ParseInt(str, 10, 64)
|
|
||||||
if err == nil {
|
|
||||||
(*t).Time = time.Unix(i, 0)
|
|
||||||
} else {
|
|
||||||
(*t).Time, err = time.Parse(`"`+time.RFC3339+`"`, str)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equal reports whether t and u are equal based on time.Equal
|
|
||||||
func (t Timestamp) Equal(u Timestamp) bool {
|
|
||||||
return t.Time.Equal(u.Time)
|
|
||||||
}
|
|
230
vendor/github.com/google/go-github/github/users.go
generated
vendored
230
vendor/github.com/google/go-github/github/users.go
generated
vendored
@ -1,230 +0,0 @@
|
|||||||
// Copyright 2013 The go-github AUTHORS. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package github
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
// UsersService handles communication with the user related
|
|
||||||
// methods of the GitHub API.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/
|
|
||||||
type UsersService service
|
|
||||||
|
|
||||||
// User represents a GitHub user.
|
|
||||||
type User struct {
|
|
||||||
Login *string `json:"login,omitempty"`
|
|
||||||
ID *int `json:"id,omitempty"`
|
|
||||||
AvatarURL *string `json:"avatar_url,omitempty"`
|
|
||||||
HTMLURL *string `json:"html_url,omitempty"`
|
|
||||||
GravatarID *string `json:"gravatar_id,omitempty"`
|
|
||||||
Name *string `json:"name,omitempty"`
|
|
||||||
Company *string `json:"company,omitempty"`
|
|
||||||
Blog *string `json:"blog,omitempty"`
|
|
||||||
Location *string `json:"location,omitempty"`
|
|
||||||
Email *string `json:"email,omitempty"`
|
|
||||||
Hireable *bool `json:"hireable,omitempty"`
|
|
||||||
Bio *string `json:"bio,omitempty"`
|
|
||||||
PublicRepos *int `json:"public_repos,omitempty"`
|
|
||||||
PublicGists *int `json:"public_gists,omitempty"`
|
|
||||||
Followers *int `json:"followers,omitempty"`
|
|
||||||
Following *int `json:"following,omitempty"`
|
|
||||||
CreatedAt *Timestamp `json:"created_at,omitempty"`
|
|
||||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
|
|
||||||
SuspendedAt *Timestamp `json:"suspended_at,omitempty"`
|
|
||||||
Type *string `json:"type,omitempty"`
|
|
||||||
SiteAdmin *bool `json:"site_admin,omitempty"`
|
|
||||||
TotalPrivateRepos *int `json:"total_private_repos,omitempty"`
|
|
||||||
OwnedPrivateRepos *int `json:"owned_private_repos,omitempty"`
|
|
||||||
PrivateGists *int `json:"private_gists,omitempty"`
|
|
||||||
DiskUsage *int `json:"disk_usage,omitempty"`
|
|
||||||
Collaborators *int `json:"collaborators,omitempty"`
|
|
||||||
Plan *Plan `json:"plan,omitempty"`
|
|
||||||
|
|
||||||
// API URLs
|
|
||||||
URL *string `json:"url,omitempty"`
|
|
||||||
EventsURL *string `json:"events_url,omitempty"`
|
|
||||||
FollowingURL *string `json:"following_url,omitempty"`
|
|
||||||
FollowersURL *string `json:"followers_url,omitempty"`
|
|
||||||
GistsURL *string `json:"gists_url,omitempty"`
|
|
||||||
OrganizationsURL *string `json:"organizations_url,omitempty"`
|
|
||||||
ReceivedEventsURL *string `json:"received_events_url,omitempty"`
|
|
||||||
ReposURL *string `json:"repos_url,omitempty"`
|
|
||||||
StarredURL *string `json:"starred_url,omitempty"`
|
|
||||||
SubscriptionsURL *string `json:"subscriptions_url,omitempty"`
|
|
||||||
|
|
||||||
// TextMatches is only populated from search results that request text matches
|
|
||||||
// See: search.go and https://developer.github.com/v3/search/#text-match-metadata
|
|
||||||
TextMatches []TextMatch `json:"text_matches,omitempty"`
|
|
||||||
|
|
||||||
// Permissions identifies the permissions that a user has on a given
|
|
||||||
// repository. This is only populated when calling Repositories.ListCollaborators.
|
|
||||||
Permissions *map[string]bool `json:"permissions,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u User) String() string {
|
|
||||||
return Stringify(u)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get fetches a user. Passing the empty string will fetch the authenticated
|
|
||||||
// user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/#get-a-single-user
|
|
||||||
func (s *UsersService) Get(ctx context.Context, user string) (*User, *Response, error) {
|
|
||||||
var u string
|
|
||||||
if user != "" {
|
|
||||||
u = fmt.Sprintf("users/%v", user)
|
|
||||||
} else {
|
|
||||||
u = "user"
|
|
||||||
}
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
uResp := new(User)
|
|
||||||
resp, err := s.client.Do(ctx, req, uResp)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return uResp, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetByID fetches a user.
|
|
||||||
//
|
|
||||||
// Note: GetByID uses the undocumented GitHub API endpoint /user/:id.
|
|
||||||
func (s *UsersService) GetByID(ctx context.Context, id int) (*User, *Response, error) {
|
|
||||||
u := fmt.Sprintf("user/%d", id)
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
user := new(User)
|
|
||||||
resp, err := s.client.Do(ctx, req, user)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return user, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edit the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/#update-the-authenticated-user
|
|
||||||
func (s *UsersService) Edit(ctx context.Context, user *User) (*User, *Response, error) {
|
|
||||||
u := "user"
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, user)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
uResp := new(User)
|
|
||||||
resp, err := s.client.Do(ctx, req, uResp)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return uResp, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UserListOptions specifies optional parameters to the UsersService.ListAll
|
|
||||||
// method.
|
|
||||||
type UserListOptions struct {
|
|
||||||
// ID of the last user seen
|
|
||||||
Since int `url:"since,omitempty"`
|
|
||||||
|
|
||||||
ListOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListAll lists all GitHub users.
|
|
||||||
//
|
|
||||||
// To paginate through all users, populate 'Since' with the ID of the last user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/#get-all-users
|
|
||||||
func (s *UsersService) ListAll(ctx context.Context, opt *UserListOptions) ([]*User, *Response, error) {
|
|
||||||
u, err := addOptions("users", opt)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var users []*User
|
|
||||||
resp, err := s.client.Do(ctx, req, &users)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return users, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListInvitations lists all currently-open repository invitations for the
|
|
||||||
// authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/invitations/#list-a-users-repository-invitations
|
|
||||||
func (s *UsersService) ListInvitations(ctx context.Context, opt *ListOptions) ([]*RepositoryInvitation, *Response, error) {
|
|
||||||
u, err := addOptions("user/repository_invitations", 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", mediaTypeRepositoryInvitationsPreview)
|
|
||||||
|
|
||||||
invites := []*RepositoryInvitation{}
|
|
||||||
resp, err := s.client.Do(ctx, req, &invites)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return invites, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// AcceptInvitation accepts the currently-open repository invitation for the
|
|
||||||
// authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/invitations/#accept-a-repository-invitation
|
|
||||||
func (s *UsersService) AcceptInvitation(ctx context.Context, invitationID int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("user/repository_invitations/%v", invitationID)
|
|
||||||
req, err := s.client.NewRequest("PATCH", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove custom Accept header when this API fully launches.
|
|
||||||
req.Header.Set("Accept", mediaTypeRepositoryInvitationsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeclineInvitation declines the currently-open repository invitation for the
|
|
||||||
// authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/repos/invitations/#decline-a-repository-invitation
|
|
||||||
func (s *UsersService) DeclineInvitation(ctx context.Context, invitationID int) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("user/repository_invitations/%v", invitationID)
|
|
||||||
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", mediaTypeRepositoryInvitationsPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
67
vendor/github.com/google/go-github/github/users_administration.go
generated
vendored
67
vendor/github.com/google/go-github/github/users_administration.go
generated
vendored
@ -1,67 +0,0 @@
|
|||||||
// Copyright 2014 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// PromoteSiteAdmin promotes a user to a site administrator of a GitHub Enterprise instance.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/administration/#promote-an-ordinary-user-to-a-site-administrator
|
|
||||||
func (s *UsersService) PromoteSiteAdmin(ctx context.Context, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("users/%v/site_admin", user)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("PUT", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DemoteSiteAdmin demotes a user from site administrator of a GitHub Enterprise instance.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/administration/#demote-a-site-administrator-to-an-ordinary-user
|
|
||||||
func (s *UsersService) DemoteSiteAdmin(ctx context.Context, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("users/%v/site_admin", user)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Suspend a user on a GitHub Enterprise instance.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/administration/#suspend-a-user
|
|
||||||
func (s *UsersService) Suspend(ctx context.Context, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("users/%v/suspended", user)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("PUT", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unsuspend a user on a GitHub Enterprise instance.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/administration/#unsuspend-a-user
|
|
||||||
func (s *UsersService) Unsuspend(ctx context.Context, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("users/%v/suspended", user)
|
|
||||||
|
|
||||||
req, err := s.client.NewRequest("DELETE", u, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
91
vendor/github.com/google/go-github/github/users_blocking.go
generated
vendored
91
vendor/github.com/google/go-github/github/users_blocking.go
generated
vendored
@ -1,91 +0,0 @@
|
|||||||
// Copyright 2017 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ListBlockedUsers lists all the blocked users by the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/blocking/#list-blocked-users
|
|
||||||
func (s *UsersService) ListBlockedUsers(ctx context.Context, opt *ListOptions) ([]*User, *Response, error) {
|
|
||||||
u := "user/blocks"
|
|
||||||
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", mediaTypeBlockUsersPreview)
|
|
||||||
|
|
||||||
var blockedUsers []*User
|
|
||||||
resp, err := s.client.Do(ctx, req, &blockedUsers)
|
|
||||||
if err != nil {
|
|
||||||
return nil, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return blockedUsers, resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsBlocked reports whether specified user is blocked by the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/blocking/#check-whether-youve-blocked-a-user
|
|
||||||
func (s *UsersService) IsBlocked(ctx context.Context, user string) (bool, *Response, error) {
|
|
||||||
u := fmt.Sprintf("user/blocks/%v", user)
|
|
||||||
|
|
||||||
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", mediaTypeBlockUsersPreview)
|
|
||||||
|
|
||||||
resp, err := s.client.Do(ctx, req, nil)
|
|
||||||
isBlocked, err := parseBoolResponse(err)
|
|
||||||
return isBlocked, resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// BlockUser blocks specified user for the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/blocking/#block-a-user
|
|
||||||
func (s *UsersService) BlockUser(ctx context.Context, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("user/blocks/%v", user)
|
|
||||||
|
|
||||||
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", mediaTypeBlockUsersPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnblockUser unblocks specified user for the authenticated user.
|
|
||||||
//
|
|
||||||
// GitHub API docs: https://developer.github.com/v3/users/blocking/#unblock-a-user
|
|
||||||
func (s *UsersService) UnblockUser(ctx context.Context, user string) (*Response, error) {
|
|
||||||
u := fmt.Sprintf("user/blocks/%v", user)
|
|
||||||
|
|
||||||
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", mediaTypeBlockUsersPreview)
|
|
||||||
|
|
||||||
return s.client.Do(ctx, req, nil)
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user